当前课程知识点:软件工程 > 第11章 软件系统设计 > 11.2 软件设计原则 > 讲授视频
设计原则是系统分解
和模块设计的基本标准
应用这些原则
可以使代码更加灵活
易于维护和扩展
虽然不同的程序设计语言
可能有一些自己语言特点的原则
但是抽象 封装 模块化
层次化和复用这样一些原则
应该是所有语言都通用的
下面我们分别介绍
它们的含义
抽象是一种思考
和解决问题的方法
它只是关注事物中
和问题相关的部分
而忽略其他无关的部分
现在看一个例子
假设一个应用程序
要连接SQL Server数据库
那么一种实现方法
是应用程序
直接使用SQLServerConnection类
来实例化一个对象
然后在程序中调用它
但是如果我们需要把数据库
换成MySQL
这个时候
程序中所有
SQLServerConnection
就要全部换成MySQLConnection
显然数据库的更换
对应用程序的修改
造成很大影响
现在换一种方法
我们提供一个
通用的数据库连接接口
DBConnection
应用程序调用这个接口
对数据库进行连接
不同的数据库
各自具体实现这个接口
通过这种方式
只要接口不变
数据库发生更改时
只会影响具体接口的实现
而不会影响上面的应用程序
显然抽象是认识复杂事物过程中
使用的一种思维工具
它可以起到降低复杂性
和增强扩展能力的作用
封装和信息隐藏
是把一个软件单元的实现细节
进行隐藏
然后通过外部可见的接口
来描述它的特性
需要注意的是
单元接口应该设计的尽可能简单
并把单元对于环境的假设和要求
降低到最小
模块化的概念
在前面的课程中已经提到
它是把一个复杂的系统
分解成多个更小的模块
模块是可以组合 分解
和更换的单元
模块之间通过接口进行联系
这也是分而治之的思想
通过把一个问题
分解成多个小的独立
而且相互作用的组件
来降低大型软件开发的复杂度
对软件系统
进行模块化分解的原则
就是高内聚 低耦合
我们先简单介绍一下内聚
和耦合的概念
所谓内聚
是一个模块
或子系统内部的依赖程度
它描述的是模块内的功能联系
高内聚的模块
应该只做
而且做好一件事
如果一个模块
或子系统的元素
都是彼此相关的
而且都执行类似的任务
那么它的内聚性就比较高
如果含有很多彼此不相关的元素
它的内聚就比较低
所谓耦合
是指不同模块之间
相互连接的程度
如果两个不同模块之间
相对独立
或者有很少的连接依赖
那么其中一个发生变化的时候
对另一个产生的影响就很小
反过来
如果它们之间有很强的关联
那么一个发生变化
就可能对另一个
产生很大的影响
下面我们举两个例子
来说明这两个概念
这是一个角色扮演游戏的
部分类图
不同角色的人物
可以在一定的区域中移动
当双方相遇之后
会进行打斗
在第一个方案中
我们把所有的类
都放在一个GameCE子系统中
但是我们仔细分析一下
就会发现
游戏角色和布局环境
这两个部分所实现的任务
是完全不同的
而且它们的关联也不是非常紧密
根据高内聚的原则
我们可以把它们分成两部分
其中Characters
只和游戏角色有关
Environment只和布局环境有关
而且每一个部分的功能
都是单一职责的
显然第二个方案
内聚性更高
第二个例子
在一个软件系统中
有三个子系统
A B C
都要访问同一个关系数据库
这里给出的设计方案
是三个子系统直接访问数据库
大家认为
这个方案有什么问题吗
在这个方案中
数据库和A B C
三个子系统
形成了高耦合的情况
当数据存储方式发生变化时
三个系统都会发生改变
为了降低这四个部分之间的耦合
我们在A B C三个子系统
和数据库中间
增加一个存储子系统Storage
这样就屏蔽了底层数据库的变化
对上层子系统产生的影响
当底层的存储机制
发生变化的时候
只需要修改存储子系统
这样做之后
子系统分解的整体耦合度
就降低了
在系统被划分成若干模块之后
我们可以分别在一个模块的内部
来处理那些数量
已经大量减少的元素
但是为了确保系统的完整和一致
我们同时还必须在系统的层面
来处理这些模块之间的关系
层次关系是一种常见的系统结构
一个系统的层次分解
会产生层次的有序集合
这里的层
是指一组
提供相关服务的模块单元
通常是通过使用另一层的服务
来实现本层的功能
层一定是有序组织的
每一层可以访问下面的层
但是不能访问上面的层
最底层是不依赖于任何层的
最顶层也不会被任何层来调用
在一个封闭式的结构中
每一层只能访问
和它相邻的下一层
在一个开放式的结构中
每一层还可以访问
下面更低的其他层次
当然层的数目不宜过多
还有一种划分
是把系统分解成
相互对等的若干模块
比如说
图中第二层的B C D
和第三层的E F G
这些模块单元相对独立
每一个模块之间的依赖比较少
总的来说
一个大的系统可以逐层分解
直到所分解的每一个模块
可以简单到
一个开发人员可以独立实现为止
但是由于不同模块单元之间
存在接口
所以每一个模块
都增加了处理的开销
过度的划分和分解
会增加额外的复杂性
这是安卓操作系统
层次结构的一个示例
它的最底层是Linux内核
它为了安卓提供了启动
和管理硬件
以及安卓应用程序
最基本的软件
在内核之上
是一系列共享程序库
为开发者和类似终端设备拥有者
提供了必要的核心功能
应用框架
支持第三方开发者之间的交互
使他们能够通过抽象的方式
访问所开发的应用程序
需要的一些关键资源
最上层是运行在虚拟机上的
JAVA应用程序
复用是利用一些
已经开发的软件元素
来生成新的软件系统
这样做可以提高开发效率
和软件质量
软件由不同粒度的复用
代码复用是一种最常见的形式
构件库中的源代码构件
具有更高的通用性和可靠性
像Pyhton社区中
就有大量实用的构件库
软件体系结构复用
是采用已有的软件体系结构
对系统进行设计
通常它支持更高层次
更大粒度的一个系统复用
框架复用是对特定领域中
存在的一个公共体系结构
及其构件进行复用
Python就拥有大量的框架
比如说django flask tornado等
设计模式是通过为对象协作
提供思想和范例
来强调方法的复用
应该说设计模式
是一种设计思想
但是不同语言的特性
会影响设计模式的实现
比如说C++语言实现设计模式
是充分利用集成和虚函数
这样的机制
但是Python语言提供了
和C++完全不同的对象模型
而且它有一些特殊的语法
比如说装饰器
这个本身就应用了设计模式
所以Python
在运用和实现设计模式上
与其他的一些面向对象语言
是不同的
-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 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)