软件工程--实践者的研究方法[设计的概念]
设计的概念
-
11.1 软件工程中的设计
-
11.2 设计过程
-
- 11.2.1 软件质量
- 11.2.2 软件设计的历史发展
-
[设计理念]
-
[模型架构]
-
[数据构成要素]
-
[系统结构构成要素]
-
[接口功能构成]
-
[构件级别
-
[部署级别
-
小结
-
11.1 软件工程中的设计
-
需求模型 强调的是实现系统所需的信息、作用以及流程。
-
设计模型 则阐述了软件体系结构、数据结构以及接口等细节。
-
设计构建出的模型必然是系统的基石。
-
设计模型的质量能够被评估以及改造。
-
软件设计作为确立软件质量的关键步骤不可或缺。
-
软件设计涵盖了多种原理以及实践内容,并用于指导高质量系统的开发。
-
软件设计的目标在于创造稳定(稳定)、符合预期的功能(适用)并且令人愉悦(赏心悦目)的表示方法。
-
设计师的行为模式
- 首先致力于实现多样化功能
- 然后再整合成整体
-
多样性 是指涵盖多种方案和设计的原始资料。
- 聚合 是将各种信息汇总在一起,并从中筛选出能满足需求工程及分析模型所定义需求的关键要素。
- 多样化与聚合均需依赖直觉与判断力,在其质量上受设计师水平的影响因素包括设计方式选择以及评价标准制定等。
分析模型 -> 设计模型


- 数据或类设计:将类模型转换为具体实施方式及满足软实现实需的数据组织形式。
- 体系结构设计:阐述了核心要素间的联系、整体架构风格与模式以及决定实现路径的关键制约因素。
- 接口设计:阐述了软协系统间、软用者间通信工作流程的具体规范。
- 构件级设计:将软体架构要素转换成对软构件的功能解析过程。

- 软件设计与软件质量之间存在紧密联系。
- 设计在培养软件质量和提供用于评估这一过程中的表示方面发挥着重要作用。
- 设计是我们精确地将用户需求转换为 software 产品或系统的方法。
- 软件 design 是所有后续活动的核心。
- 软件 design 和编码区别主要体现在功能上!
11.2 设计过程
- 软件设计是一个逐步演进的过程,在这个过程中需求被转化为构建软件所需的"蓝图"。
- 在初始阶段(即高抽象层次),蓝图展现了软件的整体架构;这种架构可以直接追踪到特定的目标、数据、功能与行为需求。
- 经过不断优化与精炼后,在较低抽象层次上会生成更为具体的设计表达。
- 为了评价一个优秀的设计迭代过程具备良好的特性:
- 设计方案需涵盖分析模型中的所有明确需求,并充分满足客户的预期及潜在需求。
- 在编写过程中都需要确保设计文档是清晰易懂且实用可靠的。
- 从实现的角度来看,设计文档应全面呈现数据域、功能域及行为域的具体内容。
11.2.1 软件质量
软件设计质量8条指导原则
设计应展示出这样一种结构;
a) 已经使用标准的设计架构创建;
b) 由具备良好设计特性的组件构成;
c) 能够以逐步演进的方式实现,并且这种演进过程有助于提高实现和测试效率。
- 设计需采用模块化策略;即系统架构应当依据逻辑划分为若干功能元素或子系统单元。
- 为了清晰展示核心要素, 设计应当明确包括数据存储架构、体系组织框架、功能交互界面及组件构成要素等关键组成部分。
- 在系统开发过程中, 应当提取并定义相应的数据模型, 其中每个模型都对应特定类别的对象属性及其相互关系, 并通过可识别的方式进行规范性约束。
- 系统架构师应当明确划分功能组件, 每个组件均需体现独立的功能特性, 并通过明确的功能标识实现系统的有机整合。
- 通过定义合理的接口规范, 可以有效减少各功能单元之间的耦合关系, 同时降低系统与外部环境之间的交互复杂度。
- 基于需求分析结果选择优化方案时, 需要注意方法的选择应当具有良好的可推广性和复用性特征。
- 在具体实现阶段, 应优先选择那些能够直观反映系统特性的表现形式, 并结合标准化符号体系实现对系统的精确描述与准确解读
软件的质量属性
-
FURPS作为软件质量的一种重要指标被定义为:
-
功能性(Functionality):通过分析程序的功能集合及其适用程度,并考量系统整体的安全性能来衡量。
-
易用性(Usability):评估者需综合考虑用户使用过程中的便利性、界面设计的美观性以及系统的一致性和相关文档的支持度。
-
可靠性(Reliabity):通过细致分析系统故障率及其影响程度,并结合输出结果的质量、平均故障间隔时间以及恢复效率等指标来判断系统的稳定性和可靠性。
-
性能(Performance):从处理速度和响应时间两个维度考察系统运行效率;同时关注资源消耗情况以及吞吐量指标,并综合考量系统的整体效率。
-
可支持性(Supportability):涵盖可扩展性的潜力和适应不同需求的能力,并提供一定的可用性和可靠性保障;此外还具备较高的测试兼容性和配置灵活性,并确保系统安装简便易行且问题定位便捷高效。
-
需注意:
-
软件设计过程中,并不都是每个软件质量属性都具有相同的重要性。有的系统重视功能性需求,有的系统则对高性能有较高的要求。
-
但是,在软件开发初期就要考虑到这些质量属性的问题, 否则将会导致开发出质量较低的软件产品。
11.2.2 软件设计的历史发展
- 软件设计的发展历程经历了大约半个世纪。
- 在20世纪70年代初至80年代末期的开发实践中,《计算机程序书写规范》一书中首次提出了《模块化设计思想》和《自顶向下开发方法》。
- 随着时代发展于进入21世纪初至2010年间,《软件工程》课程体系逐步引入了《面向对象的设计方法》。
- 随后又发展出《设计模式理论》、《面向领域特定性设计方法》以及《模型驱动开发技术》等新兴方向。
- 这些不同的软件设计方法都具有以下共有特点:
- 1)都是将需求模型转化为具体实现方案的方法
- 2)都有明确表示功能组件及其之间交互关系的方式
- 3)都采用分阶段、分层次进行细化与划分的方法
- 4)都提供一套系统的质量评估指导原则
对于任何一种设计方法而言,它都需要包含数据设计、体系结构设计、接口设计以及构件design,并且每一步骤都具备一套基本的概念
11.3 设计概念
- 随着时间的发展,在软件工程领域逐渐形成了一系列核心**软件设计概念。
- 尽管对每种概念的关注强度在过去几十年里有所波动——有时专注度提升显著——但这些理念始终经受着时间的考验。
- 每一个核心理念都是构建复杂系统时不可或缺的基础支撑。
- 这些理念主要包括:**抽象;体系结构;模式;关注点分离;模块化;信息隐藏;功能独立;求精;方面;重构(尤其是面向对象)以及类的设计等。
抽象
- 核心手段 用于人类处理复杂问题。
- 抽象层级 明确区分高低之分,在高阶层次上体现更加广泛的概括性,在低阶层次上则反映更为具体的细节。
- 同义词 包括:分类、归纳、整理等专业术语。
- 数据层面 经过建模与分类操作生成新类型。
- 过程层面 经过建模与分类操作生成新功能。
在面向对象设计中,默认情况下类是对数据特性和行为的综合体现;而接口则定义了一组可调用的方法以实现特定功能。
体系结构
- 软件体系架构指的是"软件的整体架构以及这种架构确保系统具有概念上的完整性"。
- 简而言之, 架构 是程序模块的组织形式和布局, 包括模块之间的交互方式以及它们所采用的数据模型。
- 软件设计的主要目标之一是生成系统的架构视图, 这个视图作为指导框架推动更为详细的-design活动。
- 一套系列化的架构模式赋予了软件工程师复用高级别设计的理念。
模式
- 阐述了在某种情境下针对特定设计问题所采用的设计形式。
- 每个设计模式的目标在于提供一种说明或指导方案,
以便识别以下几点:
- 每个设计模式的目标在于提供一种说明或指导方案,
- 该模式是否适用于当前的工作需求?
- 该模式能否被复用?
- 该模式能否为开发类似的、功能或结构上不同的新模式提供指导?
- 设计模式参考书《设计模式 :可复用面向对象软件的基础》
关注点分离
核心理念是一种设计思维模式,在复杂系统中将整体目标拆解成可管理的部分单元后实施管理策略以实现高效运作。
具体表现形式是系统的特征或操作行为。通过将单一的关注点细化成多个子关注点来降低系统的整体工作量和时间成本。
这种划分思想不仅体现在当前领域还广泛应用于其他相关领域如模块化思想等。
模块化
- 模块化设计 是实现关注点分离最常见的方式。
-
软件系统被划分为多个具有明确功能特性的子系统(即独立且具名的功能块),通过合理整合这些功能块可以有效解决问题。
-
对于一个给定系统而言,合适的模块数量应当如何确定?
答:当数量偏少或偏多时,都会导致运营成本上升。 -
模块化基本问题 :如何分解获得最好的模块集合?
-

