内聚
耦合 (Coupling): 描述的是两个模块之间的相互依赖程度。控制耦合是耦合度的一种,表示一个模块控制另一个模块的流程。高度的耦合会导致软件维护困难,因为改变一个模块可能会对其他模块产生意外的影响。
内聚 (Cohesion): 描述的是模块内部各个元素间功能相关性的度量。逻辑内聚指的是当模块内部的元素是因为它们都参与了某种特定的逻辑活动而被组合在一起时。一个高内聚的模块在功能上是紧密相关的,它只做一件事并且做得好。
逻辑内聚
控制耦合内部的缺点就是逻辑内聚的缺点,二者关联性很强。
如果两个模块之间存在控制耦合,那么这种耦合可能导致模块的逻辑内聚性受到破坏。这是因为一个模块可能会为了另一个模块而包含不必要的逻辑。
聚合关联度高的模块
考虑模块的可重用性:尽量将关联度高的模块聚合。
-
可重用性:模块设计的目标之一是确保模块可以在多个上下文中重复使用,而不需要进行大量的修改或特定的定制。为了实现可重用性,模块应该有明确的责任,并且尽量与其他模块解耦。
-
内聚性:一个高内聚的模块意味着它执行一个非常具体的任务,而不是多个不相关的任务。内聚性越高,模块的维护和理解就越容易。
内聚与方法名称
起名时的and or,你就要考虑模块之间的内聚性是不是好,在命名模块或函数时考虑它们的功能。
例如,一个名为
LoadAndParseFile
的函数可能执行两个操作:加载文件和解析文件。这可能意味着该函数的内聚性不够,因为它正在执行两个可能独立的操作。一个更好的做法可能是有两个独立的函数:LoadFile
和ParseData
,每个函数只执行一个操作,从而提高内聚性。
模块中的出错处理
在软件工程领域,优雅和有意义的出错处理有以下好处:
用户友好性:出错处理部分能够增强用户友好性,而用户友好性在软件工程领域中就是市场竞争力。用户不希望看到模糊或者技术性的错误信息。他们希望知道出了什么问题、为什么会出问题、以及如何解决。
增强市场竞争力:在市场上,一个具有优秀出错处理和用户友好提示的应用程序往往比一个频繁崩溃或给出含糊错误信息的程序更受欢迎。
提高产品质量感知:一个有着优雅出错处理的程序会被视为更加稳定和专业,即使它可能和其他程序一样经常出错。
减少技术支持的需求:明确、有指导意义的错误信息可以帮助用户自我解决问题,从而减少对技术支持的依赖。
有助于问题诊断:对于开发者和技术支持团队,有意义的错误日志和消息可以帮助快速定位和解决问题。
为了达到这些目标,软件应该设计成能够识别和处理潜在的错误情况,并为用户提供明确、有用和友好的反馈。这通常涉及到多层次的出错处理策略,从低级的异常处理到用户界面层的友好提示。
扇入和扇出
扇入(Fan-In)和扇出(Fan-Out)是软件工程中的两个重要概念,用于描述模块或组件之间的相互关系和依赖。
扇出(Fan-Out):一个模块或组件调用或依赖其他多少模块或组件的数量。较高的扇出表示该模块与多个其他模块有交互或依赖。
扇入(Fan-In):有多少其他模块或组件依赖或调用一个特定的模块或组件。较高的扇入表示该模块被多个其他模块所使用。
在良好的软件结构中:
顶层模块:可能有较高的扇出,因为它们可能会调用多个下层模块来完成任务。例如,一个主控制模块可能需要调用用户界面、数据处理和通信等多个子模块。
中层模块:可能有较低的扇出,因为它们通常负责某个具体的功能,并只调用特定的下层模块。例如,数据处理模块可能只需要调用数据库模块。
底层模块:可能有较高的扇入,因为它们是公共的、被多个上层模块使用的实用模块。例如,一个数据库访问模块可能被应用中的多个其他模块所使用。
考虑扇入和扇出的平衡对于软件设计是很重要的。高扇出可能导致代码难以维护,因为一个模块的更改可能影响到多个被调用的模块。而高扇入表示一个模块是重用性高的,但如果需要对这个模块进行修改,则必须非常小心,因为它可能会影响到许多依赖它的上层模块。
当考虑到模块之间的耦合时,控制扇入和扇出也很重要。理想情况下,我们希望降低模块之间的耦合,从而使系统更加模块化、灵活和可维护。
公共耦合限制使用,内容耦合不能使用!
总体设计与面向数据流设计
从层次性来讲:总体设计
从过程性来讲:面向数据流的设计方法
让我们详细地探讨这两个概念:
-
总体设计(从层次性来讲):
- 这通常涉及到软件的高层架构或模块化设计。
- 总体设计强调组件、模块或子系统之间的交互与协作,而不是具体实现细节。
- 这可以帮助我们组织代码,确保模块化,降低耦合度,提高内聚性。
- 在总体设计中,考虑的关键点包括如何将大的系统划分为更小、更易于管理和实现的部分;以及这些部分如何协同工作。
- 典型的层次性设计方法包括分层架构,例如在许多企业应用中使用的表示层、业务逻辑层和数据访问层。
-
面向数据流的设计方法(从过程性来讲):
- 这种设计方法强调系统的动态行为,特别是数据在系统中的流动。
- 数据流图(DFD)是一种常用的表示系统数据流和处理过程的图形工具。
- 在DFD中,表示为圆圈的处理过程描述了如何转换数据,并通过箭头表示数据流动。
- 数据流设计的关键是理解输入、输出、处理和数据存储之间的关系。
- 这种方法尤其适合于那些处理、转换和存储数据的应用,如批处理系统、信息处理系统或事务处理系统。
总的来说,这两种设计方法论提供了不同的视角来看待系统,但它们都旨在帮助开发者创建可维护、可扩展且健壮的软件系统。在实际的项目开发中,可以根据项目的特性和需求,选择适当的设计方法,或结合多种方法来使用。
模块的作用范围应该在模块的控制范围之内!
结构化分析
结构化:功能和数据分开,即面向数据流和面向数据结构。
现在讲的是:
怎么把分析模型变成软件的结构?得到结构再用总体设计调整。
设计接口、数据接口的同时,设计数据库。数据接口涉及到数据结构和如何在模块之间传递数据。通常,数据接口会定义所需的数据类型、数据格式以及数据传递的方法(例如,通过参数传递、通过全局变量等)。