结构化设计方法(Structured Design,简称SD)是由美国计算机科学家拉里·康斯坦丁(Larry Constantine)和爱德华·尤登(Edward Yourdon)于20世纪70年代提出的一套系统化的软件设计方法论,它是结构化开发(Structured Development)体系中的核心环节,处于结构化分析(SA)和结构化编程(SP)之间。在软考软件设计师的教材中,结构化设计方法的定义被浓缩为一项核心任务:将以数据流图(DFD)为表达形式的需求分析模型,按照一组预定义的映射规则,转化为以软件结构图(Structure Chart,SC)为表达形式的软件设计模型。
这个定位点出了结构化设计方法的三个关键特征。第一,它的输入是数据流图而非直接的用户需求文本——这意味着SD方法的适用前提是需求分析阶段已经产出了合格的DFD模型,如果DFD本身的质量不足以支撑设计转换,SD方法的输出质量也无从保证。第二,它的转换依据是一组严格的映射规则而非设计者的临时灵感——这是SD方法区别于非结构化设计的最根本特征,也是考试中判断一个设计行为"是否属于结构化设计方法"的核心标准。第三,它的输出是软件结构图,图中包含模块、模块间的调用关系和接口信息——这与面向对象设计方法输出的类图和交互图在表达形式上有本质差异。理解这三个特征,是建立结构化设计方法完整认知的起点。
从软件开发全生命周期的视角来看,结构化设计方法的战略位置可以用一句话概括:如果结构化分析回答的是"系统要做什么",结构化编程回答的是"代码要怎么写",那么结构化设计回答的就是"做这些事的代码应当如何组织成模块,以及模块之间如何协作"。它解决的既不是需求定义的问题,也不是编码实现的细节问题,而是一道跨越问题空间和解空间之间鸿沟的桥梁。正是这种"翻译官"式的中间定位,使得结构化设计方法在软考中既会作为独立知识点被考查(如变换分析和事务分析的区分),也会作为背景设置在案例分析题中出现(如给出一个不合理的结构图要求考生用SD原则进行修正)。
结构化设计方法的核心技术是数据流图到软件结构图的映射过程。这个映射过程不是单一规则的机械套用,而是根据DFD所描述的数据处理模式来选择不同的映射路径。Yourdon和Constantine将DFD中反映的数据处理模式分为两大类——变换型(Transform Flow)和事务型(Transaction Flow),并分别设计了对应的映射方法:变换分析(Transform Analysis)和事务分析(Transaction Analysis)。
变换分析适用于变换型DFD。变换型DFD的特征是数据流图中存在清晰的"输入→加工→输出"三个阶段:数据从外部实体进入系统后,先经过一系列输入加工步骤逐步转化为内部表示(输入流),然后在中心加工环节完成核心的业务转换逻辑(变换中心),最后再经过一系列输出加工步骤将内部结果转化为外部表示(输出流)。变换分析的核心操作就是识别DFD中的这三段边界——逻辑输入与变换中心的分界点、变换中心与逻辑输出的分界点——然后将变换中心映射为结构图中的主控模块,将输入流中的加工映射为主控模块下负责获取和预处理数据的下属模块,将输出流中的加工映射为主控模块下负责格式化输出和分发数据的下属模块。
事务分析适用于事务型DFD。事务型DFD的特征是一组平行的、互斥的加工路径由一个统一的事务中心来分派。典型的事务型场景是:系统接收到一个事务类型的标志信息,根据标志的值选择执行不同的处理路径——比如一个银行系统的交易处理模块,根据交易代码的不同分别转交到存款处理、取款处理、转账处理等不同的子功能。事务中心在结构图中通常表现为一个带有菱形判断符号的调度模块,它接收事务请求并根据事务类型分发到对应的处理路径。事务分析的核心操作是将事务中心映射为结构图中的事务调度模块,将每条事务处理路径映射为一个独立的事务处理模块,在调度模块和事务处理模块之间建立调用-返回的层次关系。还需要注意一点:在考试的选择题中,如果一个DFD被判断为事务型,那么对应的分析方法一定是事务分析而非变换分析——这两种方法的选择依据是DFD的结构模式而非个人偏好,选择错误的方法会导致映射出的结构图无法正确反映原始DFD的数据处理逻辑。
无论使用变换分析还是事务分析,结构化设计方法在映射过程中都遵循一组共同的模块化设计原则。其中最为考试关注的两项是模块独立性和模块规模适中。
模块独立性是SD方法追求的核心质量目标,它通过两个维度的指标来衡量——内聚度衡量模块内部各成分之间结合的紧密程度,耦合度衡量模块之间相互依赖的程度。追求高内聚低耦合是模块独立性的总原则。在SD方法的语境下,内聚度的七个等级从高到低依次为功能内聚、信息内聚、通信内聚、过程内聚、时间内聚、逻辑内聚和偶然内聚;耦合度的七个等级从低到高依次为非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合和内容耦合。软考的命题人经常以案例题形式给出一段代码或者模块描述,要求考生判断该模块的内聚度或耦合度属于哪一个等级——这类题目不仅知道答案就能得分,而且需要准确理解每个等级的定义边界和典型场景。
模块规模适中是一个更偏向工程实践的指导性原则。一个模块的代码规模通常建议在一个合理的范围内——过大意味着模块承担了太多职责(内聚度可能偏低),过小则可能导致系统中存在大量琐碎的模块增加了模块间协调的开销。SD方法并没有给出绝对的代码行数标准,但题目中如果出现"一个模块实现的功能过多或过杂"的描述,通常指向模块划分不合理、需要进一步分解的设计改进方向。命题中的一个常见考法是给出一个模块的代码片段或功能描述,让考生判断"该模块的内聚度属于哪一个等级"——做这类题的关键是把模块内部各个子功能的逻辑关系理清楚:如果所有子功能都围绕一个明确的单一目标(如"计算工资"),那么是功能内聚;如果子功能之间通过共享数据来协作(如"处理订单数据"下的"验证订单"和"计算折扣"都需要同一份订单数据),那么是信息内聚或通信内聚;如果子功能之间只是按某种顺序串联但数据各自独立(如"用户登录后记录日志再跳转页面"),那么是过程内聚。
结构化设计方法与面向对象设计方法是软件设计师考试中一个虽然不直接但不应该被忽视的跨章节对比维度。两者的本质差异不仅在方法论层面存在,而且在概念术语和设计产出物的表达形式上都有系统性的不同。
从分析到设计的转换路径来看,SD方法遵循"DFD→SC"的转换路径——数据流图描述的是数据在系统中的流动、加工和存储,结构图描述的是模块之间的调用和接口,两者的关注焦点都是"功能和数据流"。面向对象设计方法则遵循"用例模型→类图→交互图"的转换路径——从识别系统中的对象及其职责出发,关注焦点是"对象和行为"。这一根本差异决定了两种方法适用于不同类型的软件系统:如果系统的需求以数据加工为主(如数据处理系统、报表系统),结构化方法更为直接;如果系统的需求涉及复杂的实体关系和行为交互(如交互式GUI应用、多层架构的业务系统),面向对象方法更为自然。
从模块化的粒度与原则来看,SD方法以"功能分解"为核心原则——从顶层功能开始逐步分解为子功能,直到每个子功能可以用一个模块来实现,这个分解过程遵循自上而下的层次化思维。面向对象设计方法则以"对象抽象"为核心原则——首先识别系统中的关键对象,然后定义对象的属性和行为,最后通过对象间的消息传递来
本篇完!