信息隐蔽
- 信息隐蔽的目的是将数据结构以及处理过程的具体细节隐藏起来,在模块接口之后对外展示给用户,并无需深入了解模块内部的具体实现细节。
- 信息隐蔽原则建议每个模块均对其他所有模块实施自我设计决策的隐藏。
- 复习一下面向对象的三大特点之一:封装。
功能独立
- 在软件设计过程中追求模块独立性意味着设计者应确保每个功能块仅负责处理特定子功能的需求,并且在系统架构中与其他部分保持相对独立的状态。
- 独立的功能块通常会更加易于维护。
- 内聚性和耦合性 是衡量系统结构的重要指标:
- 内聚度(Internal Cohesion Degree) 衡量了模块内部各要素之间的紧密程度。
- 耦合度(Coupling Degree) 则反映了各组件之间的依赖关系。
求精
- 分阶段的设计策略是一种层次分明的自顶向下方法。
- 求精实质上就是一种具体化的过程。
- 细化过程是一个渐进细化的过程,在实际操作中需要循序渐进才能避免失误,并且只有经过严格评估才能确保质量。
- 抽象与细化作为重要概念间的相互支撑关系
重构
- 重构 是一种重新排列 的技术。它能够简化构建设计的同时不影响其功能与行为。
- 重构定义 :"重构即通过这种方式对软件系统进行优化的过程:它旨在改进系统的内部架构而不影响外部功能。"
- 一种看法:好系统(代码)是通过重构实现的。
- Eclipse支持Refactor功能。
面向对象的设计概念
- 类
- 对象
- 继承
- 封装
- 多态
- 消息
类设计
-
分析模型 对象所描述的抽象层次相对较高。
- 在设计过程中:
- 首先可以通过提供详细的 设计信息 来优化和精炼 分析对象 ,这些细节信息将有助于实现目标功能。
- 其次可以通过构建一系列新型的设计方案来支撑软件的基础架构,并为后续的业务解决方案提供可靠的技术保障。
- 最后建议采用五种不同类型的方案和架构设计思路来满足复杂的应用需求。
- 在设计过程中:
-
设计模块:五个主要的设计方向。
-
用户接口模块:所有必要的人机交互抽象。
-
业务处理模块:通常是从早期分析阶段提炼出来的优化版本。
-
数据存储模块:负责存储所有临时性的数据信息。
-
系统管理模块:整合所有功能组件并提供统一管理界面。
-
在构建系统架构时,默认情况下每个设计模块都需要完成一系列功能特性。
-
随着系统架构逐步完善,默认情况下各个分析块会逐渐向其相应的功能块转化。
-
分析块与功能块之间的对应关系决定了系统的整体架构风格。
-
良好的设计规范一般包含以下四个核心要素:
- 功能完整性与充分覆盖性:确保实现的所有核心功能都被完整覆盖。
- 特定职责划分与协作效率优化:确保各组件之间职责明确且协作效率最高。
- 高度自主运作能力与互不干扰特性:确保各组件能够独立自主运行且互不影响。
- 最佳组件耦合度与最低外部依赖性:确保各组件之间耦合度最低且对外部依赖最少。
依赖倒置
- 高层模块不应直接依附于低层模块
- 细节不应依附于抽象
- 遵循"层次独立性"原则,在Java语言中表现为:
-
各模块之间的依附关系主要通过层级结构实现,并非直接连接。
-
实现类之间不存在直接的数据依存关系。
-
具体表现为:各模块之间的依附关系主要通过层级结构实现,并非直接连接。
-
其具体体现为:各实现类之间不存在直接的数据依存关系。
-
其具体体现为:各实现类之间的数据传输均通过interface或abstract class间接完成。
-
各 interface 和 abstract class不会直接依附于实现类。
-
各实现了 interface 或 abstract class 的实现了类型通常会继承 interface 或 abstract class.
-
有一种说法“面向接口 编程”
-
测试设计
- 是否应该首先进行软件设计还是测试工作?这存在争议。
- 测试驱动开发强调,在撰写任何其他代码之前应优先编写相应的测试代码。
11.4 设计模型
设计模型可从过程和抽象两个维度观察,如图

