1.软件工程_设计概念

总体设计过程通常由两个主要阶段组成:

系统设计阶段: 确定系统的具体实现方案;
结构设计阶段: 确定软件结构。

  • 需求模型注重描述所需要的数据、功能行为
  • 设计模型提供了软件体系结构、数据结构、接口和构件的细节。
  • 设计创建的模型是实现系统所必需的。
  • 设计模型的质量可以被评估改建
  • 设计是确立软件质量的关键步骤。
  • 设计是我们能够将用户需求准确地转化为软件产品或系统的唯一方法。
  • 软件设计是所有软件工程活动和随后的软件支持活动的基础
  • 软件设计和编码不同!!!

1.1设计

  • 设计中设计师的做法
    • 先是实现多样化、再进行聚合。
  • 多样化是指要获取多种方案和设计的原始资料,包括目录、教科书和头脑中的构件、构件方案和知识。
  • 聚合是把各种信息汇聚在一起,从其中挑选能够满足需求工程和分析模型所定义的需求的元素。进行经取舍。
  • 多样化和聚合需要直觉和判断力,其质量取决于设计师的水平、设计方式、评价标准、迭代过程等

  1. 数据或类设计:将类模型转化为设计类的实现及软件实现所要求的数据结构。
  2. 体系结构设计:定义了软件的主要结构化元素之间的关系、用于达到系统需求的体系结构风格和模式以及影响体系结构实现方式的约束。
  3. 接口设计:描述了软件和协作系统之间、软件和使用者之间是如何通信的。
  4. 构件级设计:将软件体系结构的结构化元素变换为对软件构件的过程性描述

1.2设计过程和质量

指导评价良好设计迭代演化的三个特征:
  1. 设计必须实现所有包含在分析模型中的明确需求,而且必须满足客户期望的所有隐含需求
  2. 对于那些生成代码的人和那些进行测试以及随后维护软件的人而言,设计必须是可读的可理解的指南。
  3. 设计必须提供软件的全貌,从实现的角度说明数据域、功能域和行为域。
软件设计质量指导8原则
  1. 设计应展示出这样一种结构
    a)已经使用可识别的体系结构风格或模式创建;
    b)由展示出良好设计特征的构件构成;
    c)能够以演化的方式实现,从而便于实现和测试。
  2. 设计应该模块化;即软件应按照逻辑划分为元素或子系统。
  3. 设计应该包含数据、体系结构、接口和构件的清楚表示
  4. 设计应导出数据结构,这些数据结构适于要实现的类,并由可识别的数据模式提取。
  5. 设计应导出显示独立功能特征的构件
  6. 设计应导出接口,这些接口降低了构件之间以及与外部环境连接的复杂性。
  7. 设计的导出应根据软件需求分析过程中获取的信息采用可重复使用的方法进行。
  8. 应使用能够有效传达其意义表示法来表达设计。
软件的质量属性

一种软件质量属性称为FURPS,FURPS质量属性体现了所有软件设计的目标:

  • 功能性(Functionality):评估程序的特征集和能力、所提交功能的普遍性以及整个系统的安全性。
  • 易用性(Usability):通过考虑人为因素、整体美感、一致性和文档来评估。
  • 可靠性(Reliablity):通过测量故障的频率和严重性、输出结果的精确性、故障平均时间、故障恢复能力和程序的可预见性来评估。
  • 性能(Performance):度量处理速度、响应时间、资源消耗、吞吐量和效率。
  • 可支持性(Supportability):可扩展性、可适应性和可用性。还包括可测试性、兼容性、可配置性、系统安装的简易性和问题定位的简易性。
注意
  1. 软件设计时,并不是每个软件质量属性都具有相同的权重。有的系统看重功能,有的系统要求高性能。
  2. 但是,必须在软件设计开始时就要考虑这些质量属性,否则会导致低质量的软件产品。

2.体系结构

  • 软件体系结构意指“软件的整体结构和这种结构为系统提供概念上完整性的方式”。
  • 简单说,体系结构是程序构件(模块)的结构或组织、这些构件交互的方式以及这些构件所用的数据结构。
  • 软件设计的目标之一是导出系统的体系结构透视图,该透视图作为一个框架指导更详细的设计活动。
  • 一系列的体系结构模式使得软件工程师能够复用设计级的概念。
模式
  • 设计模式描述了解决某个特定环境中的特定设计问题的设计结构。
  • 每个设计模式的目的都是提供一个描述,以使得设计人员能够确定:

1)模式是否适合当前的工作;
2)模式是否能够复用;
3)模式是否能够用于指导开发一个类似但是功能或结构不同的模式。

关注分离点
  • 关注点分离是一个设计概念,它表明任何复杂问题如果被分解为可以独立解决或优化的若干块,该复杂问题能够更容易地被处理。
  • 一个关注点是一个特征或行为。通过将关注点分割为更小的关注点,使得解决一个问题需要付出更少的工作量和时间。
  • 关注点分离在很多概念中都有所体现。
模块化
  • 模块化是关注点分离最常见的表现。
  • 软件被划分为独立命名的、可处理的模块(或构件),把这些构件集成到一起可以满足问题的需求。
  • 对于一个给定的系统,合适的模块是多少呢?
  • 答:过少过多都会使得成本增加

