一、抽象
抽象是无视不重要的一面,说明实体本质的设计技术。 抽象将复杂现象简化到可以分析、理解的程度。 在软件工程中从软件定义到软件开发需要经历多个阶段,每进行一个阶段都可以看作是软件解法抽象层次的细分。 抽象的最底层是实现该软件的源代码。 进行模块化设计时,也可以有多个抽象层次,最高抽象层次的模块用摘要的方式描述问题的解法,低抽象层次的模块细分高抽象层次模块的问题解法的描述。
二、模块化
模块在程序中始终是程序对象(如数据说明、可执行语句等)的集合或单独的名称和地址元素。 模块化是指将要开发的软件分解成几个小而简单的部分。 每个模块都可以独立开发、测试,最终组装成完整的程序。 只是分割统治的原则。 模块化的目的是明确、易于阅读、理解、测试和修改程序的结构。
三、封装
封装是开发程序结构时使用的规律,每个程序的组件封装在单个模块中,在定义每个模块时尽量减少内部处理。
打包在提高软件的可修改性、测试性、可移植性方面发挥重要作用。
四、模块独立
模块独立是指每个模块完成一个相对独立的特定子系统,并且与其他模块的联系很简单。 模块独立有结合性和凝聚性两个标准。
1、耦合是模块之间相对独立性(相互紧密度)的度量。 绑定取决于每个模块之间接口的复杂性、如何调用模块以及通过接口的信息类型等。
联轴器按从小到大的顺序分为以下几类。
非直接绑定:两个模块之间没有直接关系,它们分别属于不同模块的控制和调用,它们之间不传递任何信息。 因此,耦合性最弱,模块独立性最高。
数据联接:两个模块之间有调用关系,传递的最简单的数据值在程序中相当于值传递。
标记联接:在两个模块之间传递的是数据结构。
控制联接:当一个模块调用另一个模块时,传递的是控制变量,调用的模块通过该控制变量的值选择性地执行模块中的一个功能。 因此,被调用的模块必须具有多个功能,哪些功能起作用由被调用的模块控制。
外部绑定:模块之间在非软件环境中绑定。
公共联接:通过一个公共数据环境相互作用的那些模块之间的联接。
内容合并:一个模块直接使用另一个模块的内部数据,或者通过非法条目迁移到另一个模块的内部。
2、凝聚是一个模块内部各因素相互结合的紧密度度量。
凝聚从低到高,分为以下几种。
偶然凝聚(偶然凝聚)一个模块内的各要素没有直接的任何联系。
逻辑凝聚:在模块中执行一些逻辑上相似的功能,参数决定该模块发挥哪些功能。
时间凝聚:将需要同时执行的动作组合起来的模块称为时间凝聚模块。
流程聚集:一个模块要完成多个任务,必须根据指定的流程运行。
通信聚集:模块中的所有处理元素在相同的数据结构中运行,在各处使用相同的输入数据,或生成相同的输出数据。
顺序聚集:一个模块中的每个处理要素与同一功能密切相关,按顺序执行,上一个功能要素的输出是下一个要素功能的输入。
功能凝聚:模块中的所有要素发挥相同的功能。 不可缺少,是最强的凝聚。
将软件划分为系统模块,是尽量实现高凝聚、低耦合,提高模块的独立性。
五、系统深度
表示软件结构中受控制的层数,通常可以大致显示系统的大小和复杂性。 如果层数太多,许多管理模块太简单,需要考虑能否正确集成。
六、系统宽度
软件结构中位于同一层的模块总数的最大值。 宽度越大,系统越复杂。 影响宽度最大的因素是模块的扇出。
七、模块扇出
模块扇出是指一个模块直接控制(调用)的下级模块的数量。 扇出过大意味着模块太复杂,需要控制和调整的下级模块,扇也不好。 设计得很好的系统平均扇出为3或4。
八、模块扇入
指向要调用的上层模块的数量,扇入越大,共享该模块的上层模块的数量就越多。
在模块分解时需要注意:
保持模块大小适中
尽量减少调用深度
直接调用此模块的次数应尽可能多,但调用其他模块的次数不应太多(扇入大、扇出小)。 优秀的软件设计结构顶级高扇出,中间扇出少,底层高扇入。
保证模块为单入口、单出口,模块的范围应在模块内
功能应该是可预测的