软件工程--实践者的研究方法[设计的概念]
设计的概念
- 11.1 软件工程中的设计
- 11.2 设计过程
- 11.2.1 软件质量
- 11.2.2 软件设计的历史发展
- 11.3 设计概念
- 11.4 设计模型
- 11.4.1 数据设计元素
- 11.4.2 体系结构设计元素
- 11.4.3 接口设计元素
- 11.4.4 构件级设计元素
- 11.4.5 部署级设计元素
- 小结
11.1 软件工程中的设计
- 需求模型注重描述所需要的数据、功能和行为。
- 设计模型提供了软件体系结构、数据结构、接口和构件的细节。
- 设计创建的模型是实现系统所必须的。
- 设计模型的质量可以被评估和改建。
- 设计是确立软件质量的关键步骤。
- 软件设计包括一系列原理、概念和实践,用以指导高质量的系统和产品开发。
- 软件设计的目标是创作坚固(稳定)、适用和令人愉悦的模型或表示(这里借鉴了建筑上的观念)
- 坚固是指程序应该不含任何妨碍其功能的缺陷。适用是要程序符合开发的目标。赏心悦目是要求使用程序的体验应是愉快的。
- 设计中设计师的做法
- 先是实现多样化、再进行聚合。
- 多样化是指要获取多种方案和设计的原始资料,包括目录、教科书和头脑中的构件、构件方案和知识。
- 聚合是把各种信息汇聚在一起,从其中挑选能够满足需求工程和分析模型所定义的需求的元素。进行经取舍。
- 多样化和聚合需要直觉和判断力,其质量取决于设计师的水平、设计方式、评价标准、迭代过程等。
分析模型 -> 设计模型
- 数据或类设计:将类模型转化为设计类的实现及软件实现所要求的数据结构。
- 体系结构设计:定义了软件的主要结构化元素之间的关系、用于达到系统需求的体系结构风格和模式以及影响体系结构实现方式的约束。
- 接口设计:描述了软件和协作系统之间、软件和使用者之间是如何通信的。
- 构件级设计:将软件体系结构的结构化元素变换为对软件构件的过程性描述。
- 软件设计和软件质量密切相关。
- 设计是软件工程中形成质量的地方,设计为我们提供了可以用于质量评估的软件表示。
- 设计是我们能够将用户需求准确地转化为软件产品或系统的唯一方法。
- 软件设计是所有软件工程活动和随后的软件支持活动的基础。
- 软件设计和编码不同!!!
11.2 设计过程
- 软件设计是一个迭代的过程,通过设计过程,需求被变换为用于构建软件的“蓝图”。
- 初始时,蓝图描述了软件的整体视图,也就是说,设计是在高抽象层次上的表达,在该层次上可以直接跟踪到特定的系统目标和更详细的数据、功能和行为需求。
- 随着设计迭代和精化将导出更低抽象层次的设计表示。这些表示仍然能够追踪到需求,但是更加错综复杂。
- 指导评价良好设计迭代演化的三个特征:
- 设计必须实现所有包含在分析模型中的明确需求,而且必须满足客户期望的所有隐含需求。
- 对于那些生成代码的人和那些进行测试以及随后维护软件的人而言,设计必须是可读的、可理解的指南。
- 设计必须提供软件的全貌,从实现的角度说明数据域、功能域和行为域。
11.2.1 软件质量
软件设计质量8条指导原则
- 设计应展示出这样一种结构;
a) 已经使用可识别的体系结构风格或模式创建;
b) 由展示出良好设计特征的构件构成;
c) 能够以演化的方式实现,从而便于实现和测试。 - 设计应该模块化;即软件应按照逻辑划分为元素或子系统。
- 设计应该包含数据、体系结构、接口和构件的清楚表示。
- 设计应导出数据结构,这些数据结构适用于要实现的类,并由可识别的数据模式提取。
- 设计应导出显示独立功能特征的构件。
- 设计应导出接口,这些接口降低了构件之间以及与外部环境连接的复杂性。
- 设计的导出应根据软件需求分析过程中获取的信息采用可重复使用的方法进行。
- 应使用能够有效传达其意义的表示法来表达设计。
软件的质量属性
- 一种软件质量属性称为FURPS,FURPS质量属性体现了所有软件设计的目标:
- 功能性(Functionality):评估程序的特征集和能力、所提交功能的普遍性以及整个系统的安全性。
- 易用性(Usability):通过考虑人为因素、整体美感、一致性和文档来评估。
- 可靠性(Reliablity):通过测量故障的频率和严重性、输出结果的精确性、故障平均时间、故障恢复能力和程序的可预见性来评估。
- 性能(Performance):度量处理速度、响应时间、资源消耗、吞吐量和效率。
- 可支持性(Supportability):可扩展性、可适应性和可用性。还包括可测试性、兼容性、可配置性、系统安装的简易性和问题定位的简易性。
- 注意:
- 软件设计时,并不是每个软件质量属性都具有相同的权重。有的系统看重功能,有的系统要求高性能。
- 但是,必须在软件设计开始时就要考虑这些质量属性,否则会导致低质量的软件产品。
11.2.2 软件设计的历史发展
- 软件设计历史有60多年了
- 早期(70年代),注重模块化程序开发和自顶向下的”结构化“方式
- 后来(90年代),面向对象的设计方法
- 再后来,提出设计模式,面向方面的设计方法,模型驱动开发,测试驱动开发等
- 每一种软件设计方法都引入了独特的设计过程和表示法,同时也引入了标定的质量特征观点。
- 这些方法共同特征:
- 1)都是将需求模型转化为设计表示的方法
- 2)都有表示功能性构件及它们之间接口的表示方法
- 3)细化和分割的启发式方法
- 4)质量评估的指导原则
- 无论哪种设计方法,都要进行数据设计、体系结构设计、接口设计和构件设计,都具有一套基本概念。
11.3 设计概念
- 在软件工程的历史进程中发展了一系列基本的软件设计概念
- 尽管多年来对于每一种概念的关注程度不断变化,但它们都经历了时间的考验。
- 每一种概念都为软件设计者提供了应用更加复杂设计方法的基础。
- 这些概念包括:抽象,体系结构,模式,关注点分离,模块化,信息隐藏,功能独立,求精,方面,重构,面向对象,类设计,依赖倒置,测试设计等。
抽象
- 抽象是人类处理复杂问题的基本方法之一
- 抽象层次有高低,越高越概括,越低越具体
- 同义词:概括,总结,泛化
- 数据抽象,产生数据类型
- 过程抽象,产生函数和方法
- 面向对象中,类就是个对数据和过程的抽象,接口是能力的抽象等等。
体系结构
- 软件体系结构意指”软件的整体结构和这种结构为系统提供概念上完整性的方式“。
- 简单说,体系结构是程序构件(模块)的结构或组织、这些构件交互的方式以及这些构件所用的数据结构。
- 软件设计的目标之一是导出系统的体系结构透视图,该透视图作为一个框架指导更详细的设计活动。
- 一系列的体系结构模式使得软件工程师能够复用设计级的概念。
模式
- 设计模式描述了解决某个特定环境中的特定设计问题的设计结构。
- 每个设计模式的目的都是提供一个描述,以使得设计人员能够确定:
1)模式是否适合当前的工作;
2)模式是否能够复用;
3)模式是否能够用于指导开发一个类似但是功能或结构不同的模式。 - 设计模式参考书《设计模式:可复用面向对象软件的基础》
关注点分离
- 关注点分离是一个设计概念,它表明任何复杂问题如果被分解为可以独立解决或优化的若干块,该复杂问题能够更容易地被处理。
- 一个关注点是一个特征或行为。通过将关注点分割为更小的关注点,使得解决一个问题需要付出更少的工作量和时间。
- 关注点分离在其他相关设计概念中也有体现:模块化、方面、功能独立、求精。
模块化
- 模块化是关注点分离最常见的表现。
- 软件被划分为独立命名的、可处理的模块(或构件),把这些构件集成到一起可以满足问题的需求。
- 对于一个给定的系统,合适的模块是多少呢?
答:过少过多都会使得成本增加 - 模块化基本问题:如何分解获得最好的模块集合?
信息隐蔽
- 信息隐蔽的目的是将数据结构和处理过程的细节隐藏在模块接口之后,用户不需要了解模块内部的具体细节。
- 信息隐蔽原则建议:每个模块对其他所有模块都隐蔽自己的设计决策。
- 联系一下面向对象的三大特点之一:封装
功能独立
- 功能独立是希望软件设计时要使每个模块仅涉及需求的某个特定子功能,并且当从程序结构的其他部分观察时,每个模块只有一个简单的接口。
- 独立模块更容易维护
- 独立性的评估标准:内聚性和耦合性
- 内聚是模块内的相关强度,耦合性是模块间的相互依赖。
求精
- 逐步求精是一种自顶向下的设计策略。
- 求精实际上就是一个细化的过程。
- 细化过程是渐进的,逐步的,细化过快容易导致错误,而且使得难于评审。
- 抽象和细化是互补的概念。
重构
- 重构是一种重新组织的技术,可以简化构建的设计而无需改变其功能或行为。
- 重构定义:“重构是使用这样一种方式改变软件系统的过程:不改变代码的外部行为而是改进其内部结构。”
- 一种观点:好系统(代码)是重构出来的
- Eclipse中有refactor功能
面向对象的设计概念
- 类
- 对象
- 继承
- 封装
- 多态
- 消息
类设计
- 分析模型定义的分析类的抽象级相对较高
- 设计中,定义设计类可以:
- 1)通过提供设计细节精化分析类,这些设计细节将促成类的实现;
- 2)创建一组新的设计类,该设计类实现了软件的基础设施以支持业务解决方案。下面建议了五种不同类型的设计类。
- 设计类,五种不同类型的设计类:
- 用户接口类:定义人机交互(HCI)所必须的所有抽象。在很多情况下,HCI出现在隐喻的环境,而接口的设计类可能是这种隐喻元素的形象表示。
- 业务域类:通常是早期定义的分析类的精化。这些类识别实现某些业务域所必须的属性和服务。
- 过程类:实现完整管理业务域类所必须的低层业务抽象。
- 持久类:代表将在软件执行之外持续存在的数据存储。
- 系统类:实现软件管理和控制功能,使得系统能够运行并在其计算环境内与外界通信。
- 在设计模型演化时,软件团队必须为每个设计类开发一组完整的属性和操作。
- 随着每个分析类转化为设计表示,抽象级就降低。
- 分析类使用业务域的专门用语描述对象;设计类更多地表现技术细节,将作为实现的指导。
- 良好的设计类一般有四个特征:
- 完整性与充分性:设计类应该完整地封装所有的,可以合理预见会存在于类中的属性和方法。
- 原始性:和某个设计类相关的方法应该关注于实现类的某个服务。一旦服务已经被某个方法实现,类就不应该再提供另外一种完成同一事情的方法。
- 高内聚性
- 低偶合
依赖倒置
- 高层模块不应该依赖低层模块,两者都应该依赖抽象
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒置原则在java语言中,表现是:
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
- 接口或抽象类不依赖实现类
- 实现类依赖接口或抽象类
- 有一种说法“面向接口编程”
测试设计
- 到底是先开始软件设计还是测试用例设计,这是个争论。
- 测试驱动开发提倡在编写任何其他代码之前先编写测试代码。
11.4 设计模型
设计模型可从过程和抽象两个维度观察,如图
11.4.1 数据设计元素
- 数据设计也称数据体系结构
- 数据设计创建在高抽象级上(以客户或用户的数据观点)表示的数据模型和信息模型。然后不断求精细化直到实现。
- 数据结构通常是软件设计的重要部分。
- 在程序构建级,数据结构设计关注实现局部数据对象的数据结构和数据相关的算法。
- 在体系结构级,数据设计关注文件和数据库等等。
- 在业务级,重新组织数据形成“数据仓库”
11.4.2 体系结构设计元素
- 软件的体系结构类似于房屋的平面图。平面图描绘了房间的整体布局,包括各房间的尺寸、形状、相互之间的联系,能够进出房间的门窗。体系结构设计元素为我们提供了软件的整体视图。
- 体系结构模型从以下三个来源获得:
- 1)关于将要构建的软件的应用域信息;
- 2)特定的分析模型元素,如数据流图或分析类、现有问题中它们的关系和协作;
- 3)体系结构模式和风格的可获得性。
11.4.3 接口设计元素
- 软件的接口设计相当于一组房屋的门、窗和外部设施的详细绘图。
- 这些绘图描绘了门窗的尺寸和形状、门窗的工作方式、设施连接入室的方式和在平面上的室内布置。
- 门、窗、外部设施的详细图纸(以及规格说明)大体上告诉我们事件和信息如何流入和流出住宅以及如何在平面图的房间内流动。
- 类似地,软件接口设计元素告诉我们信息如何流入和流出系统以及被定义为体系结构一部分的构件之间是如何通信的。
- 接口设计有三个重要的元素:
- 1)用户界面(UI);
- 2)和其他系统、设备、网络或其他的信息生产者或使用者的外部接口;
- 3)各种设计构件之间的内部接口。
- 接口设计元素允许软件和外部通信,
- 接口设计元素使得在软件体系结构内的构件之间能够通信和协作。
11.4.4 构件级设计元素
- 软件的构件级设计完整地描述了每个软件构件的内部细节。
- 构件级设计需要为所有本地数据对象定义数据结构。
- 为所有在构件内发生的处理定义算法细节,并定义允许访问构件操作(行为)的接口。
- 类似于某个房屋中的一组详细绘图(以及规格说明)。这些绘图描绘了每个房间内的布线和管道、电器插座和开关、水龙头、水池、浴池、浴盆、下水道、壁橱和储藏室的位置,还说明了所使用的地板、装饰以及和房间相关的任何细节。
11.4.5 部署级设计元素
- 部署级设计元素指明软件功能和子系统将如何在支持软件的物理计算环境内分布。
- 例如SafeHome产品元素被配置在三个主要的计算环境内运行
- 基于住宅的PC
- SafeHome控制面板
- 提供Internet访问的服务器
- 在设计过程中,开发的UML部署图以及随后的精化。
UML部署图
- 部署图显示了计算环境但并没有明确地说明配置细节。
- 在后面的阶段或构件开始时,应该用实例形式重新为部署图提供这些细节,明确每个实例的部署(专用的如硬件配置)。
小结
- 软件设计包括一些列原理、概念和实践,用以指导高质量的系统和产品开发。
- 软件设计的目标是创作坚固(稳定)、适用和令人愉悦的模型或表示
- 设计模型包括数据/类设计、体系结构设计、接口设计和构件级设计
- 设计过程应遵循一些质量指导原则
- 在软件工程的历史进程中发展了一系列基本的软件设计概念
软件工程--实践者的研究方法[设计的概念]相关推荐
- 《软件工程—实践者的研究方法》读书笔记
<软件工程-实践者的研究方法>读书笔记 <软件工程-实践者的研究方法>这本书内容丰富,从软件工程的定义.软件过程.建模.质量管理到管理软件项目和软件工程发展趋势的探讨,作者逐个 ...
- 软件工程--实践者的研究方法[体系结构设计]
体系结构设计 12.1 软件体系结构概念 12.1.1 什么是软件的体系结构? 12.1.2 体系结构是不是重要? 12.1.3 体系结构如何描述呢? 12.1.4 体系结构决策 12.2 体系结构的 ...
- 《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)
8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员.销售经理.顾客.顾问.维护团队等(P139) 8.1.2 这 ...
- 体系结构类型——《软件工程:实践者的研究方法》第八版
尽管体系结构设计的基本原则适用于所有类型的体系结构,但对于需要构建的结构,体系结构类型(genre)经常会规定特定的体系结构方法.在体系结构设计环境中,类型隐含了在整个软件领域中的一个特定类别.在每种 ...
- 体系结构风格——《软件工程:实践者的研究方法》第八版
基于计算机系统构造的软件也展示了众多体系结构风格中的一种.每种风格描述一种系统类别,包括:(1)完成系统需要的某种功能的一组构件(例如,数据库.计算模块);(2)能使构件间实现"通信.合作和 ...
- 软件工程 实践者的研究方法 第31章答案
Problem: Based on information contained in this chapter and your own experience, develop "10 co ...
- 软件工程 实践者的研究方法 第17章答案
Problem: Why is the "artistic ideal" an insufficient design philosophy when modern WebApps ...
- 软件工程 实践者的研究方法 第五章答案
Problem: Reread the "Manifesto for Agile Software Development" at the beginning of this ch ...
- 软件工程 实践者的研究方法 第19章答案
Problem: Describe how you would assess the quality of a university before applying to it. What facto ...
最新文章
- 进程间通信(三)—信号量
- Node.js 系列:构建原生 Node.js 应用
- spring启动过程之源码跟踪(下)--spring Debug
- 【转】windows Server2012安装iis
- oracle 拼接_老品牌三明49寸液晶拼接屏多少钱支持定制
- python爬虫需要什么知识-学习Python爬虫技术,需要掌握哪些web端的知识?
- 深度学习 3 循环神经网络 RNN Recurrent Neural Networks
- cocoachina上很酷的帖子
- 高校里的你值得关注的最强大脑
- stm32之GPIO学习笔记
- Android 各API版本代码常量
- wxwindows编译
- 11210怎么等于24_巧算24点
- 手把手教你升级车载导航
- STM32读写FPGA存储器EPCS器件(EPCS1、EPCS4)
- 看老虎和狮子谁是兽中之王(国外学者详细论证)
- php 实现贪吃蛇游戏,php编写的贪吃蛇游戏
- CTF题库实验吧 py的交易
- Linux学习笔记-shell脚本-log脚本函数
- 关于laravel 使用__call,__callStatic实现静态,动态方法互相调用
热门文章
- vue-router 源码解析(三)-实现路由守卫
- 浅尝UI自动化之Airtest实践
- 有限差分法电磁场matlab,电磁场有限差分法的研究与MATLAB实现.doc
- 电子元件又一话——电感篇
- 潜意识对人行为的影响--《潜意识-控制你行为的秘密》
- 多线程同时写socket是否需要加锁(转)
- 手机视频怎么裁剪时长?教你三招快速搞定
- rabbit mq Consumer Acknowledgements and Publisher Confirms 翻译
- php推送示例mip,WordPress文章页如何自动推送提交MIP/AMP页面 | 小灰灰博客
- 设计模式--观察者模式(Observer)