5.3 系统分析与设计
系统分析阶段把复杂的对象分解为简单的组成部分,其基本任务是在充分了解用户需求的基础上,书写系统需求规格说明书。
系统设计是根据系统分析的结果,完成系统的构建过程。其主要目的是绘制系统的蓝图,权衡和比较各种技术和实施方法的利弊,合理分配各种资源,构建新系统的详细设计方案和相关模型,指导系统实施工作的顺利开展。系统设计的主要内容包括概要设计和详细设计。
5.3.1 结构化方法 ★★★★★
针对软件生存周期各个不同的阶段,它有结构化分析 (SA)、 结构化设计 (SD) 和 结构化编程 (SP) 等方法。
1.结构化分析
一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、结构化语言、判定表以及判定树等。
结构化分析的步骤如下:
(1)分析业务情况,做出反映当前物理模型的数据流图 (Data Flow Diagram,DFD);
(2)推导出等价的逻辑模型的 DFD;
(3)设计新的逻辑系统,生成数据字典和基元描述;
(4)建立人机接口,提出可供选择的目标系统物理模型的 DFD;
(5)确定各种方案的成本和风险等级,据此对各种方案进行分析;
(6)选择一种方案;
(7)建立完整的需求规约。
结构化分析的常用手段是数据流图 (DFD) 和数据字典。
1)数据流图
D F D 需求建模方法,也称为过程建模和功能建模方法。DFD建模方法的核心是数据流。
DFD 建模方法首先抽象出具体应用的主要业务流程,然后分析其输入(数据的组成、来源、流向),经过加工流程获得输出数据。通过对系统业务流程的层层追踪和分析,把要解决的问题清晰地展现 及描述出来,为后续的设计、编码及实现系统的各项功能打下基础。
D F D 方法由4种基本元素(模型对象)组成:数据流、处理/加工、数据存储和外部项。
(1)数据流 (Data Flow)。数据流用一个箭头描述数据的流向,箭头上标注信息说明或数据项。
(2) 处理 (Process)。 表示对数据进行的加工和转换,用矩形框表示。指向处理的 数据流为该处理的输入数据,离开处理的数据流为该处理的输出数据。
(3)数据存储。表示用数据库形式(或者文件形式)存储的数据,对其进行的存取分别以 指向或离开数据存储的箭头表示。
(4)外部项。也称为数据源或者数据终点。描述系统数据的提供者或者数据的使用者,如 教师、学生、采购员、某个组织或部门或其他系统,用圆角框或者平行四边形框表示。
建立D F D 图的目的是描述系统的功能需求。 D F D方法利用应用问题域中数据及信息的提供者与使用者、信息的流向、处理、存储4种元素描述系统需求,建立应用系统的功能模型。 具体的建模过程及步骤如下。
(1)明确目标,确定系统范围。
首先要明确目标系统的功能需求,然后确定模型要描述的问题域。必须自始自终保持一致、清晰和准确。
(2)建立顶层 D F D 图。
顶层D F D 图表达和描述了系统的主要功能,确定了整个模型的内外关 系,表达了系统的边界及范围,是进一步分解的基础。
(3)构建第一层D F D 分解图。
根据应用系统的逻辑功能,把顶层D F D 图中的处理分解成多个更细化的处理。
(4)开发D F D层次结构图。
对第一层D F D分解图中的每个处理框作进一步分解,在分解图中要列出所有的处理及其相 关信息,并要注意分解图中的处理与信息包括父图中的全部内容。
分解可采用以下原则:保持均匀的模型深度;按困难程度进行选择;如果一个处理难以确切命名,可以考虑对它重新分解。
(5)检查确认D F D 图。
按照规则检查和确定 D F D 图,以确保构建的D F D模型是正确的、一致的,且满足要求。
具体规则包括:
父图中描述过的数据流必须要在相应的子图中出现;
一个处理至少有一个输入 流和一个输出流;
一个存储必定有流入的数据流和流出的数据流;
一个数据流至少有一端是处 理端;
模型图中表达和描述的信息是全面的、完整的、正确的和一致的。
经过以上过程与步骤后,顶层图被逐层细化,同时也把面向问题的术语逐渐转化为面向现实的解法,并得到最终的D F D层次结构图。层次结构图中的上一层是下一层的抽象,下一层是 上一层的求精和细化,而最后一层中的每个处理都是面向一个具体的描述,即一个处理模块仅 描述和解决一个问题。
2)数据字典
数据字典 (Data Dictionary) 是一种用户可以访问的记录数据库和应用程序元数据的目录。 数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。简而言之,数据字典是描述数据的信息 集合,是对系统中使用的所有数据元素定义的集合。
数据字典最重要的作用是作为分析阶段的工具,供人查询,在 结构化分析中,数据字典的作用是给数据流图上每个元素加以定义和说明。数据字典各部分的描述如下。
(1)数据项:数据流图中数据块的数据结构中的数据项说明。数据项是不可再分的数据单位。对数据项的描述通常包括以下内容:
数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系}
(2)数据结构:数据流图中数据块的数据结构说明。数据结构反映了数据之间的组合关系。 一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和 数据结构混合组成。对数据结构的描述通常包括以下内容:
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
(3)数据流:数据流图中流线的说明。数据流是数据结构在系统内传输的路径。对数据流 的描述通常包括以下内容:
数据流描述={数据流名,说明,数据流来源,数据流去向,组成: {数据结构},平均流 量,高峰期流量}
(4)数据存储:数据流图中数据块的存储特性说明。数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。对数据存储的描述通常包括以下内容:
数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流,组成: {数据 结构},数据量,存取方式}
(5)处理过程:数据流图中功能块的说明。数据字典中只需要描述处理过程的说明性信息, 通常包括以下内容:
处理过程描述={处理过程名,说明,输入: {数据流},输出:{数据流},处理:{简要说明}}
2.结构化设计
结构化设计 (Structured Design,SD) 是一种面向数据流的设计方法,它以SRS 和 S A 阶段 所产生的数据流图和数据字典等文档为基础,是一个自顶向下、逐步求精和模块化的过程。
SD 方法的基本思想是将软件设计成由相对独立且具有单一功能的模块组成的结构,分为概要设计和详细设计两个阶段,其中
概要设计的主要任务是确定软件系统的结构,对系统进行模块划分,确定每个模块的功能、接口和模块之间的调用关系;
详细设计的主要任务是为每个模块设计实现的细节。
1)模块结构
在 SD 中,将系统划分为模块,模块是组成系统的基本单位,可以自由组合、分解和变换,系统中任何一个处理功能都可以看成一个模块。
(1)信息隐藏与抽象。
信息隐藏原则要求采用封装技术,将程序模块的实现细节(过程或数据)隐藏起来,对其他模块不可见,使模块接口尽量简单。系统中的模块应设计成"黑盒",模块外部只能使用模块接口说明中给出的信息,例如,操作和 数据类型等。模块之间相对独立,既易于实现,也易于理解和维护。
抽象原则要求抽取事物最基本的特性和行为,忽略非本质的细节,采用分层次抽象的方式 可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。通常,抽象层次包括过程抽象、数据抽象和控制抽象。
(2)模块化。
在 S D方法中,模块是实现功能的基本单位,它一般具有功能、逻辑和状态3个基本属性,
其中功能是指该模块"做什么",逻辑是描述模块内部"怎么做",状态是该模块使用时的环境 和条件。
在描述一个模块时,必须按模块的外部特性与内部特性分别描述。
模块的外部特性是指模块的模块名、参数表和给程序乃至整个系统造成的影响,
而模块的内部特性则是指完成其功能的程序代码和内部使用的数据。
对于其他模块,只需要了解这个模块的外部特性,不必了解它的内部特性。
而 软件设计阶段,通常是先确定模块的外部特性,然后再确定它的内部特性。
(3)耦合。
耦合表示模块之间联系的程度。紧密耦合表示模块之间联系非常强,松散耦合表示模块之间联系比较弱,非直接耦合则表示模块之间无任何直接联系。模块的耦合类型通常分为7种, 根据耦合度从低到高排序如表5-1所示。
对于模块之间耦合的强度,主要依赖于一个模块对另一个模块的调用、一个模块向另一个模块传递的数据量、一个模块施加到另一个模块的控制的多少,以及模块之间接口的复杂程度。
(4)内聚。
内聚表示模块内部各代码成分之间联系的紧密程度,是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做目标单一的一件事情。模块的内聚类型通常也可以分为7种,根据内聚度从高到低的排序如表5-2所示。
一般说来,系统中各模块的内聚越高,则模块间的耦合就越低,但这种关系并不是绝对的。 耦合低使得模块间尽可能相对独立,各模块可以单独开发和维护;内聚高使得模块的可理解性 和维护性大大增强。因此,在模块的分解中应尽量减少模块的耦合,力求增加模块的内聚,遵循"高内聚、低耦合"的设计原则。
2)系统结构图
优点:结构清晰,易于理解,易于修改。
缺点:只能描述执行过程而不能描述有关的数据。
NS 流程图,也称为盒图,是一种强制使用结构化构造的图示工具,也称为方框图。其具有 以下特点:功能域明确、不可能任意转移控制、很容易确定局部和全局数据的作用域、很容易 表示嵌套关系及模板的层次关系。
PAD 图是一种改进的图形描述方式,相比程序流程图更直观, 结构更清晰。最大的优点是能够反映和描述自顶向下的历史和过程。PAD 提供了5种基本控制 结构的图示,并允许递归使用。P A D 的特点如下:
● 使用PAD符号设计出的程序代码是结构化程序代码;
●PAD所描绘的程序结构十分清晰;
● 用PAD 图表现程序的逻辑易读、易懂和易记;
● 容易将PAD 图转换成高级语言源程序自动完成;
● 既可以表示逻辑,也可用来描绘数据结构;
● 支持自顶向下方法的使用。
(2)表格工具。
可以用一张表来描述过程的细节,在这张表中列出了各种可能的操作和相应的条件。
(3)语言工具。
用某种高级语言来描述过程的细节,例如伪码和PDL(Program Design Language) 等。
PD L 也可称为伪码或结构化语言,它用于描述模块内部的具体算法,以便开发人员之间比 较精确地进行交流。语法是开放式的,其外层语法是确定的,而内层语法则不确定。
外层语法 描述控制结构,它用类似于一般编程语言控制结构的关键字表示,所以是确定的。
内层语法描 述具体操作,考虑到不同软件系统的实际操作种类繁多,内层语法因而不确定,它可以按系统 的具体情况和不同的设计层次灵活选用。
●PD L的优点:可以作为注释直接插在源程序中;可以使用普通的文本编辑工具或文字处 理工具产生和管理;已经有自动处理程序存在,而且可以自动由PD L生成程序代码。
●PD L的不足:不如图形工具形象直观,描述复杂的条件组合与动作间对应关系时,不如 判定树清晰简单。
3.结构化编程
结构化程序设计 (Structured Programing,SP) ,结构上 将软件系统划分为若干功能模块,各模块按要求单独编程,再组合构成相应的软件系统。强调程序的结构性,易读易懂,思路清晰,做法规范,程序的出错率和 维护费用大大减少。
结构化程序设计采用自顶向下、逐步求精的设计方法,各个模块通过"顺序、选择、循环"的控制结构进行连接,并且只有一个入口和一个出口。
结构化程序设计的原则可表示为:程序=(算法)+(数据结构)。
算法是一个独立的整体,数据结构(包含数据类型与数据)也是一个独立的整体。两者分开设计,以算法(函数或过程)为主。
结构化程序设计提出的原则:自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。
4.数据库设计
数据库设计是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。数据库设计的内容包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施和数据库的运行和维护。
5.3.2 面向对象方法 ★★★★★
面向对象 (Object-Oriented,OO)
面向对象开发方法认为客观世界是由对象组成的,对象由属性和操作组成,对象可按其属性进行分类,对象之间的联系通过传递消息来实现,对象具有封装性、继承性和多态性。
面向对象开发方法是以用例驱动的、以体系结构为中心的、迭代的和渐增式的开发过程,主要包括需求分析、系统分析、系统设计和系统实现4个阶段
1.面向对象分析
1)OOA 原则
面向对象的分析方法 (Object-Oriented Analysis,OOA), 是在一个系统的开发过程中进 行了系统业务调查以后,按照面向对象的思想来分析问题。
O O A模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。
两种对象类之间的结构,分类结构;组装结构。
分类结构就是所谓的一般与特殊的关系。
组装结构则反映了对象之间的整体与部分的关系。
O O A 的基本原则包括如下内容。
(1)抽象。抽象是从许多事物中抽取共同的、本质性的特征。 抽象是形成概念的必须手段。抽象是面向对象方法中使用最为广泛的原则。
抽象原则包括过程抽象和数据抽象两个方面。
过程抽象是指,任何一个完成确定功能的操作序列,可以把它看作一个单一的实体。
数据抽象是 根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。 数据抽象是O O A 的核心原则。
(2)封装。封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对 象的内部细节。
(3)继承。特殊类的对象拥有其对应的一般类的全部属性与服务,称作特殊类对一般类的 继承。在O O A 中运用继承原则,特殊类却自动地、隐含地拥有一般类(以及所有更上层的一般类)中定义的全部属性 和服务。继承原则的好处是:使系统模型比较简练也比较清晰。
(4)分类。分类就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象 描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。
(5)聚合。聚合又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装 体,从而简化对复杂事物的描述。
(6)关联。关联是事物之间确实存在着某些联系。
(7)消息通信。要求对象之间只能通过消息进行通信,而不允许在对象之外直接 地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在O O A 中要求用消息连 接表示出对象之间的动态联系。
(8)粒度控制。 控制自己的视野:考虑全局时,注意其大的组成部分,暂时不考虑具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。
(9)行为分析。现实世界中事物的行为是复杂的,由大量的事物所构成的问题域中各种行 为往往相互依赖、相互交织。
2)基本步骤
O O A大致上遵循如下5个基本步骤。
(1)确定对象和类。对象是对数据及其处理方式的抽象,它反映了系统保存和 处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括 如何在一个类中建立一个新对象的描述。
(2)确定结构。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系, 整体-部分结构反映整体和局部之间的关系。
(3)确定主题。主题是指事物的总体概貌和总体分析模型。
(4)确定属性。属性就是数据元素,可用来描述对象或分类结构的实例。
(5)确定方法。在收到消息后必须进行的一些处理方法:方法要在图中定义,并在 对象的存储中指定。
2.面向对象设计
面向对象设计方法 (Object-Oriented Design,OOD) 基本思想包括 抽象、封装和可扩展性,其中可扩展性主要通过继承和多态来实现。在O O D 中,数据结构和在数据结构上定义的操作算法封装在一个对象之中。
类封装了信息和行为,是面向对象的重要组成部分,它是具有相同属性、方法和关系的对 象集合的总称。在系统中,每个类都具有一定的职责,职责是指类所担任的任务。在定义类时,将类的职责分解为类的属性和 方法,其中属性用于封装数据,方法用于封装行为。
在O O D 中,类可以分为3种类型:实体类、控制类和边界类。
1)实体类
实体类映射需求中的每个实体,是指实体类保存需要存储在永久存储体中的信息,实体类通常都是永久性的, 它们所具有的属性和关系是长期需要的,有时甚至在系统的整个生存期都需要。例如, 在线教育平台系统可以提取出学员类和课程类,它们都属于实体类。
实体类对用户来说是最有意义的类,通常采用业务领域术语命名,一般来说是一个名词, 在用例模型向领域模型的转化中,一个参与者一般对应一个实体类。
通常情况下,实体类一定有属性, 但不一定有操作。
2)控制类
控制类是用于控制用例工作的类, 一般是由动宾结构的短语("动词+名词"或"名词+ 动词")转化来的名词,控制类用于对一个或几个用例所特有的控制行为进行建模, 控制对象(控制类的实例)通常控制其他对象,其行为具有协调性。例如,用例"身份验证"可以对应于一个控制类"身份验证器",它提 供了与身份验证相关的所有操作。
控制类将用例的特有行为进行封装,控制对象的行为与特定用例的实现密切相关,当系统 执行用例的时候,就产生了一个控制对象,控制对象经常在其对应的用例执行完毕后消亡。
通常情况下,控制类没有属性,但一定有方法。
3)边界类
边界类用于封装在用例内、外流动的信息或数据流。边界类位于系统与外界的交接处,使参与者能与系统交互。常见的边界类有窗口、通信协议、打印机接口、传感器和终端等。
通常情况下,边界类可以既有属性也有方法。
3.面向对象编程
面向对象程序设计 (Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。 OOP达到了软件工程的3个主要目标:重用性、灵活性和扩展性。OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。
面向对象程序设计以对象为核心,程序由一系列对象组成。类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。在面向对象的程序设计中,对象是组成程序的基本模块。
O O P 的基本特点有封装、继承和多态。
1)封装
封装是指将数据以及数据相关的一切操作语言(即描述每一个 对象的属性以及其行为的程序代码)组装到一起,封装在一个"模块"中,也就是一个类中,
封装的最基本单位是对象
2)继承
继承是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。
如果按照继承源进行划分,则可以分为
单继承(一个对象仅仅从另外一 个对象中继承其相应的特点)
多继承(一个对象可以同时从另外两个或者两个以上的对象中 继承所需要的特点与能力,并且不会发生冲突等现象);
如果从继承中包含的内容进行划分,则 继承可以分为4类,分别为
取代继承(一个对象在继承另一个对象的能力与特点之后将父对象 进行取代)、
包含继承(一个对象在将另一个对象的能力与特点进行完全的继承之后,又继承了 其他对象所包含的相应内容,结果导致这个对象所具有的能力与特点大于等于父对象,实现了 对于父对象的包含)、
受限继承和特化继承。
3)多态
从宏观的角度来讲,多态是指在当不同的多个对象同时接收到同一个完 全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态;
从微观的角度来讲,多态是指在一组对象的一个类中,使用相同的调用方式来对相同的函数名进行调用,但由于参数不同其所执行的动作是不同的。
4.数据持久化与数据库
要永久保存对象的状态,需要进行对象的持久化 (Persistence), 对象持久化是把内存中的对象保存到 数据库或可永久保存的存储设备中。
在多层软件设计和开发中,为了降低系统的耦合度,一般 会引入持久层 (Persistence Layer), 将数据使用者和数据实体相关联,持久层的设计实现了数据处理层内部的业务逻辑和 数据逻辑的解耦。
目前,关系数据库仍旧是使用最为广泛的数据库,如 DB2、Oracle、SQL Server等,因此, 将对象持久化到关系数据库中,需要进行对象/关系的映射 (Object/Relation Mapping,ORM)。
主流的持久化技术框架包括Hibernate、iBatis和 J DO 等。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封 装,它将POJ O与数据库表建立映射关系,是一个全自动的 ORM框架, Hibernate可以自动生 成SQL 语句,自动执行,使得 Java程序员可以随心所欲地使用对象编程思维来操纵数据库。
iBatis提供 Java对象到 SQL (面向参数和结果集)的映射实现,实际的数据库操作需要通 过手动编写S Q L实现,与Hibernate 相比, iBatis 最大的特点就是小巧,上手较快。如果不需要 太多复杂的功能, iBatis 是既可满足要求又足够灵活的最简单的解决方案。
JDO(Java Data Object,Java数据对象)是 S U N公司制定的描述对象持久化语义的标准API, 它是Java对象持久化的新规范。J DO 提供了透明的对象存储,对开发人员来说,存储数 据对象完全不需要额外的代码(例如, JDBCAPI 的使用)。这些烦琐的例行工作已经转移到 J DO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。
另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC 只能应用于关系型数据库,
而JDO 更通用,提供到任何数据底层的存储功能,包括关系型数据库、普通文件、 XML 文件和对象数据库等,使得应用的可移植性更强。