程序员应该在一个文件中放多少个类?

时间:2009-01-22 16:44:03

标签: language-agnostic oop file class

在面向对象的语言中,您将类分组到单个文件中的指导原则是什么?你总是给每个班级一个单独的档案吗?你把紧密耦合的课程放在一起吗?您是否曾在一个文件中指定了几个接口实现?你是根据实现可能有多少行代码或者它对类的用户看起来“混乱”的方式来做的?或者用户是否愿意将所有内容放在一个地方?

11 个答案:

答案 0 :(得分:23)

就个人而言,我建议每个文件一个类,除非次要类对文件中的主类是私有的。例如,C#中的嵌套类将保留在父类文件中,但可能在其他地方有用的实用程序类会被分解到它们自己的文件甚至命名空间中。

关键是要了解您的环境以及人们在哪里寻找东西。如果已经建立了既定的方法,那么在你不高兴之前要仔细考虑。如果你的同事希望相关的,紧密绑定的类将在一个文档中,那么必须搜索它们可能很烦人(尽管使用现代IDE它不应该是一个问题)。

将内容分解为更多文件而不是更少文件的另一个原因是版本控制。如果进行小的更改,则应尽可能仅更改小文件。如果你做了彻底的改变,很明显看日志,因为注意到所有受影响的文件(和间接的,类)。

答案 1 :(得分:21)

我认为我用过的所有OO语言的最佳实践是在一个文件中有一个类。我相信有些语言可能需要这个,但我不确定这个事实。但我会说每个文件一个类,以及与类名称匹配的文件名(以及与大多数部分匹配包结构的目录结构)是最佳实践。

答案 2 :(得分:8)

1个类= 2个文件。一个.h和一个.c,你的孩子真是太幸运了。)

答案 3 :(得分:5)

必须始终遵循严格的规则(除非特定语言强制执行)。只有一个类或在文件中有多个类是有充分理由的。它确实取决于语言。

在C#和Java中,人们倾向于坚持每个类一个文件。

我会说在C ++中虽然我经常在一个文件中放置多个类。这些课程通常很小而且非常相关。例如。某些通信协议中每个消息的一个类。在这种情况下,每个文件的文件意味着很多文件,实际上维护和阅读代码比在一个文件中更难。

在C ++中,类的实现与类定义是分开的,因此每个类{/ body /}都小于其他语言,这意味着类的大小更方便,可以将它们组合在一起一个档案。

在C ++中,如果您正在编写库(例如标准模板库),则可以将所有类放在一个文件中。用户只需要包含一个头文件,然后就可以获得所有类,因此更容易使用它们。

有一个平衡点。答案是最容易理解和维护的东西。默认情况下,每个文件都有一个类是有意义的,但是如果在一个文件中定义了一组相关的类,那么在很多情况下使用它们更为实际。

答案 4 :(得分:3)

如果出于技术或美学原因,我将类放入同一个文件中。例如,在提供插件接口的应用程序中,类插件(插件的基类)和 PluginManager 我通常会将它们放在同一个文件中。但是,如果文件对我来说太大了,我会将它们分成单独的文件。

我注意到我目前主要用Python编写代码,这会影响我的设计。 Python在如何将内容划分为模块方面非常灵活,并且具有管理事物名称空间的良好工具。例如,我通常将应用程序的所有代码放在Python模块(具有__init__.py的目录)中,并使模块从子模块导入特定的名称。然后,API就像applib.PluginManager而不是applib.pluginstuff.PluginManager

这样可以很容易地移动东西,这也让我在创建设计时不会那么挑剔:我可以随时解决问题。

答案 5 :(得分:2)

一个类=一个文件。总是。除了当一个类= C#中的多个文件,或者一个类当然包含内部类等;)

答案 6 :(得分:2)

每个文件一个是我们的标准。唯一的例外是,对于一个类和它的类型集合,我们把它们放在一起。

随着时间的推移,我开始意识到,“小班级”总是趋于成长。然后你会想要将它们分开,让团队中的其他人(以及你自己)感到困惑。

答案 7 :(得分:2)

我尝试为每个文件保留一个类(如上所述),除非它们是小类。如果有很多,我可能会将它们分成主题。但通常我只是将它们全部保存在一个文件中,并在编辑器中进行代码折叠。对于我的私人黑客来说,这对我来说是不值得的(最小的)努力。

答案 8 :(得分:1)

每个文件一个类似乎是标准。这也是我通常也这样做的方式。

有几次我偏离了这一点。特别是当较小的类是另一个类的成员时。例如,在设计数据结构时,我可能会在与“bigstructure”类相同的文件中实现“节点”类。

答案 9 :(得分:0)

  

在面向对象的语言中,您将类分组到单个文件中的准则是什么?

这取决于。在团队合作中,我努力遵循团队标准;在单独工作中,我更倾向于任何我喜欢的事。

在单独工作中,然后......

  

你总是给每个班级一个单独的档案吗?你把紧密耦合的课程放在一起吗?您是否曾在一个文件中指定了几个接口实现?

没有。有时。是。

  

你是根据实现可能有多少行代码或者它对类的用户看起来“混乱”的方式来做的?或者用户是否愿意将所有内容放在一个地方?

主要基于:

  • 导航有多容易?一个巨大的长源文件,有很多类,更难。
  • 编辑有多容易?在编辑多个简短的相关类时,如果它们都在一个包含拆分器的源文件中,那么它们可能会比在多个源文件中更容易,因为我运行的文本编辑器最大化,一次显示一个源文件

答案 10 :(得分:0)

除非内部类完全是私有的,否则我更喜欢1到1的类。 即便如此,我通常会将其分解,以便于查找和跟踪SVN中的更改。