【发布时间】:2010-12-30 13:42:16
【问题描述】:
我正在阅读 Randall Hyde 的《编写出色的代码》(第 2 卷),我发现了这一点:
[...] 创建单体不是好的编程习惯 应用程序,其中所有源代码都出现在一个源文件中(或由单个编译处理)[...]
我在想,为什么会这么糟糕?
感谢大家的回答,我真的很想接受更多,但我选择了最综合的,以便阅读此问题的人立即找到要领。
谢谢大家 ;)
【问题讨论】:
我正在阅读 Randall Hyde 的《编写出色的代码》(第 2 卷),我发现了这一点:
[...] 创建单体不是好的编程习惯 应用程序,其中所有源代码都出现在一个源文件中(或由单个编译处理)[...]
我在想,为什么会这么糟糕?
感谢大家的回答,我真的很想接受更多,但我选择了最综合的,以便阅读此问题的人立即找到要领。
谢谢大家 ;)
【问题讨论】:
在我看来,比所讨论文件的绝对大小更重要的主要原因是缺乏模块化。如果您将软件分解成小块,它们之间的交互是通过几个明确定义的地方进行的,例如一些公共方法或已发布的 API,那么软件将变得易于维护。如果将所有内容放在一个大文件中,则倾向于让所有内容都依赖于其他所有内容的内部结构,这会导致维护噩梦。
在我职业生涯的早期,我曾在一个包含超过一百万行 C 语言的地理信息系统上工作。唯一使它可维护、唯一使它工作的原因是我们有一个清晰的“上面”和“下面”的一切之间的分界线。 “上面”的代码实现了用户界面、应用程序特定的处理等,而“下面”的一切都实现了空间数据库。分界线是一个发布的 API。如果你在“上面”工作,你不需要知道如何“下面”的代码可以工作,只要它遵循发布的 API。如果你在“下面”工作,你并不关心你的代码是如何被使用的,只要你实现了发布的 API。在某一时刻,我们甚至用 SQL 数据库中的表替换了将内容存储在专有文件中的大量“下”端,而“上”代码不必知道或关心。
【讨论】:
因为一切都变得如此拥挤。
如果您有单独的文件用于不同的东西,那么您将能够更快地找到和编辑它。
此外,如果出现错误,您可以更轻松地找到它。
【讨论】:
因为你很快就会得到(数万行)无法维护的代码。
【讨论】:
无法阅读、无法维护、无法扩展。
此外,这对团队合作也有好处,因为有很多小文件可以由不同的开发人员并行编辑。
【讨论】:
一些原因:
【讨论】:
虽然我知道 HTML 和 CSS 不是“编程语言”,但我想您可以将所有 .css、.js 和 .html 都放在一个页面上来看待它:回收或调试代码。
【讨论】:
将所有源代码包含在一个文件中会使代码管理变得困难。更好的方法应该是将您的程序划分为单独的模块。每个模块都应该有自己的源文件,所有模块最终都应该链接起来以创建可执行文件。这对维护代码有很大帮助,并且可以很容易地找到特定于模块的错误。
此外,如果您有 2 人或更多人同时在同一个项目上工作,那么您很可能会浪费大量时间来解决代码冲突。
此外,如果您必须测试单个组件(或模块),您可以轻松完成,而无需担心其他独立模块(如果有的话)。
【讨论】:
因为分解是计算机科学的基础:通过将大问题分解成更小的部分来解决它们。小问题不仅更易于管理,而且更容易让您更容易在脑海中了解整个问题。
当您谈论单个文件中的单片程序时,我能想到的只是那些在当天进入 COBOL 和 FORTRAN 的巨大意大利面条代码。它助长了一种剪切和粘贴的心态,这种心态会随着时间的推移而变得更糟。
面向对象的语言试图帮助解决这个问题。 OO 语言分解问题软件组件,将数据和功能封装在一起,映射到我们关于世界如何运作的心智模型。
【讨论】:
考虑一下Single Responsibility Principle。如果一个大文件、一个单一应用程序或一个“大东西”负责与该系统有关的所有事情,那么它就是一个包罗万象的功能。为了可维护性、可重用性等,该功能应分离为其离散组件。
【讨论】:
如果您在不同的方面做事,程序员会正确地编写一千行代码。您可以轻松管理和定位您的文件。
【讨论】:
除了上述所有原因之外,通常编译单元中的所有文本都包含在最终程序中。但是,如果你把事情分开,结果发现特定文件中的所有代码都没有被使用,它将不会被链接。即使它被链接,如果您想决定在运行时使用该功能,也可能很容易将其转换为 DLL。这有助于依赖管理,通过仅编译修改后的源文件来减少构建时间,从而提高可维护性和生产力。
【讨论】:
根据一些非常糟糕的经历,我可以告诉你它是不可读的。一个接一个的代码,你永远无法理解程序员的意思或如何找到出路。
您甚至无法在文件中滚动,因为滚动条的一点点移动就会滚动两页代码。
现在我正在重写整个应用程序,因为最初的程序员认为创建 3000 行代码文件是个好主意。它只是无法维持。当然,它是完全无法测试的。
【讨论】:
我认为您从未在一个文件中包含 6000 行代码的大公司工作过……每隔几千行您就会看到像 /** Do not modify this block, it's critical */ 这样的 cmets 并且您认为错误分配给你来自那个街区。你的经理说,“是的,看看那个文件,它就在里面。”
而且代码打破了所有那些漂亮的 OOP 概念,有脏开关。和五十个贡献者一样。
你很幸运。
【讨论】: