软件工程 第七版 Chapter_07设计概念

更新时间:2023-05-16 19:10:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第7章 设计概念设计: Mitch Kapor,Lotus 1-2-3的创始人,在 《Dr. Dobbs》杂志上发表了“软件设计宣言”,他说:

良好的软件设计应该展示: 坚固:程序应该展示不含任何妨碍其功能的缺陷。 适用:程序应该符合开发的目标。 愉悦:使用程序的体验应是愉快的。

设计的任务

分析模型 设计模型 设计文档 回答How to do? 可以分为概要设计、详细设计 把分析阶段产生的软件需求分析说明转换为用适 当手段表示的软件设计文档。过程设计

用户 需求

需求 分析

需求分析 规格说明

接口设计

设计

体系结构 数据设计

设计模型

数据设计

信息模型

软件数据结构

体系结构设计

定义软件部件间的关系软件内部、外部及与人之间的通信 软件组件的过程性描述

接口设计

构建级(过程)设计

分析模型-> 设计模型面向流的元素 数据流图 控制流图 处理叙述 基于场景的元素 用例文本 use-cases - text 用例图 use-case diagrams 活动图 activity diagrams 泳道图 swim lane diagramssc e na r i o- ba se d e l e me nt s f l ow- or i e nt e d e l e me nt sdata flow diagrams control-flow diagrams processing narratives

Co m p o n e n t L e v e l D e sig n

构件级设计

In t e rf a c e D e sig n

接口设计

Analysis Model分析模型 基于类的元素 类图 分析包 CRC模型 协作图c l a ss- ba se d e l e me nt sclass diagrams analysis packages CRC models collaboration diagrams

be ha v i or a l e l e me nt sstate diagrams sequence diagrams

A rc h it e c t u ra l D e sig n

体系结构设计

D a t a / Cla ss D e sig n

数据/类设计 行为元素 状态图 顺序图

Design Model设计模型

设计和质量

设计必须实现所有包含在需求模型中的明确需求, 而且必须满足利益相关者期望的所有隐含需求。 对于那些生成代码的人和那些进行测试以及随后 维护软件的人而言,设计必须是可读的、可理解 的指南。 设计必须提软件的全貌,从实现的角度说明数据 域、功能域和行为域。

质量指导原则

设计应该展示出这样一种结构:(a)已经使用可识别的体系 结构风格或模式创建;(b)由展示良好设计特征的构建构成; (c)能够以演化的方式实现。 对于更小的系统,设计有时可以线性开发。 设计应该模块化;也就是说,应将软件逻辑地划分为元素或子 系统。 设计应该包含数据、体系结构、接口和构件的清晰表示。 设计应导出数据结构,这些数据结构适用于要实现的类,并从 可识别的数据模式提取。 设计应导出显示独立功能特征的构件。 设计应导出接口,这些接口降低了构件之间以及与外部

环境连 接的复杂性。 设计的导出应根据软件需求分析过程中获取的信息采用可重复 的方法进行。 应该用能够有效传达其意义的表示法来表达设计。6

设计原则

设计过程中不要有“井蛙之见”。 设计应起源于分析模型。 设计不要白费力气做重复工作。 在软件和真实世界的问题之间,设计应能“最小化知识距离” [DAV95] 。 设计应表现出一致性和集成性。 设计结构应适应变化。 即使遇到数据、事件或操作条件异常时,设计结构应能温和处理。 设计不是编码,编码不是设计。 创建设计时就应对其质量进行评估,而不是创建之后。 评审设计以最小化概念上的(语义的)错误。

来自 Davis [DAV95]

基本概念

抽象——数据、过程、控制 体系结构——软件的整个结构 模式——已证实的解决方案的“精髓” 关注点分离——任何复杂问题如果被分解为若干块,该 复杂问题更容易地被处理。 模块化——数据和功能的划分 信息隐蔽——控制接口 功能独立——专一的功能和低耦合 求精——所有抽象精化的细节 方面——一种理解全部需求如何影响设计的机制 重构——一种简化设计的重新组织的技术 面向对象设计概念——附录II 设计类——提供设计细节,使分析类得以实现8

数据抽象doormanufacturer 制造商 model number 模块数 type 类型 swing direction 转动方向 inserts 插入 lights 灯 类型 type number 数量 重量 weight opening mechanism 打开机制

implemented as a data structure实现为一个数据结构9

