当前课程知识点:软件工程 > 第11章 软件系统设计 > 11.1 软件体系结构概念 > 讲授视频
随着软件技术
和应用的不断发展
软件系统的规模越来越大
其复杂度也越来越高
在这种情况下
代码级别的软件复用
已经远远不能满足
大型软件开发的要求
面对日益复杂的软件系统的
设计与构造
软件工程师
需要考虑的关键问题是
对整个系统的结构和行为
进行抽象
一方面是寻求更好的方法
使系统的整体设计更容易理解
另一方面
是寻求构造大型复杂软件
系统的有效方法
实现系统级的复用
我们在前面
做过一个性能分析的实验
这个实验要求编写一个程序
用于统计一个文本文件中
每个英文单词出现的频率
并输出词频最高的100个单词
大家在编写这个程序的时候
重点会考虑哪些部分的设计
对于这个程序的设计
我们主要是考虑
选择合适的分词方法和查询算法
建立可以实现
快速查找的数据结构
还会涉及到
外部存储文件或数据库的构造
在代码构造时
可以调用已有的Python代码库
也就是说
编写小规模的程序
主要关注的是算法的选择
数据结构的设计
和数据库的构造
如果是开发一个
Web信息检索系统
又会关注哪些方面
这个系统要对发布在
Web上的信息资源
进行搜集 整理和组织
形成一个信息资源索引库
并通过检索界面
把最符合用户要求的网站
或者是网页提供给用户
显然
这个系统
比前面的词频统计程序
要复杂得多
无法简单地用数据结构和算法
来进行描述和设计
我们现在对整个系统的结构
和行为进行抽象
一般网页信息检索的过程
大概是这样
系统先要从网上抓取网页
然后对网页信息进行处理
建立索引数据库
在用户进行查询的时候
根据输入的查询关键字
在索引数据库中进行搜索
并对搜索结果进行处理和排序
最后返回一系列
与用户查询相关的网页信息
这样整个系统
就可以抽象成三个部分
网页搜集 预处理
和检索服务
对应上面的过程
整个系统
可以划分成三个功能模块
信息采集模块
实现网页搜集功能
标引处理模块
实现预处理功能
信息检索模块
实现检索服务的功能
除了模块分解之外
我们还要考虑
使用什么策略
来实现非功能需求的目标
比如说
可以采用分布式的文件系统
和计算框架
提高大规模网页搜集
和检索的效率等等
从上面的事例可以看出
对于大规模的复杂系统来说
对系统的全局结构设计和规划
变得比算法的选择
和数据结构的设计
明显要重要得多
在工程领域
体系结构设计
被广泛地应用于
处理复杂系统的设计问题
比如说大型的客机
在整体上
被划分成机翼 机身 尾翼
起落装置和动力装置等
不同的组成部分
它的总体结构
也要根据技术的要求
和使用环境
来确定飞机的外形 总体布局
发动机选型等
机体的设计
还要满足强度 刚度 疲劳
损伤容限
一些安全性的要求
体系结构这个词
起源于建筑学
它是从系统的宏观层面上
描绘出整个建筑的结构
把一个复杂的建筑体
拆分成一些基本的建筑模块
并通过这些基本的模块
进行有机地组合
形成整个建筑
建筑的体系结构设计
要满足坚固 适用
赏心悦目的要求
具体包括以下方面
第一
有哪些基本的建筑单元
比如说
砖 瓦 梁 柱 屋顶
外墙 门窗等
第二
如何把这些基本单元进行组合
形成整体的建筑
第三
建筑单元怎么搭配才比较合理
比如说外形是否美观
符合承重和受力的要求等
第四
不同类型的建筑
有什么典型的结构
比如说
欧洲古典风格
和中国园林风格
就是两种不同的建筑类型
第五
如何快速
节省地进行建造和施工
第六
对于建造完成的建筑
怎么样才能适当地修改
第七
怎么才能保证单元的修改
不会影响整个建筑的质量
软件体系结构
已经在软件工程领域
获得了广泛应用
它包括构成系统的
设计元素的描述
设计元素之间的交互
设计元素的组合模式
以及在这些模式中的约束
软件体系结构
主要包含五个方面的内容
第一是构件
它代表着一组基本的构成要素
第二是连接件
也就是
这些要素之间的连接关系
第三是约束
它是作用于这些要素
或者连接关系上的一些限制条件
第四是质量
它是系统的质量属性
像性能 可扩展性 可修改性
可重用性 安全性等
第五是物理分布
它代表着这些要素连接之后
形成的拓扑结构
描述了软件到硬件的影射
简单地说
软件体系结构由构件+连接件
+约束组成
它提供了
在更宏观的结构层次上
来理解系统层面问题的一个骨架
它主要关注于
把一个复杂系统
从整体到部分的
一个最高层次的划分
对于设计模块的一个功能定义
以及如何把这些模块
组合成为一个完整的系统
系统的分解
要满足设计目标的要求
反映开发中
具有重要影响的设计决策
从而保证系统的质量要求
在软件体系结构的概念中
构件是具有某种功能的
可复用的软件结构单元
它们表示系统中
主要的计算元素和数据存储
任何在系统运行中
承担一定功能
或者发挥一定作用的软件体
都可以看作是构件
像函数 模块 对象 类
文件 相关功能的集合等
构件作为一个封装的实体
只能通过它的接口
和外部环境进行交互
其内部的结构是被隐藏起来的
构件的功能
以服务的形式体现出来
并通过接口向外发布
进而产生与其他构件之间的关联
连接是构件之间
建立和维护行为关联
和信息传递的一个途径
它需要两个方面的支持
一个是连接发生和维持的机制
另一个是连接的协议
一般来说
基本的连接机制
包括过程调用 中断 I/O
事件 进程 线程 共享
同步 并发 消息 远程调用
动态连接 API等
协议是连接的规约
对于过程调用来说
可以是参数的个数和类型
参数排列次序等
对于消息传送来说
可以是消息的格式
除了连接实现的难易程度之外
同步或者异步
是影响连接实现的复杂因素之一
连接件表示构件之间的交互
并实现构件之间的连接
比如说
管道 过程调用 事件广播
客户机-服务器
数据库连接等
都是属于连接件
连接件也可以看作
是一类特殊的构件
它和一般的构件的区别在于
一般构件是软件功能设计
和实现的承载体
而连接件是负责完成构件之间
信息交换和行为联系的专用构件
好的开始是成功的一半
初期的总体设计
是决定软件产品成败的
一个关键因素
往往错误的设计决策
会造成灾难性的后果
在软件设计过程中
我们可以对一些
经过实现证明的体系结构
进行复用
从而提高设计的效率和可靠性
降低设计复杂度
另外
我们也可以把一些公共部分
抽象提取出来
形成公共类和工具类
为大规模开发提供基础和规范
体系结构的设计
要具备灵活性
在产品开发的演化过程中
可以很方便地增加新的功能
更好的适应用户需求的变化
由于体系结构
构件了一个相对小的简单的模型
这样就把复杂的问题简单化
使系统更加易于理解和实现
软件体系结构
突出体现了早期的设计决策
展现出系统满足需求的能力
软件系统规模
在迅速增大的同时
软件开发方法
也经历了一系列变化
软件体系结构
也从最初的一个模糊概念
发展成一个日趋成熟的技术
从20世纪70年代开始
出现了面向过程的开发方法
系统被划分成不同的子程序
子程序之间的调用关系
就构成了系统的结构
软件结构
成为开发的一个明确概念
到了80年代
面向对象方法逐渐兴起和成熟
系统被划分成不同的对象
并采用统一建模语言
来描述系统的结构
90年代开始
软件开发强调构件化技术
和体系结构技术
体系结构也成为软件工程领域的
一个研究热点
出现了体系结构风格 框架
和设计模式这样一些概念
2000年之后
面向服务的体系结构
成为面向对象模型的替代模型
它具备分布式 跨平台
互操作和松散耦合等
这样一些特点
致力于解决企业信息化过程中
不断变化的需求
和异构环境集成这样一些难题
在这个发展过程中
软件系统的基本模块
它的粒度越来越大
系统的结构越来越趋向分布
和开放
所解决的问题
也从技术本身
转向商务的过程
下面我们简单说明一下
体系结构风格 设计模式
和框架的概念
以及它们的区别
体系结构风格
描述了某一个特定应用领域中
系统组织的惯用模式
它反映了领域中
众多系统所共有的结构
和语义特性
比如说MVC就是一种
常见的体系结构风格
设计模式
是描述了软件系统设计过程中
常见问题的一些解决方案
一般是从大量的成功实践中
总结出来的
而且被广泛公认的一些实践
和知识
观察者模式
是一种常用的设计模式
它主要用于解决
事件处理的问题
软件框架是由开发人员定制的
应用系统的骨架
它是整个
或者部分系统的可重用的设计
一般由一组抽象的构件
和构件实例之间的交互方式组成
像Django就是一个
开放源代码的外部应用框架
是由python写成的
包括面向对象的映射器
基于正则表达式的URL分发器
视图系统和模板系统
这样一些核心的构件
关于框架和体系结构
体系结构是一种设计规约
而框架是一种具体实现
只不过它实现的
是应用领域的共性部分
是领域中最终应用的模板
体系结构的目的
是指导软件系统的开发
而框架的目的是设计的复用
确定了框架之后
软件体系结构也随之确定
对于同一种软件体系结构
比如说Web开发中的MVC
可以通过多种框架来实现
像前端有ANGULAR
BACKBONE
后端有python的django等框架
对于框架和设计模式而言
框架给出的
是整个应用的体系结构
而设计模式给出的
是单一设计问题的解决方案
比如说一个网络游戏
可以基于网易的Pomelo
框架开发
这是一个基于Node.js的高性能
分布式游戏服务器框架
在实现某个动画功能时
可能会使用观察者设计模式
来实现自动化的通知更新
从这个例子可以看出
设计模式的目的
是改善代码结构
提高程序的结构质量
框架强调的是设计的重用性
和系统的可扩展性
它的目的
是缩短开发周期
提高开发质量
我们在这一节课
介绍了软件体系结构的概念
作用和发展历史
并且解释了体系结构风格
设计模式和框架
这样几个常见术语
今天的课就讲到这里
谢谢大家
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)