我应该在一个文件中放入多少个类?

问题描述:

我习惯于Java模型,每个文件可以有一个公共类。 Python没有这个限制,我想知道组织类的最佳做法是什么。我应该在一个文件中放入多少个类?

+5

我认为这是一个合理的*问题*考虑到其他语言的要求和约定,*答案*是“而且它是一个偏好问题(/意见)” - *答案*本身不是一个意见 – d3vid 2016-05-26 13:47:29

一个Python文件被称为“模块”,它是组织软件的一种方式,以使其“有意义”。另一个是名为“包”的目录。

模块是一个独特的东西,可能有一两个紧密相关的类。诀窍是一个模块是你要导入的东西,你需要这个导入对于那些会读取,维护和扩展你的软件的人来说是非常明智的。

规则是这样的:模块是重用单元

您无法轻松重用单个类。您应该可以毫无困难地重用模块。库中的所有内容(以及下载和添加的所有内容)都是模块或模块包。

例如,您正在研究读取电子表格,执行一些计算并将结果加载到数据库中的内容。你想让你的主程序看起来像什么?

from ssReader import Reader 
from theCalcs import ACalc, AnotherCalc 
from theDB import Loader 

def main(sourceFileName): 
    rdr= Reader(sourceFileName) 
    c1= ACalc(options) 
    c2= AnotherCalc(options) 
    ldr= Loader(parameters) 
    for myObj in rdr.readAll(): 
     c1.thisOp(myObj) 
     c2.thatOp(myObj) 
     ldr.laod(myObj) 

将导入看作是在概念或块中组织代码的方式。每个导入中究竟有多少类并不重要。重要的是你用你的import陈述描绘的整个组织。

+16

哈哈,我喜欢引用中的“意义”。 – cdleary 2009-07-07 11:30:45

+21

@cdleary:一个人的感觉是另一个人的疯狂。通常,你可以定义明智的模块。然而,在一个大的应用程序中,总是存在多个分析维度,一个人会将头发分割为另一个人的功能分割和切割。 – 2009-07-07 12:46:10

我会说放置尽可能多的类,可以在逻辑上分组在文件中,而不会太大而复杂。

由于没有人为的限制,它真的取决于什么是可理解的。如果你有一堆相当简短的,按逻辑分组在一起的简单类,可以折腾一堆。如果你有大而复杂的班级或班级,那么这些班级或班级就不适合作为一个群组,每个班级只能有一个文件。或者在中间挑选一些东西。随着事物的改变重构。

这完全取决于项目有多大,类有多长,如果从其他文件中使用它们等等。

例如,我经常使用一系列的数据抽象类 - 所以我可能有4或5类,可能只有1行(class SomeData: pass)。

这将是愚蠢的每一种分成单独的文件 - 但因为他们可以从不同的文件中使用,把所有这些在一个单独的data_model.py文件将是有意义的,所以我可以做from mypackage.data_model import SomeData, SomeSubData

如果您有一个有很多代码的类,也许只有它使用的一些函数,将这个类和辅助函数分割成一个单独的文件是个好主意。

,这样你就from mypackage.database.schema import MyModel,不from mypackage.email.errors import MyDatabaseModel你应该构建他们 - 如果你在哪里有意义进口的东西,文件不长线路的成千上万,你已经正确地组织它。

Python Modules documentation有关于组织软件包的一些有用信息。

我碰巧喜欢Java模型,原因如下。将每个类放在单独的文件中可以在浏览源代码时更容易看到类,从而促进重用。如果你有许多类被分组到一个单独的文件中,其他开发者可能并不清楚那里有哪些类可以通过浏览项目的目录结构来重用。因此,如果你认为你的类可能会被重用,我会把它放在它自己的文件中。

我发现自己分裂的东西,当我厌倦了文件的庞大性,当相关性的理想结构开始出现自然。通常这两个阶段似乎是一致的。

如果您将事情分解得太早,可能会非常烦人,因为您开始意识到需要完全不同的结构排序。

另一方面,当任何.java或.py文件达到超过约700行时,我开始不停地试图记住“那个特定位”在哪里。使用Python/Jython导入语句的循环依赖似乎也扮演着一个角色:如果您尝试将太多合作基础构建块拆分为单独的文件,该语言的“限制”/“不完美”似乎迫使您分组的事情,可能是一个相当明智的方式。至于分解成软件包,我并不真正知道,但我可能会说,同样的烦恼和快乐结构的出现在各个模块级别上都是如此。