好的,所以我目前正在研究python的内部统计软件包,它主要面向与arcgis地理处理器一起工作的组合,用于建模比较和工具。
无论如何,所以我有一个单独的类来计算统计数据。让我们称之为Stats。现在我的Stats课程已经达到了非常大的程度。它使用由其他统计数据计算的统计数据,计算其他统计数据集等等。这导致了很多私有变量,这些变量只是为了防止重新计算。但是有一些,虽然使用频率很高,但它们通常仅由一个或两个关键的功能部分使用。 (例如,矩阵对角线的总和和概率)。然而它开始成为一个主要的eyeesore,我觉得好像我正在做这个非常错误。
这样糟糕吗?
我被一位同事推荐,只是开始将核心和常用功能放在主要类中,然后简单地使用胶囊,引用主类,并简单地执行他们自己需要的功能。例如。为了计算模型预测的准确性,我会创建一个胶囊,只需要参考父模型,它将卸载所需的所有计算,用于模型预测。
这样的事情真的是个好主意吗?有没有更好的办法?现在我有十几个不同的子统计数据被转储到一个文本文件,以生成一个小的报告。代码库正在增长,如果我可以开始分割越来越多的python类,我会喜欢它。我真的不确定做这样的事情最好的方法是什么。
答案 0 :(得分:1)
我可以想到几个解决方案。一种方法是简单地将值存储在具有如下枚举的数组中:
StatisticType = enum('AveragePerDay','MedianPerDay'...)
另一种方法是使用类似的继承:
class StatisticBase
....
class AveragePerDay ( StatisticBase )
...
class MedianPerDay ( StatisticBase )
...
“太多”没有严格的规则,但是如果折叠后的字段,属性和方法列表长于单个屏幕,那么它可能太大了。
答案 1 :(得分:1)
为什么不为您需要计算的每个统计信息创建一个类,何时统计信息需要其他统计信息,只需将后者的实例传递给计算方法?但是,您的代码和所需功能鲜为人知。也许你可以用更广泛的方式描述,你需要计算什么样的统计数据以及它们如何相互依赖?
无论如何,如果我必须计算某些统计数据,我会立即转向为每个统计数据创建单独的类。当我为python编写代码统计库时,我做过一次。每个统计数据,例如继承类的次数或调用函数的频率,都是一个单独的类。这样每一个都很简单,但我不需要在另一个中使用它们。
答案 2 :(得分:0)
这是一个常见的反模式,一个类变得“太胖”(具有太多的功能和相关的状态),虽然这通常被观察到“基类”(从那里“胖基类”monicker为反模式),它确实可以在没有任何继承的情况下发生。
许多设计模式(简称DP)可以帮助您重新编写代码,将大型,不可测试,不可维护的“胖类”减少到一个很好的协作类包(可以通过“Facade”DP使用以简化):例如,考虑国家,战略,纪念品,代理。
你可以直接攻击这个问题,但我认为,特别是因为你在评论中提到你把它看作一般的课程设计主题,它可能会为你提供一个很好的机会来深入研究非常有用的领域。设计模式,特别是“重构模式”(Fowler的书名很好,虽然它没有涉及特定于Python的问题)。
具体来说,我相信你会主要关注一些结构和行为模式(因为我不认为你对这个用例有很多需要Creational的,除了你的一些昂贵的“懒惰初始化” - 计算仅在某些情况下需要的状态 - 请参阅this wikipedia entry以查找非常详尽的DP列表,并提供分类和链接以进一步解释每个DP。
答案 3 :(得分:0)
由于您询问最佳做法,因此您可能需要查看pylint(http://www.logilab.org/857)。它有很多关于代码风格的好建议,包括与类中有多少私有变量有关的建议。