一.软件系统设计
1.体系结构设计就是架构设计,软件设计包含4个方面:
接口(人机界面设计)设计:软件与操作系统、软件与人之间如何交互;
架构(结构)设计:定义软件系统各主要部件之间的关系。主要目标是开发一个模块化的程序结构,并表示出模块间的控制关系;
过程设计:将系统结构部件转换成软件的过程描述;
数据设计:将模块转化为数据结构的定义。高质量的数据设计将改善程序结构和模块的划分,降低过程复杂性。
2.界面设计
(1).界面设计的三个原则:
置于用户控制之下
减少用户的记忆负担
保持界面的一致性
(2)置于用户控制之下
以不强迫用户进入不必要的或不希望的动作的方式来定义交互方式
提供灵活的交互
允许用户交互可以被中断和撤消
当技能级别增加时可以使交互流水化并允许定制交互
使用户隔离内部技术细节
设计应允许用户和出现在屏幕上的对象直接交互
(3)减少用户的记忆负担
减少对短期记忆的要求
建立有意义的缺省
定义直觉性的捷径
界面的视觉布局应该基于真实世界的隐喻
以不断进展的方式揭示信息
(4)保持界面的一致性
允许用户将当前任务放入有意义的语境在应用系列内保持一致性
如过去的交互模型已建立起了用户期望,除非有迫不得已的理由下要改变它
(5)其他:
系统输入设计应该属于界面设计的一种。
人的因素在系统输入设计中扮演了很重要的角色。
输入应该尽可能地简单,以降低错误发生的可能性,如对于范围可控的数据,使用选择的方式替代用户输入,只输入变化的数据等。
输入应该尽可能使用已有含义明确的设计,需要采用模仿的方式而非创新。
为了避免用户理解的二义性,应该对表格中输入的数据给出提示信息。
数据类型检查确保输入了正确的数据类型,自检位用于对主关键字进行基于校验位的检查;域检查用于验证数据是否位于合法的取值范围;格式检查按照已知的数据格式对照检查输入数据的格式。
3.结构化设计 SD
(1)系统设计的主要内容包括概要设计和详细设计。
设计要点:
抽象化
自顶而下、逐步求精
信息隐蔽
模块独立(高内聚、低耦合)
(2)外部和内部、高内聚和低耦合的角度都是模块(模块是指执行某一特定任务的数据结构和程序代码;每个模块完成相对独立的特定子功能,与其他模块之间的关系最简单;),符合自顶向下的原则。扇入:别人调自己,扇出:自己调别人。
概要设计(外部设计):
外部设计(高层设计/总体设计)处于软件设计的开始阶段,主要是将软件需求转化为数据结构和软件的系统结构,设计出各个功能部分的功能和接口,确定系统功能模块及其相互关系,主要采用模块结构图、层次图、HIPO图描述程序的结构。
其主要任务是将系统的功能需求分配给软件模块,确定每个模块的功能和调用关系,形成软件的模块结构图,即系统结构图。
在概要设计中,将系统开发的总任务分解成许多个基本的、具体的任务,为每个具体任务选择适当的技术手段和处理方法的过程称为详细设计。
详细设计(内部设计)
内部设计(底层设计)处于软件工程中的详细设计阶段,按照外部设计中确立的系统软件结构,来细化此系统各个功能部件以及各个部件接口的设计,并且详细给出各个功能部件详细的数据结构与算法。
(3)内聚与耦合
内聚:
功能内聚:完成一个单一功能,各个部分协同工作,缺一不可
顺序内聚:处理元素相关,而且必须顺序执行
通信内聚:所有处理元素集中在一个数据结构的区域上
过程内聚:处理元素相关,而且必须按特定的次序执行
瞬时内聚(时间内聚):所包含的任务必须在同一时间间隔内执行
逻辑内聚:完成逻辑上相关的一组任务
偶然内聚(巧合内聚):完成一组没有关系或松散关系的任务
耦合:
非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的
数据耦合:一组模块借助参数表传递简单数据
标记耦合:一组模块通过参数表传递记录信息(数据结构)
控制耦合:模块之间传递的信息中包含用于控制模块内部逻辑的信息
外部耦合:一组模块都访问同一全局简单变量,而且不是通过参数表传递该全局变量的信息
公共耦合:多个模块都访问同一个公共数据环境
内容耦合:一个模块真接访问另一个模块的内部数据;一个模块不通过正常入口转到另一个模块的
需要知道内聚和耦合的两个极端。
最高内聚为:功能内聚;最低内聚为:偶然内聚。
最高耦合:内容/内部耦合;最低耦合:非直接耦合和数据耦合。
4.面向对象设计 OOD
(1)面向对象设计OOD的基本任务是把面向对象分析模型(顶层架构图、用例与用例图、领域概念模型构成)
转换为面向对象设计模型(以包图表示的软件体系结构图、以交互图表示的用例实现图,完整精确的类图,针对复杂对象的状态图和用以描述流程化处理的活动图等)。
(2)面向对象的设计原则如下:
单一职责原则:设计目的单一的类
开放-封闭原则:对扩展开放,对修改封闭
李氏(Liskov)替换原则:子类可以替换父类依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
接口隔离原则:使用多个专门的接口比使用单一的总接口要好
组合重用原则:要尽量使用组合,而不是继承关系达到重用目的
迪米特(Demeter)原则(最少知识法则):一个对象应当对其他对象有尽可能少的了解
(3)23种设计模式
二.软件开发方法
1.常见的软件开发方法有4种:结构化法、面向对象方法、面向服务方法、原型法。
软件开发方法(方法论)比软件开发模型大一号,一个开发方法下面可以挂载多个开发模型。
2.结构化法
用户至上;
严格区分工作阶段,每个阶段有任务和结果;
强调系统开发过程的整体性和全局性;
系统开发过程工程化,文档资料标准化;
自顶向下,逐步分解(求精,先对最高层次中的问题进行定义、设计、编程和测试,而将其中未解决的问题作为一个子任务放到下一层次中去解决)。
相对于自底向上方法,自顶向下方法可以更快地得到系统的演示原型。
3.面向对象方法
拥有更好的复用性,更符合人们的思维习惯;
自底向上(根据系统功能要求,从具体的器件、逻辑部件或者相似系统开始,通过对其进行相互连接、修改和扩大,构成所要求的系统);
分析、设计、实现三个阶段,界限不明确。
4.面向服务方法
基于服务的架构SOA方法有三个主要的抽象级别:
操作(级别低,如数据库的读写操作)
服务(级别中,代表操作的逻辑分组,粒度太小增加通信开销,粒度太大影响服务对需求变化的敏捷性)
业务流程(级别高,为实现特定业务目标而执行的一组长期的动作,通常包含多个服务的调用);
在软件架构风格中会详细说明"基于服务的架构SOA"
5.原型法
适用于需求不明确的开发;一般主要用于需求分析阶段,对用户需求做出快速相应;可以和另外3中开发方法打配合。
按结果分:包括抛弃型原型和进化型原型。
按功能分分为:水平原型(界面)和垂直原型(算法)。
5 其他重要的软件开发方法
(1)形式化方法:所有东西均可证明/验证,而不是代码测试;
形式化方法是一种具有坚实数学基础的方法,从而允许对系统和开发过程做严格处理和论证,适用于那些系统安全级别要求极高的软件的开发。
形式化方法的主要优越性在于它能够数学地表述和研究应用问题及软件实现。但是它要求开发人员具备良好的数学基础。
用形式化语言书写的大型应用问题的软件规格说明往往过于细节化,并且难于为用户和软件设计人员所理解。由于这些缺陷,形式化方法在目前的软件开发实践中并未得到普遍应用。
(2)统一过程方法UP:在软件开发模型->统一过程模型UP/RUP;
(3)敏捷开发方法:在软件开发模型->敏捷开发模型;
(4)基于架构的开发方法ABSD:在软件架构设计->基于架构的软件开发。
三.系统建模
1.逆向工程
分析目标系统,认定系统的构件及其交互关系,并且通过高层抽象或其他形式来展现目标系统的过程。
软件逆向工程就是分析已有的程序,寻求比源代码更高级的抽象表现形式。
在逆向工程导出信息的四个抽象层次中:
实现级:包括程序的抽象语法树、符号表、过程的设计表示。
结构级:包括反映程序各部分之间相互依赖关系的信息,如调用图、结构图、程序和数据结构
功能级:包括反映程序段功能及程序段之间关系的信息。例如数据和控制流模型
领域级:包括反应程序分量和程序诸实体与应用领域概念之间的对应关系的信息,如实体关系模型
2.正向工程:
从高层抽象和独立于实现的逻辑设计到一个系统的物理实现的传统开发过程。
3.再工程(Reengineering)
结合逆向工程、重构和正向工程对现有系统进行审查和改造,将其重组为一种新形式。