如何写模块化的代码?

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

随着工程化经验的增加,我们开始关注模块化和模块设计的作用。真正的模块化是与逻辑紧密相关且具有逻辑意义的组织形式。模块化的原则包括避免写太长的函数、每个函数只做一件简单的事情、使用工具函数、尽量使用局部变量和参数。模块化是解决复杂问题的过程,深入理解模块化可以事半功倍。

🔎

延伸解读

模块化不只是分文件

文章指出,将代码分散到多个文件和目录并命名为“xxxModule”并不等于真正的模块化。真正的模块化是与逻辑紧密相关且具有逻辑意义的组织形式,每个模块应像集成电路芯片一样有清晰的输入和输出。如果只是表面切分,可能导致重复代码和逻辑分散,反而使项目思路混乱。

函数是模块化的基本单位

编程语言提供的函数本身就是一种有效的模块化方法。每个函数有明确的参数和返回值,即使所有代码写在同一个文件中,只要遵循函数原则,也能实现高度模块化。这提醒我们,模块化更依赖逻辑组织,而非物理文件划分。

拆分函数与避免通用函数

文章建议函数不超过40行,层级不宜过多,复杂部分可提取为小函数。每个函数应只做一件简单的事,避免写依据条件选择不同功能的通用函数。如果两个功能共同点少于不同点,应写成两个独立函数;共同点多则提取公共部分为辅助函数,使逻辑更清晰。

局部变量与工具函数的取舍

尽量使用局部变量和参数传递信息,避免全局变量和类成员,否则函数会失去明确的输入输出,产生依赖,难以理解和保证正确性。对于重复代码,即使很短也可提取为工具函数,现代编译器能内联小函数,不会带来额外开销。同时应避免为内联而滥用宏,宏可能使程序难以理解、调试和出错。

❓

Q&A

什么是真正的模块化?

真正的模块化不仅仅是把代码分散到多个文件和目录,而是与逻辑紧密相关且具有逻辑意义的组织形式。一个模块应该像集成电路芯片一样,有清晰的输入和输出,可以被分开编写、广泛使用,并允许多人合作。

为什么将代码分散到多个文件并不等于实现了模块化?

因为如果只是表面切分,而没有清晰的逻辑组织和明确的输入输出,代码仍然可能重复、分散,导致思路混乱。真正的模块化需要与逻辑紧密相关,每个模块完成特定子功能,并按照一定方式组装成整体。

如何避免写太长的函数?

建议函数不超过40行代码,如果函数太大,应拆分成几个更小的函数。对于复杂的部分,可以提取出来单独写一个小函数,再从原函数调用。同时函数层级也不要太多,避免过深的嵌套。

为什么每个函数应该只做一件简单的事情?

因为如果一个函数实现多个功能,且这些功能之间共同点少于不同点,逻辑会不清晰,容易出错。应该拆分成多个函数。如果共同点大于不同点,可以把相同的部分提取为辅助函数,这样既共享代码又保持逻辑清晰。

使用工具函数会增加代码开销吗?

不会。现代编译器能自动将小函数内联到调用处,不会产生额外的函数调用开销。因此,即使是很短的常用代码,也可以提取为工具函数,以简化主要函数的逻辑。

为什么应该尽量避免使用全局变量和类成员来传递信息?

因为使用全局变量或类成员会使函数失去明确的输入和输出,增加依赖性,导致代码难以理解和维护。应该尽量使用局部变量和参数来传递信息,这样函数就不需要依赖特定的类,不易出错。

🏷️

标签

➡️

继续阅读