11.4.1 数据设计元素
- Data architecture is also referred to as data schema.
- Data design is created at a high abstraction level, representing data models and information models from the perspective of users or clients. It is then refined incrementally until it is realized.
- Data structures are an essential component of software design.
- In the program construction level, data structure design focuses on the implementation of local data objects' data structures and related algorithms.
- At the system structure level, data design concerns files and databases among other storage media.
- At the business level, data restructuring leads to the formation of enterprise-level warehouses.
11.4.2 体系结构设计元素
- 从架构上说, 软件系统的组织形式与建筑项目的 layouts 等价, 它们均通过视觉化的方式展现系统或建筑的整体组成要素及其相互关系。
- 平面图不仅展示了空间布局规划, 还具体描绘了各空间尺度及其形态特征, 同时指定了空间关系网络, 包括门窗的位置及其操作权限。
- 系统架构设计要素为我们提供了一个展示系统整体架构的技术视图。
- 体系结构模型基于以下几个方面的信息提取:
-
- 关于将要构建的应用领域所需的功能需求;
-
- 特定的技术框架要素, 如数据流图、行为驱动分析方法等关键组件;
-
- 可用的技术模式库及其适用范围描述。
-
11.4.3 接口设计元素
-
软件接口设计类似于一组建筑结构中门窗与周边环境的具体图纸描述。
-
这些图纸详细描绘了门窗的具体尺寸与安装方式,并展示了其在建筑布局中的具体应用位置。
-
门窗与周边设施的大致情况包括其物理连接方式及其在整个建筑空间内的功能分布。
-
类似地,软件接口设计元素告知我们信息如何通过系统内外部资源进行传递,并明确各组件间的协作机制。
-
接口设计主要包括以下三个核心部分:
- 1)人机交互界面(Human-Machine Interface, HMI);
- 2)系统间交互(System-to-System Interaction);
- 3)各模块间的通信机制(Inter-component Communication Mechanism)。
-
接口设计元素支持软件与外部通信的建立,
- 接口设计元素促进各构件之间的协同工作。
11.4.4 构件级设计元素
- 系统采用模块化设计来全面描述每个软件组件的内部细节。
- 模块化设计必须明确为系统内部的所有数据实体分配相应的数据模型。
- 明确针对系统各个模块内的所有功能行为制定详细的操作规范,并建立与各模块交互的功能接口。
- 这些图表等同于一组详细的室内平面布置图及其技术规格书。它们展示了各个房间内的电气布线、管道安装位置及各种设施设备的具体布局,并详细标注材料选择及装饰处理方案。
11.4.5 部署级设计元素
-
底层设计要素明确说明了软件功能与子系统的具体实现细节及其在支持软件物理计算环境内的分布安排。
-
例如SafeHome产品元素配置于三个主要运行环境:
- 基于住宅的传统型个人电脑
- 集成到SafeHome控制面板
- 连接到互联网的服务器节点
- 在设计过程中,开发的UML部署图以及随后的精化 。
UML部署图

- 部署图 呈现了计算环境但并未明确地阐述配置参数。
在后续的阶段或组件启动时, 应当通过实例化的方式为部署图注入这些参数, 并详细说明每个实例的具体部署(例如硬件配置)。
小结
- 软件设计涵盖一系列理论、概念与实践,并以高质量系统与产品的开发为目标。
- 软件设计旨在实现稳定可靠、通用且令人满意的数据模型与表示方法。
- 设计模型包含数据/类设计、体系结构设计、接口设计以及构件级设计等要素。
- 设计过程应遵循以下质量指导原则。
- 软件工程历史发展过程中形成了若干基础性的软件设计概念。
