《信息系统分析与设计》10 - 系统总体设计
软件架构的设计
什么是软件架构
架构的概念:
建筑、文学、音乐、机械、电子、计算机软硬件等领域都会使用“架构(architecture
)”这一概念。架构都提供了系统最高层的设计方案,以确保建筑、小说、乐曲、设备、计算机等系统满足期望的特性。
架构包含系统的一组基本结构(structure
),每种结构都有各种类型的部件(component
)及其关系构成,架构描述了这些部件的组合、相互调用参照、通信以及其他动态交互。
架构和结构的关系:
- 架构是抽象无形的,体现高层全局的决策,就像文章的中心思想和提纲。
- 结构是具体有形的,体现决策的贯彻,如同文章的每个段落及细节描述。
1、软件架构
软件架构(software architecture
)的定义没有统一的版本;
一般认为:一个应用程序或计算系统的软件架构是一个或一组结构,它包含组成系统的软件元素、这些元素对外可见的性质以及它们之间的关系。
对外 可见的性质 指软件元素能够提供的服务、性能特征、错误处理、共享资源的用法等。
- 软件的一个结构元素可能是一个子系统、构件、进程、库、数据库、计算结点、遗留系统等等。
软件架构是 最高层次 的系统分解,它不会囊括所有的结构和行为的定义,它只关注那些被认为是重要的元素。
- 架构难以更改,一旦修改,意味着整个系统重建,而结构修改只影响局部。
软件架构(software architecture
)包括逻辑设计和物理部署两方面。
- 逻辑设计:通过对系统的层、包、类、接口和子系统的组织方式来描述;
- 物理部署: 描述了进程分配和网络配置。
2、软件架构模式
大部分的架构来源于有相似关注点的 系统 的 总结和抽象,这些相似性被描述成某种特殊模式的架构风格,也就是架构模式(architectural pattern
)。
一种架构模式就是一个经验秘籍,架构师在设计不同系统时可以重复使用这些先进经验。
简单来说:软件架构模式就是可重复使用的软件结构风格。
多层应用架构设计
1、分层的含义
分层模型的理念就是将任务横向划分(如高层、中层、基层)为不同级别,而不是纵向。
基于组件的软件开发,组件根据 横向位置 划分为多层(N-Layer
):
- 下层组件负责对上层组件提供服务
- 上层组件可以使用下层组件定义的服务,但下层组件对上层组件一无所知。
- 层与层之间通常是不透明的,每一层都具有独立的职责
- 不同层的软件构件可以分布在多台机器上,也可以部署在同一台机器上,形成物理上的多层(
N-Tier
) - 层次模型的理念就是将整个任务横向划分为不同级别,而不是纵向
C/S出现之后,软件就被分层了:
- Client端的软件完成前台任务,Server端的软件完成后台任务(一般是DB Server);
- Client使用Server端的服务,依赖于Server端。
Internet出现之后,软件进一步分层:
- Client端的软件(浏览器)完成输入输出任务,Web Server上的程序提供业务逻辑处理,后台DB Server完成数据的存取。
- C/S常被称为传统的两层,B/S称为三层。
2、三个基本层次
传统的C/S应用程序
1.
界面窗口程序中包含所有的内容,如输入输出、界面逻辑控制、业务逻辑运算等。
2
系统架构是两层,应用架构没有分层。
经典的三层架构
1
表现层:处理用户和信息系统之间的交互。
可以是简单的命令行窗口,也可以功能完善的图形用户界面(胖客户端程序),如基于HTML的浏览器界面(瘦客户端程序),也可以是手机界面。
2
业务逻辑层:也称为领域层或应用层,是信息系统所有和领域相关的工作。
如根据输入数据或已有数据进行计算,可以是类库或Web服务。依赖于数据访问层获取数据或保存数据。
3
数据访问层:一般指与数据库的交互,主要责任是数据库记录的存取。
如组件中包含专门的数据访问类,或每个表对应一个数据访问类
扩展的五层架构1
表现层:等同于三层中的表现层。
2
控制层/中介层:是表现层和领域层的中介层,也称应用控制器。
主要表示业务逻辑中的工作流,一般针对于用例的事件流控制。此外还负责会话状态、数据的合成或分解等事务。
3
领域层:业务逻辑中的领域类的集合,不包含复杂工作流。
4
数据映射层:负责将基于对象的领域层数据映射到数据库关系表中的记录。也称为数据持久层,可自行开发或采用持久化框架。
5
数据访问层:负责数据库表的增删改查等操作。持久化框架中包含该层组件。
MVC
架构模式(当前最常用的架构)
1
模型(Model
):代表数据,使用对象及其属性实现。
2
控制器(Controller
):是模型与视图的联系纽带,客户的请求由控制器处理,它根据客户的请求调用模型的方法,完成数据更新,然后调用视图的方法将响应结果展示给客户。相应的,模型的更新与修改将通过控制器通知视图,保持视图与模型的一致性
3
视图(View
):是模型的外在表现形式,视图可以直接访问模型;查询数据信息,当模型中数据发生变化时,它会通知视图刷新界面,显示更新后的数据。
MVC
模式和三层模式有共同特点(业务逻辑、数据和表示的分离),但不完全遵守分层约定。
多层体系结构的优势
1
客户对数据的访问通过中间层进行了隔离,数据库的安全性提高了。
2
应用程序分布部署在多个物理节点上成为可能,从而增强了处理大量的用户负载或计算任务的能力,系统可靠性和响应速度得到了提高。
3
业务逻辑变化后,客户端程序基本不做改动,当组件接口不变时,某一层的改动不会影响其它层,这也意味着更好的重用和可维护性。
4
页面表现开发和业务逻辑开发分离,有效地利用开发人员的专长和开发技巧,并且能够 提高并行开发 能力。
3、软件框架
“不要重复发明轮子”
架构模式可以复用,当架构模式的复用形式不仅仅停留在逻辑层面(如蓝图、方案),而以物理的二进制组件的方式提供重用时,就产生了框架。
软件框架(software framework
)是对整个或部分系统可重用的设计和实现。
框架可以选择对某种架构模式的基本结构和接口机制进行编程实现,不仅封装该架构模式的基本元素对外提供类库,还封装底层公用的流程控制逻辑,从而直接为应用软件提供了最初的骨架。
框架就是一个半成品软件平台,软件框架和应用软件相当于:架构模式/框架/应用程序 => 菜谱菜式/半成品/成品菜;
引入软件框架之后,整个开发过程变成了“分三步走”:
1
决定应用架构
2
选择实现应用架构的现成框架
3
基于框架之下编写程序(简单、统一)
优点:代码具有相同规范和结构,易于理解和维护;提高效率;更稳定更可靠。
局限:囿于框架所限定的“框框”之内构建应用程序,比较死板,缺乏灵活性
软件架构与软件结构的区别
1
架构是抽象无形的,体现高层全局的决策,就像文章的中心思想和提纲。
2
结构是具体有形的,体现决策的贯彻,如同文章的每个段落及细节描述。
3
架构包含了结构的初步描述和决策。
4
相同架构的系统,具体结构允许有差异。
面向对象的软件结构设计、类图
根据架构设计类:边界类、实体类、控制类
软件设计原则,高内聚、低耦合
设计原则:总的来说就是抽象与复用(封装、信息隐藏);松耦合
高内聚:内聚指的是一个类的职责间相关联的紧密程度。如果一个类具有很多紧密相关的职责,而且只完成有限的功能,则这个类就具有高内聚性。
低耦合:耦合度是测量一个类连接、了解或依赖其他类的强弱程度。低耦合可以降低依赖性,减小变化带来的影响。
高层结构设计
包
包(Package
)是一种逻辑分组手段,可以取UML模型中的任何一种事物,将相关成分聚在一起,以构成更高层的组织单元——包。
分包(软件类的分组)有两种原则:
- 共同封闭原则(
Common Closure Principle
),一个包中的各个类应该是由于相似的原则而改变,即将一组职责相似、但以不同方式实现的类归为一个包中。比如按照层来进行分包就是这种类型。 - 共同复用原则(
Common Reuse Principle
),一个包中的各个类应该一起被复用,复用其中一个可能需要同时考虑同一个包中的其它协作类。通常和业务功能相关。
结构化设计方法
模块
模块(Module
) 一词使用很广泛。通常对应于用一个名字就可以调用的一段程序语句(子程序或函数。
- 模块具有输入和输出、逻辑功能、运行程序、内部数据四种属性。
结构图
- 模块:用长方形表示
- 调用:从一个模块指向另一模块的箭头表示前一个模块调用后一个模块。有循环调用和条件调用
- 数据:用带圆圈的小箭头表示从一个模块传递给另一模块的数据(有实义)
- 控制信息:带涂黑圆圈的小箭头表示一个模块传送给另一模块的控制信息
模块的联系
为了衡量模块的相对独立性,提出了模块间的耦合(Coupling
)与模块的内聚(Cohesion
)两个标准
- 耦合:模块和模块之间的联系程度
- 内聚:模块内部各元素之间的联系程度
设计目标:
1
模块内的联系越紧越好
2
模块间的联系越少越好
3
高内聚低耦合
模块间的耦合
模块间的耦合:耦合是影响系统复杂程度的一个重要因素。
耦合的三个因素:1
联系方式 ,2
、来往信息的作用,3
、模块间来往信息的数量。
耦合分类如下:
数据耦合: 模块间的来往信息可能作为信息使用,也可能作为控制信息的使用,若两个模块间传递的信息只做数据用被合称为数据耦合
标记耦合:如果调用模块将整个数据记录传递给被调模块,而被调模块只使用了部分数据项,则称为标记耦合或特征耦合。
控制耦合:一个模块将控制信息传递给另一个模块,以控制被调模块的内部处理逻辑。(可以分解)
公共环境耦合:如果两个模块共享同一全局数据,直接存取另一个模块的某些信息,称为公共耦合。也叫直接引用,
内容耦合:两个模块之间的内部属性有直接关联,也称病态耦合。(某些GOTO语句)
模块的内聚
模块的内聚可以分为以下几类:
1、
偶然内聚(coincidental cohesion
)
2、
逻辑内聚(Logical cohesion
)
3、
时间内聚(temporal cohesion
)
4、
步骤内聚(procedural cohesion
)
5、
通信内聚(communicational cohesion
)
6、
顺序内聚(Sequential cohesion
)
7、
功能内聚(functional_cohesion
):聚合程度是最高。
作用范围与控制范围:
一个判断的作用范围是所有这样的模块的集合,这些模块类含有依赖于这个判断结果的处理.
一个模块的控制范围,是指它本身集体所有下属模块的集合。这里下属模块包含直接下属模块及下属模块的下属模块。
模块的扇出:是指模块的直属下层模块的个数,
模块的扇入:是指有多少个上级模块调用它。
面向对象设计方法
根据架构设计类:一、边界类 二、实体类、三、控制类
顺序图的基本元素有对象、参与者、生命线、激活框、消息和消息路线。
设计原则
设计原则:单一职责原则、开放封闭原则、Liskow替换原则、依赖倒置原则、接口隔离的原则。