信息屏蔽
  • 信息隐蔽的目的是将数据结构和处理过程的细节隐藏在模块接口之后,用户不需要了解模块内部的具体细节。
  • 信息隐蔽原则建议:每个模块对其他所有模块都隐蔽自己的设计决策。
功能独立
  • 功能独立是希望软件设计时要使每个模块仅涉及需求的某个特定子功能,并且当从程序结构的其他部分观察时,每个模块只有一个简单的接口
  • 独立模块更容易维护
  • 独立性的评估标准:内聚性耦合性
    • 内聚是模块内的相关强度,耦合性是模块间的相互依赖。
求精
  • 逐步求精是一种自顶向下的设计策略。
  • 求精实际上就是一个细化的过程。
  • 细化过程是渐进的,逐步的,细化过快容易导致错误,而且使得难于评审
  • 抽象细化互补的概念。
重构
  • 重构是一种重新组织的技术,可以简化构件的设计而无需改变其功能或行为。
  • 重构定义:“重构是使用这样一种方式改变软件系统的过程:不改变代码的外部行为而是改进其内部结构。”

3.设计类

  • 在设计模型演化时,软件团队必须为每个设计类开发一组完整的属性和操作。
  • 随着每个分析类转化为设计表示,抽象级就降低。
  • 分析类使用业务域的专门用语描述对象;设计类更多地表现技术细节,将作为实现的指导
  • 良好的设计类一般有四个特征
    • 完整性与充分性:设计类应该完整地封装所有的,可以合理预见会存在于类中的属性和方法。
    • 原始性:和某个设计类相关的方法应该关注于实现类的某个服务。一旦服务已经被某个方法实现,类就不应该再提供另外一种完成同一事情的方法。
    • 高内聚性
    • 低耦合
依赖倒置
  • 高层模块不应该依赖低层模块,两者都应该依赖抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 依赖倒置原则在java语言中,表现是:
    • 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口抽象类产生的。
    • 接口或抽象不依赖实现类
    • 实现类依赖接口或抽象类

可以看这个文章

4.设计元素

数据设计元素
  • 数据设计创建在高抽象级上表示的数据模型和信息模型。
  • 数据结构通常是软件设计的重要部分
  • 体系结构级,数据设计关注文件数据库
  • 构件级,数据设计考虑实现局部数据对象的数据结构

体系结构设计元素

  • 软件的体系结构类似于房屋的平面图。平面图描绘了房间的整体布局,包括各房间的尺寸、形状、相互之间的联系,能够进出房间的门窗。体系结构设计元素为我们提供了软件的整体视图
  • 体系结构模型从以下三个来源获得:

1)关于将要构建的软件的应用域信息;
2)特定的分析模型元素,如数据流图或分析类、现有问题中它们的关系和协作;
3)体系结构模式和风格的可获得性。

接口设计元素
  • 软件的接口设计相当于一组房屋的门、窗和外部设施的详细绘图。

  • 这些绘图描绘了门窗的尺寸和形状、门窗的工作方式、设施连接入室的方式和在平面图上的室内布置。

  • 门、窗、外部设施的详细图纸(以及规格说明)大体上告诉我们事件和信息如何流入和流出住宅以及如何在平面图的房间内流动。

  • 类似地,软件接口设计元素告诉我们信息如何流入流出系统以及被定义为体系结构一部分的构件之间是如何通信的。

  • 接口设计有三个重要的元素:

1)用户界面(UI);
2)和其他系统、设备、网络或其他的信息生产者或使用者的外部接口;
3)各种设计构件之间的内部接口。

  • 接口设计元素允许软件和外部通信,

  • 接口设计元素使得在软件体系结构内的构件之间能够通信和协作。

  • UI设计包含美学元素(例如布局、颜色、图形、交互机制)、人机工程元素(例如信息布局、隐喻、UI导航)和技术元素(例如UI模式、可复用构件)。

  • 外部接口的设计需要关于发送接收信息的实体的确定信息。外部接口设计应包括错误检查适当的安全特征

  • 内部接口的设计和构件级的设计紧密相关。包括在各种类的运作之间实现通信协作所必需的所有操作消息发送模式

构件级设计元素
  • 软件的构件级设计完整地描述了每个软件构件内部细节
  • 构件级设计需要为所有本地数据对象定义数据结构
  • 为所有在构件内发生的处理定义算法细节,并定义允许访问构件操作(行为)的接口
  • 类似于某个房屋中的一组详细绘图(以及规格说明)。这些绘图描绘了每个房间内的布线和管道、电器插座和开关、水龙头、水池、浴室、浴盆、下水道、壁橱和储藏室的位置,还说明了所使用的地板、装饰以及和房间相关的任何细节。
部署级设计元素
  • 部署级设计元素指明软件功能子系统将如何在支持软件的物理计算环境内分布。
  • 例如SafeHome产品元素被配置在三个主要的计算环境内运行
    • 基于住宅的PC
    • SafeHome控制面板
    • 提供Internet访问的服务器
  • 在设计过程中,开发的UML部署图以及随后的精化

5.UML部署图

6.小结

  • 软件设计包括一系列原理、概念和实践,用以指导高质量的系统和产品开发。
  • 软件设计的目标是创作坚固(稳定)、适用令人愉悦的模型或表示
  • 设计模型包括数据/类设计、体系结构设计、接口设计和构件级设计
  • 设计过程应遵循一些质量指导原则
  • 在软件工程的历史进程中发展了一系列基本的软件设计概念