当前课程知识点:软件工程 >  第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 软件无处不在

--讲课视频

-1.2 软件的本质特性

--讲授视频

-1.3 软件工程的产生与发展

--讲授视频

-1.4 软件工程的基本概念

--讲授视频

-1.5 软件质量实现

--讲授视频

-1.6 业界人士谈软件工程

--海芯科技创始人施侃乐访谈

-测验题--作业

-讨论题

--讨论题

-作业题

--第一张 作业题

第2章 编写高质量代码

-2.1 编程过程与规范

--讲课视频

-2.2 良好的编程实践

--讲课视频

-2.3 Python集成开发环境

--讲课视频

-2.4 代码静态检查

--讲课视频

-2.5 代码性能分析

--讲课视频

-2.6 结对编程实践

--讲课视频

-2.7 刘贺谈软件工程

--讲课视频

--讨论

-测验题--作业

-作业题

--第二章 作业题

第3章 单元测试

-3.1 单元测试概述

--讲课视频

-3.2 黑盒测试方法

--黑盒测试方法

-3.3 白盒测试方法

--基本概念

--代码覆盖标准

--基本路径测试

-3.4 单元测试工具

--单元测试工具

--html

-测验题--作业

-作业题

--第三章 作业题

--作业题附件

第4章 软件开发过程

-4.1 软件过程

--讲课视频

-4.2 软件过程模型

--讲课视频

-4.3 敏捷开发过程

--讲课视频

-4.4 微软公司开发过程

--邹欣经理自我介绍

--微软开发过程之一

--微软开发过程之二

-测验题--作业

第5章 团队开发管理

-5.1 团队组织与管理

--讲课视频

-5.2 项目沟通管理

--讲课视频

-5.3 软件项目计划

--讲课视频

-5.4 软件项目估算

--讲课视频

-测验题--作业

-讨论题

--讨论

第6章 敏捷开发与配置管理

-6.1 敏捷开发之Scrum

-- 敏捷开发之Scrum

--html

-6.2 用户故事与估算

--讲课视频

-6.3 团队协作工具Tower

--Tower工具介绍(1)

--Tower工具介绍(2)

-6.4 配置管理

--讲课视频

-6.5 配置管理工具Git

--讲课视频

-测验题--作业

-作业题--作业

第7章 需求获取

-7.1 需求工程师

--讲课视频

-7.2 需求定义

--讲课视频

-7.3 需求的类型

--讲课视频

--讲课视频(2)

-7.4 需求工程过程

--讲课视频

-7.5 需求的主要来源

--讲课视频

-7.6 需求获取技术

--讲课视频

--讲课视频二

--讲课视频三

-7.7 撰写需求文档

--讲课视频

-测验题--作业

-讨论题

--讨论

第8章 用例建模

-8.1 用例建模概念

--讲课视频

-8.2 用例建模过程

--讲课视频

-8.3 用例建模精讲

--讲课视频

-8.4 建模工具介绍

--讲课视频

-8.5 微信抢票应用案例

--讲课视频

-测验题--作业

-讨论题

--讨论

第9章 面向对象分析与设计

-9.1 面向对象分析

--讲课视频

-9.2 CRC卡片分拣法

--讲课视频-1

--讲课视频-2

-9.3 面向对象设计

--讲课视频-1

--讲课视频-2

-9.4 类图建模

--讲课视频-1

--讲课视频-2

-第9章 面向对象分析与设计--测验题

-讨论题

--讨论

第10章 行为建模

-10.1 顺序图概念

--讲课视频

-10.2 顺序图建模

--讲课视频

-10.3 顺序图风格

--讲义视频

-10.4 状态建模

--讲课视频

-10.5 状态图

--讲课视频

-10.6 状态图精讲

--讲义视频

-测验题--作业

-讨论题

--讨论

第11章 软件系统设计

-11.1 软件体系结构概念

--讲授视频

-11.2 软件设计原则

--讲授视频

-11.3 软件体系结构风格(一)

--讲授视频

-11.4 软件体系结构风格(二)

--讲授视频

-11.5 软件体系结构风格(三)

--讲授视频

-11.6 软件设计过程

--讲授视频

-11.7 Web系统架构设计

--讲授视频

-11.8 数据库选择策略

--讲授视频

-测验题--作业

-作业题

--html

--html

--html

-作业题--作业

第12章 软件交互设计

-12.1 交互设计概述

--讲授视频

-12.2 交互设计目标

--讲授视频

-12.3 GUI设计原则

--讲课视频

-12.4 KLM效率模型

--Video

-12.5 Fitts定律

--讲授视频

-12.6 交互设计过程

--讲授视频

-测验题--作业

第13章 软件系统测试

-13.1 软件测试概念

--讲课视频

-13.2 软件测试类型

--讲课视频

-13.3 软件功能测试

--讲课视频

-13.4 软件性能测试

--讲课视频

-测验题--作业

第14章 软件交付与维护

-14.1 软件部署与交付

--讲课视频

-14.2 软件演化与维护

--讲课视频

-测验题--作业

第15章 期末考试与总结

-第一部分:基础知识

-第二部分:编程与测试(选做)

--编程与测试(选做)

讲授视频笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。