过程抽象opendetails of enter algorithm 进门细节 算法

implemented with a "knowledge" of the object that is associated with enter实现为一个“知识”对象,与进门有关10

体系结构“软件的整体结构和这种结构为系统提供概念完整性的方式 ”[SHA95a]结构特性。体系结构设计表示定义了系统的构件(如模块 、对象、过滤器)、构件被封装的方式以及构件之间相互 作用的方式。例如,对象封装了数据和过程,过程操纵数 据并通过方法调用进行交互。 外部功能特性。体系结构设计描述应当指出设计体系结构 如何满足需求,这些需求包括:性能需求、能力需求、可 靠性需求、安全性需求、可适应性需求以及其他系统特征 需求。 相关系统族。 体系结构应当能抽取出在一类相似系统开 发中经常遇到的重复性模式。本质上,设计应当能够重用 体系结构构件。11

模式设计模式模版 模式名——以简短但富于表现力的名字描述模式的本质 目的——描述模式及其做什么 也称为——列出任何模式的别名 动机——提供问题的实例 适用性——

指出模式适用的具体设计解决方案 结构——描述要求实现模式的类 参与者——描述要求实现模式的类的职责 协作——描述参与者如何协作,以完成他们的职责 结构——描述了影响模式的“设计力量”和在实现模式 时,必须考虑的潜在权衡 相关模式——相关设计模式的交叉索引

关注点分离

任何复杂问题如果被分解为可以独立解决和(或) 优化的若干块,该复杂问题能够容易地被处理。一个关注点是一个特征或行为,被指定为软件需 求模型的一部分。

通过将关注点分割为更小的关注点,使得解决一 个问题需要付出更少的工作量和时间。 C (P1+P2)>C (P1)+C (P2) E (P1+P2)>E (P1)+E (P2) C为问题的复杂度,E为解题需要的工作量

模块化

“模块化是软件的单一属性,它使程序能被智能化地管 理”[Mye78]。 软件工程师难以掌握单块软件(即由一个单独模块构成的 大程序) 。

其控制路径的数量、引用的跨度、变量的数量和整体的复杂 度使得理解这样的软件几乎是不可能的。

几乎所有的情况下,为了理解更容易,都应当将设计划分 成许多模块,这样做的结果,构建软件所需要的成本将会 随之降低。

模块化: 权衡What is the "right" number of modules for a specific software design?module development cost模块开发成本 对特定的软件设计, 什么是 “正确”的模块数量?

cost of software软件成本

module integration cost模块集成成本

optimal number模块的最优数量

number of modules模块数15

模块化: 权衡软 件 开 发 工 作 量 总成本 最小成本区 M 接口成本

模块成本 模块数

信息隐藏模块

modulecontrolled interface控制接口

algorithm 算法 data structure 数据结构 details of external interface resource allocation policy资源分配策略 外部接口信息

clients客户

"secret" “秘密”

a specific design decision 具体的设计决策17

为什么要信息隐藏?

减少“负效应”的可能性 限制全局影响局部的设计决策 强调通过控制接口通信 不提倡使用全局数据 导致封装——高质量设计的属性 导致高质量软件

功能独立通过开发具有“专一”功能和“避免”与其他模块过多的 交互的模块,可以实现功能独立。 模块的独立性有两条定性标准进行评估: 内聚性显示了某个模块相关功能的强度。

一个内聚的模块执行一个独立的任务,与程序的其他部分构 件只需要很少的交互。简单地说,一个内聚的模块应该(理 想情况下)只完成一件事情。 耦合性依赖于模块之间的接口复杂性、引用或进入模块所在 的点以及什么数据通过接口进行传递。 块

内联系强 块间联系弱

耦合性显示了模块间的相互依赖性。

模块的独立性高

内聚弱1 2 3 4 5 6 7

低内聚

中内聚

高内聚

七种内聚

偶然内聚——模块内各元素间无实质性联系,功能无关;一 如:“读A”和“写B”等操作,就是被整合在 个模块中,供其他模块调用。 如:两个逻辑上相似的两个功能放在同一个 模块中,可以省去其中重复的部分。

逻辑内聚——模块内各元素在逻辑上相似功能;

时间内聚——模块内各元素在同一时间段内执行; 如:变量初始化等,在同一时间内执行

本文来源:https://www.bwwdw.com/article/pf94.html

Top