模块化编程与架构设计:原理、评估与优化
1. 模块化编程的核心思想
模块化编程的核心在于将程序构建为一组可组合的构建块,以此形成完整的解决方案。确定构建块的策略有很多,这些构建块可以是常用函数(子程序库)、不同的计算阶段(基于流程图中的方框)、不同的系统状态(基于状态图中的方框)、带有相应访问方法的对象、控制循环、系统中可能发生变化的项目,甚至是被分配实现系统特定部分的程序员。
显然,最佳的模块化方法取决于具体情况。仅仅将程序任意分割成小块并不一定有益,关键在于这些小块是否合理。从高层次来看,如何将系统拆分为模块属于架构设计的范畴。有些模块应与软件架构中的方框相对应,而更细化的模块则应有助于使设计更加清晰。
一个具有良好模块化的程序通常应具备以下理想特性:中小规模、高内聚、低耦合、良好的信息隐藏、良好的可组合性以及适度的复杂度。接下来,我们将逐一探讨这些特性。
1.1 小规模
在一定程度上,模块规模越小越好。在大多数编程语言中,用单行子例程构建整个程序并非明智之举,因为每个编程块的规模过小,无法在单个模块中包含一组相关操作。不过,像 APL 和 Forth 这样的语言是个例外,这是因为它们具有相对紧凑的表示法,允许在一行代码中执行多个不同的操作,并且能够在不明确给出参数列表的情况下在函数之间传递参数。
对于用 C 或 C++ 编写的嵌入式系统,模块大小应合理分布。一些小型辅助函数或方法可能只有几行代码,许多过程的长度可能在半页到一页之间,而一些最复杂的模块应能在两页内容纳。任何超过两页打印篇幅(约 120 行代码,包括注释)的模块可能过长,需要重新设计为更小的块。
长度之所以重要,一方面是因为如果