【问题标题】:What is a good amount of code to have in a single file?在单个文件中包含多少代码?
【发布时间】:2009-03-07 11:00:45
【问题描述】:

今天我想知道人们在决定将其拆分为多个较小的文件之前,通常在单个源文件中有多少代码。

就我个人而言,我倾向于将文件保持在相当小的范围内(尤其是使用 C/C++ 时的头文件)。也就是说,我通常在给定文件中只有一个类或一堆函数,因此文件通常

另一方面,我使用的一些东西似乎很乐意尝试尽可能多地粘贴到单个文件中,该文件有 1000 行长。

我更喜欢小文件,因为任何更改只需要重新编译那段代码,而且我发现将源代码分解为每个都有特定目的的小文件时更容易导航源代码,而不是一个关于整个事情。几个大文件有什么真正的优势吗?

例如,我的粒子系统被分解为 system.h、emitter.h、load.h、particle.h 等,并且每个都有对应的 .cpp 文件。然而,我研究过的一些粒子系统似乎将整个源代码放入了单个 .h 和 .cpp 1000 行长的行中。

【问题讨论】:

  • 谁反对这个..?来吧,获得一些观点!
  • 看相关侧栏,这个问题已经问了几十次了。
  • 我有一个习惯,就是让源单元尽可能小,这样更容易阅读。但要小心,如果您开始拆分为太多不同的单元,这可能会更加混乱。我倾向于创建一个包含我的函数或过程的单元,然后从各自的表单中调用它们。

标签: code-organization


【解决方案1】:

毫无疑问,较小的文件更易于阅读和理解。但是,我认为您不能根据类或源文件中的行数做出此决定。如果您认为应该将通用功能放在不同的文件中,请考虑拆分您的代码。它还将允许更好地重用代码。

【讨论】:

  • 这对于具有独立用途的代码来说很清楚,但是在我给出的粒子系统示例之类的情况下呢?您想要全部还是不想要,那么像我拥有的​​每个组件的小文件还是像我见过的一些文件那样在单个文件中更好?
  • 我当然会将它们放在单独的文件中,因为这样可以让您更轻松地交换不同的模块。假设你想出了一个新的粒子实现,如果源被拆分,它会更容易替换(这将是更好的面向对象设计)
【解决方案2】:

您应该从逻辑上而非物理上识别软件模块。 所以你应该根据职责来设计类/函数。

您可以使用 CRC 方法来确定每个类的责任。

【讨论】:

    【解决方案3】:

    这当然取决于,你不能把自己限制在一个标准上。但是我在一篇文章中读到

    你的方法应该是一个屏幕宽,这样你就可以在不滚动的情况下看到其中发生的事情,

    你的方法参数应该小于或等于 7,你的继承深度应该小于或等于 3,这对于人类来说是一个很容易理解的量。

    在我看来,文件的限制应该是它的责任。每个文件都应该有自己的类,并且每个类都应该有一个职责。

    【讨论】:

      【解决方案4】:

      每个源文件中的内容太少与拥有太多内容一样糟糕 - 混乱只会从单个源文件中转移到项目本身。

      当我注意到一个源文件开始处理两个(或更多)明显独立的方面时,我倾向于将其拆分。

      如果我感觉它包含将来可能会进行大量修改的功能,同时也具有可能稳定的功能,我也会将其拆分。

      【讨论】:

        【解决方案5】:

        如果您不希望代码发生更改,那么巨大的单个文件对用户来说可能更方便。例如,SQLite 将他们的代码作为一个单一的源文件分发,用户可以轻松地将其合并到他们自己的构建中。

        然而,在开发过程中这是一个糟糕的想法,因为你提到的原因,也因为它几乎可以保证当多个程序员在项目上工作时会出现 RCS 合并问题。

        【讨论】:

          【解决方案6】:

          我将项目的所有不同部分分成不同的文件,主要是为了与它相关的编译时间。当我需要链接的 CC 文件的对象已经存在时,我不必从头开始重新编译。

          在单一文件和更小的文件之间做出决定应该是团队的决定,并且应该在团队中每个程序员都遵循的编码规则中加以说明,就像有关于使用的制表符/空格的指南一样,应该有关于如何使用的指南将新代码添加到项目中。

          对于某些项目,将尽可能多的代码放在一起更有意义,特别是如果只使用项目的一个部分而不使用其余部分会使整个代码实际上毫无用处。这是一种权衡,你必须权衡利弊,最终你必须决定哪一个更适合你。

          话虽如此,许多较小的文件允许多个开发人员使用类似于 Perforce 的版本控制系统进行更轻松的开发,因为它使一个开发人员做出的更改不太可能导致提交问题,而当另一个开发人员在另一部分工作时需要解决这些问题代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-19
            • 2017-12-22
            • 1970-01-01
            • 2021-05-25
            相关资源
            最近更新 更多