一、引言
软件设计是信息系统开发生命周期中连接需求分析与系统实现的核心阶段,核心目标是将 "需要做什么" 的需求规格说明转化为 "如何实现" 的技术方案,是软考中级信息系统管理工程师第六章的核心考查内容,占上午基础知识部分分值约 6-8 分,同时是下午案例分析题的高频命题方向。
软件设计方法经历了三个主要发展阶段:20 世纪 70 年代形成结构化设计方法论,以数据流为核心、自顶向下逐层分解为核心特征;90 年代面向对象设计逐步成为主流,通过封装、继承、多态提升系统可扩展性;2000 年后统一建模语言 UML2.0 标准正式发布,成为面向对象设计的通用建模规范,同时设计模式理论的普及进一步提升了软件设计的复用性和规范性。
本文将从结构化设计原理、面向对象设计原则、UML 建模体系、设计模式分类四个维度系统梳理核心知识点,明确考试高频考点与实践应用要点。
二、软件设计核心原理与分类
(一)软件设计的定义与目标
软件设计是依据需求规格说明书(SRS),通过科学的方法对系统的结构、模块、接口、实现逻辑进行定义的过程,核心目标是保证系统的功能正确性、可维护性、可扩展性、安全性和性能指标满足需求。从工程视角可分为两个层级:
- 概要设计:又称为总体设计,核心任务是完成系统结构划分,明确模块功能、接口与调用关系,输出系统架构图、模块划分说明、接口规范等文档。
- 详细设计:针对每个模块的内部实现逻辑进行定义,包含处理流程、数据存储、界面设计、异常处理、安全控制等内容,输出详细设计说明书、伪码、数据库设计文档等交付物。
(二)两大设计方法论对比
目前主流设计方法分为结构化设计与面向对象设计两类,两类方法的核心差异如下:
| 对比维度 | 结构化设计 | 面向对象设计 |
|---|---|---|
| 核心导向 | 面向数据流 | 面向对象 / 类 |
| 分解逻辑 | 自顶向下逐层分解功能 | 按业务实体抽象封装对象 |
| 复用机制 | 函数 / 过程复用 | 类继承、对象组合复用 |
| 扩展性 | 调整需求需重构模块结构 | 可通过扩展子类实现需求迭代 |
| 适用场景 | 流程固定的嵌入式系统、科学计算软件 | 业务迭代频繁的信息系统、互联网应用 |
软考中需明确两类方法的输入输出差异:结构化设计输入为数据流图(DFD)、数据字典,输出为系统结构图、模块说明;面向对象设计输入为用例模型、领域模型,输出为类图、交互图、设计方案。
软件设计阶段整体流程与输入输出关系示意图
三、结构化设计核心规则与实施方法
(一)模块设计核心准则:高内聚低耦合
模块是结构化设计的基本单元,具备功能、逻辑、状态三个基本属性:功能定义模块的输入输出与对外能力,逻辑描述内部实现机制,状态定义模块运行的依赖环境。模块设计需遵循以下两个核心度量准则:
- 耦合:衡量模块之间关联的紧密程度,耦合度越低模块独立性越强,从低到高共 7 类:
(1)非直接耦合:两个模块无直接调用关系,通过上层模块控制实现协同,独立性最高;
(2)数据耦合:仅通过参数传递简单数据类型,是推荐的模块交互方式;
(3)标记耦合:传递记录、对象等复杂数据结构,仅使用结构中部分字段时会产生冗余依赖;
(4)控制耦合:传递控制信号(如状态标识、开关量),被调用模块的执行逻辑由调用方控制,增加了模块间的依赖程度;
(5)公共耦合:多个模块访问同一个全局数据区(如共享内存、公共数据库表),数据修改会影响所有关联模块,故障定位难度大;
(6)内容耦合:一个模块直接访问另一个模块的内部数据、修改执行逻辑或直接进入模块内部执行,是最差的耦合方式,需严格禁止。 - 内聚:衡量模块内部各代码段的功能关联性,内聚度越高模块职责越单一,从高到低共 7 类:
(1)功能内聚:模块所有代码共同完成单一明确的功能,无冗余逻辑,是最优的内聚类型;
(2)顺序内聚:处理元素关联且必须按固定顺序执行,前一个步骤的输出是后一个步骤的输入;
(3)通信内聚:所有处理逻辑都操作同一组输入数据或生成同一组输出数据;
(4)过程内聚:处理逻辑关联且必须按特定流程执行,流程步骤之间无数据依赖;
(5)时间内聚:包含的任务必须在同一时间间隔内执行(如系统初始化模块、异常清理模块);
(6)逻辑内聚:完成逻辑上相关的一组任务,通过外部参数决定执行哪个分支;
(7)偶然内聚:模块内代码无逻辑关联,仅为减少代码量随意组合,是最差的内聚类型。
结构化设计的核心原则是尽量实现数据耦合、控制标记耦合、避免控制耦合、严禁公共耦合和内容耦合,同时优先保障功能内聚、减少低层级内聚。
(二)结构化设计常用工具
- 概要设计工具:系统结构图(SC 图),通过矩形表示模块、箭头表示调用关系、空心圆表示传递数据、实心圆表示传递控制信息,清晰展示模块的层级结构与交互关系。
- 详细设计工具:
(1)图形工具:程序流程图(使用起止框、处理框、判断框、流程线表达逻辑)、N-S 图(盒图,完全去掉流程线,适合结构化逻辑表达)、PAD 图(问题分析图,支持自顶向下逐步求精);
(2)表格工具:判定表、判定树,适合多条件组合的逻辑描述;
(3)语言工具:PDL(伪码),使用结构化语言描述处理逻辑,无需关注语法细节,可直接转化为代码。
某省级政务服务审批系统采用结构化设计,将系统划分为受理模块、审核模块、审批模块、出证模块四个核心模块,模块间仅传递审批单编号与状态标识(数据耦合),每个模块仅完成对应环节的单一功能(功能内聚),系统上线后需求变更的平均修改成本降低 40%,故障定位效率提升 60%。
耦合与内聚类型对比及设计优先级示意图
四、面向对象设计核心原则与类设计
(一)面向对象设计七大原则(SOLID + 迪米特 + 组合重用)
面向对象设计的核心思想是抽象、封装、继承、多态,通过七大设计原则保障系统的可扩展性与可维护性:
- 单职原则:一个类仅承担一项职责,仅有一个引起变化的原因,避免类的功能过于臃肿,例如用户类仅负责用户属性与基础操作,不应包含用户权限校验逻辑。
- 开闭原则:对扩展开放、对修改封闭,通过抽象层固定实现规范,新增需求通过扩展实现类完成,无需修改已有代码,是面向对象设计的核心目标。
- 里氏替换原则:子类可以完全替换父类出现的位置,且业务逻辑不受影响,是继承复用的基础,禁止子类重写父类的非抽象方法。
- 依赖倒置原则:高层模块依赖抽象接口,不依赖具体实现类,底层模块实现抽象接口,通过依赖注入降低模块间的耦合度。
- 接口隔离原则:使用多个细粒度的专用接口,避免定义包含多个不相关方法的总接口,防止实现类实现不需要的冗余方法。
- 组合重用原则:优先使用对象组合(Has-A 关系)实现代码复用,尽量减少类继承(Is-A 关系),避免继承带来的父类修改影响所有子类的问题。
- 迪米特原则(最少知识原则):一个对象仅对直接关联的对象有了解,仅调用直接关联对象的方法,减少不必要的依赖,降低需求变更的影响范围。
(二)面向对象设计的三类核心类
根据职责不同,面向对象设计中的类分为三类:
- 实体类:映射业务领域中的实体,对应需求中的持久化数据,通常包含属性与简单的属性操作方法,例如用户类、订单类、商品类,属性与数据库表结构直接对应。
- 控制类:实现用例的业务逻辑控制,负责协调实体类与边界类的交互,一个用例通常对应一个控制类,例如订单创建控制类,负责校验库存、生成订单、扣减库存等逻辑的编排。
- 边界类:实现系统与外部参与者的交互,包括用户界面、第三方系统接口、硬件设备接口等,例如 PC 端用户注册页面、微信支付回调接口、打印机驱动接口。
某电商系统采用面向对象设计,将订单相关功能划分为 Order 实体类、OrderCreateControl 控制类、OrderFrontPage 边界类,当新增移动端订单提交入口时,仅需新增 MobileOrderPage 边界类,无需修改已有实体类与控制类代码,需求迭代周期从 7 天缩短至 2 天。
面向对象设计三类核心类协作关系示意图
五、UML 建模体系与核心图应用
统一建模语言(UML)是 OMG 组织发布的面向对象建模标准,目前主流版本为 UML2.0,其结构包含构造块、规则、公共机制三部分,共定义 14 种模型图,分为静态结构图、动态行为图两大类。
(一)UML 核心元素
- 事物:是 UML 的基本建模元素,分为四类:
(1)结构事物:表示静态概念或物理元素,包括类、接口、用例、构件、节点等;
(2)行为事物:表示动态行为,包括交互、状态机、活动;
(3)分组事物:用于组织模型层次,核心是包;
(4)注释事物:用于解释模型元素,即注释。 - 关系:定义事物之间的关联逻辑,分为四类:
(1)依赖:一个事物的变化会影响另一个事物的语义,用带箭头的虚线表示;
(2)关联:对象之间的结构性连接,包括普通关联、聚合(整体与部分可独立)、组合(整体与部分不可独立),用实线表示;
(3)泛化:一般元素与特殊元素的继承关系,用带空心三角的实线表示;
(4)实现:类实现接口定义的契约,用带空心三角的虚线表示。
(二)UML14 种图的分类与应用场景
- 静态结构图(描述系统静态结构):
(1)类图:描述类、接口的属性、方法及相互关系,是最核心的静态模型,用于系统静态结构设计;
(2)对象图:类图的实例快照,展示某一时刻系统中对象的状态与关联;
(3)构件图:描述封装构件的接口、端口与内部结构,用于系统组件化设计;
(4)部署图:描述运行时节点与构件的部署关系,展示软件到硬件的映射;
(5)用例图:描述参与者与系统用例的关联,展示系统对外提供的功能;
(6)制品图:描述系统的物理文件结构,包括可执行文件、配置文件、依赖库等;
(7)包图:描述模型的包层级结构与包之间的依赖,用于模型组织管理;
(8)组合结构图:描述类或构件的内部结构与协作关系。 - 动态行为图(描述系统动态逻辑):
(1)状态图:描述单个对象的状态流转与触发事件,用于状态变化复杂的对象建模(如订单状态、审批流程状态);
(2)活动图:描述业务流程的控制流与数据流,类似流程图,支持并发分支表达;
(3)顺序图:强调对象交互的时间顺序,展示消息的发送顺序与时间先后;
(4)通信图:强调交互对象的组织结构,展示对象之间的消息关联;
(5)定时图:描述对象状态或值随时间的变化,用于实时系统的时间约束建模;
(6)交互概览图:结合活动图与顺序图的特征,展示多个交互片段的流程关系。
(三)UML 五视图架构体系
UML 通过五个视图完整描述系统架构:
- 用例视图:从外部参与者视角描述系统功能,是其他视图的基础;
- 逻辑视图:展示系统内部功能的实现逻辑,包含类图、交互图;
- 进程视图:描述系统的并发与同步机制,包含线程、进程的调度关系;
- 实现视图:描述系统的代码与构件结构,包含构件图、制品图;
- 部署视图:描述系统的物理部署架构,包含部署图、节点关系。
软考中需重点掌握类图、用例图、顺序图、活动图、状态图、部署图的适用场景与元素含义,这六种图是每年的必考点。
UML14 种图分类与应用场景对比表
六、设计模式分类与核心应用
设计模式是对软件设计中反复出现的问题的通用解决方案,包含模式名称、问题场景、解决方案、效果四个核心要素,按照处理范围与目的分为不同类别。
(一)按处理范围分类
- 类模式:处理类与子类的静态关系,通过继承实现,编译时确定关系,包括工厂方法、适配器(类)、模板方法、解释器等。
- 对象模式:处理对象之间的动态关系,通过组合 / 聚合实现,运行时可动态调整,适用性更广泛,包括抽象工厂、单例、代理、观察者等大部分设计模式。
(二)按目的与用途分类
- 创建型模式(5 种):用于对象创建逻辑的封装,解耦对象的创建与使用,包括:单例模式(保证一个类仅有一个实例)、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):用于类或对象的组合,实现灵活的结构扩展,包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。
- 行为型模式(11 种):用于描述对象之间的交互与职责分配,实现灵活的业务逻辑扩展,包括:职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式、中介者模式、备忘录模式、解释器模式。
某企业 CRM 系统的客户通知功能采用策略模式,将短信通知、邮件通知、微信通知封装为不同的通知策略类,新增通知渠道时仅需新增策略实现类,无需修改已有通知逻辑,扩展成本降低 70%;系统日志收集采用外观模式,为上层业务提供统一的日志接口,内部封装文件日志、数据库日志、ELK 日志存储的实现细节,业务代码无需关心底层存储逻辑。
设计模式分类与核心模式应用场景示意图
七、总结与软考备考建议
(一)核心知识点总结
本文覆盖软件设计四大核心板块:结构化设计的耦合内聚 7 种类型、模块设计原则、常用工具;面向对象设计的 7 大原则、三类核心类职责;UML 建模的 4 种关系、14 种图的分类与应用场景、五视图架构;设计模式的三大分类与核心模式特征。
(二)软考考试重点提示
高频考点包括:耦合与内聚的类型判断(每年必考 1-2 题)、面向对象设计 7 大原则的应用场景、UML 图的分类与适用场景、设计模式的分类与核心模式的作用。易错点包括:聚合与组合的区别、状态图与活动图的适用场景、类模式与对象模式的差异。下午案例分析题通常会给出业务场景,要求判断模块的耦合内聚类型、绘制 UML 类图或顺序图、选择合适的设计模式。
(三)实践与备考建议
备考时需结合真题理解概念,重点记忆耦合内聚的排序、UML 图的分类、设计模式的分类;实践中需遵循 "高内聚低耦合" 的核心准则,优先使用面向对象设计方法,结合设计模式提升系统的可扩展性,建模时优先选择核心 UML 图,避免过度建模。
下一期我们将学习软件实现、部署交付与全过程管理的核心知识点,敬请关注。
八、课后小测:
在结构化设计中,()表示模块之间联系的程度,从低到高分为 7 种类型。
A. 内聚
B. 耦合
C. 模块化
D. 抽象
答案:B。耦合表示模块之间联系的程度,内聚表示模块内部各代码成分之间联系的紧密程度。