当前课程知识点:软件理论与工程 >  第3章 软件设计 >  3.2 设计的概念 >  3.2 设计的概念

返回《软件理论与工程》慕课在线视频课程列表

3.2 设计的概念在线视频

下一节:3.3 设计模型元素

返回《软件理论与工程》慕课在线视频列表

3.2 设计的概念课程教案、知识点、字幕

那么我们下面看一下

设计有哪些基本概念

第一个基本概念是抽象

设计当中会涉及到数据抽象

过程抽象

以及控制的抽象

抽象的意思就是说

我们在设计的之初

我们需要在一个比较高的抽象层次上

对这个设计进行描述

然后随着我们设计内容的推进

我们对这个抽象不断的细化

使得这个设计对象的内容变得更加具体

第二个设计的基本概念是体系结构

体系结构实际上就是我们的软件的整个的结构

也就是我们软件的整体框架

第三个设计的基本概念是模式

模式是已经被证实了的

解决方案的精髓

已经被证实了

针对某个问题的有效的解决方案

我们可以拿来进行重用

和复用

第四个设计相关的概念是关注点分离

任何一个复杂的问题

如果可以被分解为若干块儿

那么这个复杂的问题的复杂度

就会被降低

那么复杂问题就更容易的被处理

那么关注点分离的一个很直接的结果

就是模块化

我们的第五个设计的基本概念

就是模块化

模块化是要把数据和功能进行划分

把相对联系比较紧密的数据和功能

包装在一个模块里面

第六个设计的基本概念是

信息隐蔽

信息隐蔽的目的是

我们要把一个模块内部的数据

方法

过程

和算法

封装在一个模块的内部

只有当这个模块需要与外界进行交互的时候

我们才通过接口

来对外界进行一些消息的传递

这个消息的传递

包括模块内部的消息的传出

和外界消息的传入

那么信息隐蔽

可以控制我们模块内部的数据和方法

都封装在模块的内部

那么这个设计特征

就是

信息隐蔽

下一个特征是功能独立

我们通过一个模块的设计

希望可以使得模块是专一的功能

和比较低的耦合

下一个设计的特征是求精

求精是与我们前面的抽象的概念相对应的

我们的求精的过程就是

所有抽象的精化的

细节的实现的过程

当抽象的概念被设计出来

然后随着求精的过程

我们会逐步的把细节

添到这个抽象的一个数据对象

或者是过程当中

还有的设计概念是重构

重构是一种简化设计的重新组织的技术

也就是说当我们把一个概念设计出来之后

或者是实现了以后

我们可以在保证外部功能不变的情况下

对内部设计进行优化

后面我们会解释在重构当中

我们可以进行什么样的优化

还有最后一个设计相关的概念是设计类

设计类我们提供一些个设计的细节

使得分析类得以实现

这是我们设计相关的一些基本概念

那么接下来

我们会逐一的对每一个概念进行详细的阐述

首先我们看一下抽象

我们在抽象里面

首先看一下数据抽象

比如这个图中显示的是一个门的数据结构

在门这个数据结构一开始

我们可能只是定义出来门这样一个数据结构

在我们的程序当中会被用到

随着我们对系统的设计的推进

我们会对门这个数据结构进行细化

会加上这个门相关的属性

比如门这个数据结构会有

制造商

会有模块数

会有门的类型

以及会有它的一些相关其他的属性

我们将门实现为一个数据结构

随着我们设计后期的继续深入

我们会对门这个属性进行进一步的细化

刚才是数据抽象

我们下面看一下过程抽象

还是拿门来举例

门相关对应的一个过程是开门

我们对开门这一个过程进行一个抽象

最开始我们只把它定义为开门这样一个过程

那么随着我们对这个设计的进一步的推进

我们会把开门逐步的细化为

要实现进门的算法的细节

所以我们通过过程抽象可以实现为一个

开门这样的一个“知识”对象

这个知识对象会与进门有关

下面我们看一下体系结构这个设计的概念

软件的整体结构

和这种结构为系统提供概念完整性的一个方式

可以叫做体系结构

体系结构有很多特性

首先我们来看一下体系结构的结构特性

体系结构设计表示定义了系统的构件

构件被封装的方式

以及构件之间的相互作用的方式

那么这个构件可以包括比如

模块

对象

还有过滤器等等

我们结构的特性展示出了构件

构件被封装的方式

和构件之间的相互作用的方式

例如

对象封装了数据和过程

过程操纵数据

并通过方法来调用这些数据进行交互

体系结构同样还具有一些外部功能的特性

体系结构设计描述

应当指出设计体系结构

如何去满足需求

体系结构作为一个软件的整体架构

我们可以做这样一个比喻

体系结构就好比我们要建造一个房屋

我们会画一个平面图

这个平面图会描述出来

这个房屋哪里是它的卧室

哪里是它的客厅

哪里是它的厨房

那我们的体系结构

和我们的房屋构建的平面图比较类似

我们通过房屋的平面图

可以一目了然的了解这个房屋

大致分为

什么样的一个结构

由哪些功能

由哪些组成部分

那么我们的软件体系结构呢

可以指出来我们软件体系结构

有哪些组成部分

如何去满足需求

那么这些需求包括

性能需求

能力需求

可靠性需求

安全性需求

可适应性需求

以及其他系统特征需求

另外

我们的体系结构

还要可以表示出来相关系统族

体系结构

应当能够抽取出

在一类相似的系统开发中

经常遇到的重复性模式

那么本质上呢

设计应当能够重用体系结构的构件

下一个设计的基本概念是模式

模式这个概念对大家可能会比较的抽象

我们的模式通常

我们还是做这样一个比喻

我们的模式可以是

我们在建造一个房屋的时候

先去参考的一个样板

比如我们要建造一个教室

通常在教室前面会有黑板

教室的后面会有很多桌椅

那么这样就是一个模式

那么有了这样一个模式

我们可以在这个模式的基础上

继续展开

去添加一些细节

比如我们在什么地方放灯

什么地方放开关这样的细节

设计模式是已经被证明有效的

有用的解决方案的一个精髓

模式可以总结成设计模式模板

我们可以对设计模式的模板

一些相关属性进行描述

比如模式名

以简短但富有表现力的名字描述模式的本质

还有模式的目的

描述这个模式是用来做什么的

也称为是列出这个模式的别名

还有模式的动机

提供问题的一些实例

还有设计模式的适用性

指出了这个模式是用在什么样的

具体场景

来设计出来的解决方案

还有模式的结构

描述要求实现模式的类

参与者

描述要求实现模式的类的职责

协作

描述了参与者如何协作以完成他们的职责

结构

结构描述了影响模式的设计力量

和在实现模式时必须考虑的潜在的权衡

最后一项是相关模式

描述出了

相关的设计模式之间的交叉索引

下一个涉及的概念是关注点分离

任何一个复杂的问题

如果被分解为可以独立解决的

和优化的若干个块儿

那么该复杂问题就可以更容易的被处理

一个关注点是一个特征或者行为

被指定为软件需求模型的一个部分

那么我们通过将关注点

分隔成为更小的关注点

使得解决一个问题

需要付出更少的工作量

和更少的工作时间

关注点分离导致的一个直接的结果就是模块化

模块化是软件的单一属性

它使程序能被智能化的管理

软件工程师通常难以掌握单块的软件

什么是单块的软件呢

就是这个软件完全由一个模块来构成

那么这个模块一定是很大很复杂的一个模块

那么单块软件

必然它的控制路径的数量

引用的跨度

变量的数量和整体的复杂度

都非常的高

那么使得理解这样的软件几乎是不可能的

所以

几乎在所有的情况下

为了理解更容易

我们都应该将设计划分成为多个模块

这样做的结果

使得我们构建软件所需要的成本

会随之降低

那么我们把大的软件切分成若干个模块

会使得我们软件开发的成本

不断的降低

这样是不是意味着我们的模块越多越好呢

事实并非如此

大家可以看一下这张图

图上面灰色的部分

表示着随着模块数量的增加

我们的模块成本在不断的降低

但是这张图的红色的部分会展示出来

随着模块数量的增加

我们对所有的模块进行集成的成本

会随着模块数的增加而不断的升高

我们把一个大的问题

拆分成几个模块来解决

但是这些模块需要相互协作

构成一个统一的系统

来解决软件的整体的问题

所以在我们拆分成若干个模块之后

我们还要对这些模块进行集成

当模块数量变得越来越多的时候

我们对多个模块进行集成的成本

就会不断的增加

所以我们应该在单个模块的开发成本

和多个模块的集成成本之间做一个权衡

那么在这张图上我们可以看出来

在比较靠中间的位置是模块数量适中

集成成本适中

也就是模块开发成本

加上模块的集成成本

最优的一个位置

那么这个就是我们说的

对于特定的软件设计

选择一个正确的模块数量

下一个设计的基本概念是信息隐藏

首先我们看一下

我们为什么要做信息隐藏

首先

进行信息隐藏

可以减少我们的负效应的

可能性

所谓的负效应是说

当我在某个模块内部有一些错误产生的时候

我们不会波及到其他的模块

那么这样就实现了信息隐藏

第二个原因是我们要限制全局变量的使用

因为全局变量会影响到其他模块的设计质量

第三

我们要强调通过接口来对模块进行通信

我们要控制接口

通过接口与模块内部的数据结构

或者是过程

或者是算法来进行通信

还有

我们不提倡使用全局变量

因为全局变量

会使得单个模块对变量的影响

影响到其他的模块

再有使用信息隐藏可以导致封装

高质量的设计软件必须要使用封装

将过程

数据和算法

封装到这个模块的内部

还有我们通过信息隐藏

可以开发出来高质量的软件

因为我们将模块的内部的算法

过程和数据

限制在这个模块的内部

在这个模块内部使用局部的数据

来进行算法实现

这就是我们为什么要使用信息隐藏的原因

我们看一下这张图

这张图上最左边

我们通过客户端的程序

通过控制接口

来访问这个模块内部的一些

需要对外传递的消息

那么在这个模块的内部

我们使用了信息隐藏

把算法

数据结构和资源分配等

模块内部的一些属性

封装在模块的内部

我们可以在模块的内部

实现具体的一些算法的设计决策

只有对外进行交互的时候

需要通信的时候

我们才通过我们的控制接口

与外界进行消息传递

这个就是我们信息隐藏的核心思想

下一个设计概念是功能独立

我们通过开发具有专一的功能的模块

来避免与其他模块有过多的交互

这样我们可以实现模块的功能独立

在讲到功能独立的时候

我们会涉及到两个其他的小的概念

一个是内聚性

一个是耦合性

内聚性显示了某个模块内部相关功能的

关联的强度

一个内聚的模块执行一个独立的任务

与程序的其他部分构件

只需要很少的交互

简单地说

一个内聚的模块

在理想的情况下应该只完成一件事

那么在完成这一件事情的时候

它通常不需要其他模块的参与

那么这样这个模块的内聚性就比较高

那么另一概念是耦合性

耦合性显示了模块和模块之间的

相互依赖性关系

耦合性依赖于模块之间的接口的复杂性

引用

或者是进入模块所在的点

以及什么数据通过来接口进行传递

那么我们一个理想的设计原则是

高内聚

低耦合

这个就是我们功能独立的核心意思

那么下一个设计概念是逐步求精

比如我们刚才讲到的过程

抽象

我们要定一个开门这样的过程

我们在图中红色的部分讲述

我们定义了开门这样一个高级抽象的过程

那么随着我们对设计的推进

我们可以

添加了一些

这个过程的基本步骤

比如第一步我们要走向门

第二步我们要伸向把手

第三

我们要打开门

第四

我们要走进门

第五

我们要关门

这是我们对开门这个过程

第一次进行求精得到的结果

那么这样一个求精结果

对于后期软件的具体实现

是不足够的

所以我们还需要不断地迭代

逐步的求精

比如我们又进行了第二次的求精

那么我们蓝色的部分显示

第二次

对开门这个过程进行求精的结果

我们首先一直重复

直至把门打开

顺时针的旋动把手

如果把手不能转动

那么要拿出钥匙

搜到正确的钥匙

然后把钥匙插进锁孔

然后我们要推

或者是拉这个门

然后移动脚步走进门

那么这是我们对开门这个过程

进行再一次求精的结果

那么这个例子展示出来

当我们要对于过程进行细化

详细设计的时候

我们需要从一个高的抽象层次

逐步向具体化的一些实现细节

设计细节进行演变的一个迭代过程

当我们对一个模型进行考察的时候

我们通常有两个视角

第一个是我们从这个模型的外部来看

我们说

从模型的外部

来观察这个模型所展现出来的一些个特征

比如图上在描述这个盒子

我们从外面看

我们可以测量这个盒子的外部轮廓

它有多大

那么还有一个视角是

我们站在盒子的内部

从内部看

我们这个盒子内部

比如说它有什么

那么这是内部视角

那么根据我们的外部视角和内部视角

我们来解释一下什么叫做重构

重构是使用这样一种方式

改变软件系统的过程

首先它不改变代码的外部行为

或者是不改变设计的外部行为

而是改变其内部的结构

也就是说我们通过一种方式

去优化其内部的结构

但是并不改变其对外展示出来的特征

或者展示出来的功能

这种方式就叫做重构

那么当我们重构软件的时候

通常我们可以从以下几个方面

检查我们现有的设计是不是足够好

首先我们可以检查一下

我们的设计里边是否有一些

冗余的东西

如果有冗余的东西

我们可以想办法把冗余的东西去掉

那么这样我们就实现了一定程度的优化

那么这就是重构的

一个方法

那么我们还有一些重构的其他方法

比如

我们是不是还有一些设计元素没有使用到

那么我们可以尝试

增加其他的设计元素

使得我们的设计更为优化

更为合理

还有我们考虑我们的设计里边

是不是有一些低效的

不必要的算法

那么我们可以通过

改进我们内部的

低效的不必要的算法

来优化我们这个软件的整体结构

再有

我们可以考虑一下我们的模块内部

是否有一些拙劣的

不恰当的数据结构

那么可能在最开始

我们为了快速的达到系统

对外展示的功能和行为

我们可能匆忙的

进行了一些数据结构的设计

但当我们完成了外部的功能和行为之后

我们返回来再看我们内部的数据结构

我们可能会想到一些更合理的

更优化的数据结构

来实现同样的外部行为

那么我们可以对拙劣的

和不恰当的数据结构进行改进

那么这同样是一个重构

还有我们考虑一些其他的设计方面的不足

我们修改这些不足

以获得更好的设计

这些就叫做重构

那么重构就是

在不改变外部行为的情况下

对内部结构进行优化

我们最后一个看的设计概念是设计类

我们在分析的时候

我们会有一些分析类

比如 我们要开发一个学生选课系统

在这个系统里面我们会有学生类

教师类等等

这些都是在我们进行需求分析的时候

总结出来的需求分析的成果

分析类

那么在设计时

这些分析类可以通过逐步精化

转变为实体类

我们的设计类主要包括实体类

边界类和控制类

那么我们刚才在分析模型当中提到的分析类

在设计过程当中

就可以进化为实体类

那么第二种设计类

边界类是什么呢

边界类是在设计中

创建接口被开发的

例如

我们的交互式的屏幕

和需要打印的报表

用户看到并与使用的软件进行交互的边界

就叫做边界类

那么边界类的设计

它的职责是

管理将实体对象呈现给用户的方式

第三种设计类是控制类

控制类是被设计出来

要管理一些事物而形成的

那么控制类

可以被用来管理什么样的事物呢

比如

控制类可以管理

实体对象的创建和更新

控制类还可以实现边界对象的实例化

因为它们获得来自实体对象的信息

所以我们控制类

可以帮助边界对象

进行实例化

还有

控制类可以实现对象集之间的

复杂通信

当不同的对象之间需要复杂通信的时候

我们可以设计一个控制类

专门来处理这些对象之间的复杂通信

另外

我们可以通过控制类来验证对象之间

或者是用户与应用程序之间的数据通信

所以我们的设计类主要包括三种

一种是实体类

是由分析类

经过精化转变的实体类

第二种是边界类

那么是在设计中创建接口的时候被开发出来的

那么第三个

就是比较复杂和难以理解的设计类

那么就是控制类

控制类是被创建出来

用来管理实体对象的创建与更新

用来管理边界对象的实例化

和用来处理对象之间的复杂通信

以及验证对象之间

或用户与应用程序之间的数据通信

以上是我们今天讲述的设计相关的基本概念

今天我们的课程就到这里

谢谢大家

软件理论与工程课程列表:

课程概述

-课程概述

第1章 软件与软件工程

-1.1 软件的本质

--1.1 软件的本质

-1.2 软件工程

--1.2 软件工程

-1.3 软件过程结构

--1.3 软件过程结构

-1.4 过程模型

--1.4 过程模型

-1.5 敏捷开发方法

--1.5 敏捷开发方法

-第1章 习题

--第1章 习题

第2章 需求分析

-2.1 需求工程过程

--2.1 需求工程过程

-2.2 需求获取

--2.2 需求获取

-2.3 需求分析

--2.3 需求分析

-2.4 过程建模

--2.4 过程建模

-2.5 面向对象建模

--2.5 面向对象建模

-第2章 习题

--第2章 习题

第3章 软件设计

-3.1 设计概述

--3.1 设计概述

-3.2 设计的概念

--3.2 设计的概念

-3.3 设计模型元素

--3.3 设计模型元素

-3.4 体系结构概述

--3.4 体系结构概述

-3.5 体系结构风格

--3.5 体系结构风格

-3.6 构件级设计

--3.6 构件级设计

-3.7 UI设计

--3.7 UI设计

-3.8 基于模式的设计

--3.8 基于模式的设计

-第3章 习题

--第3章 习题

第4章 UML方法

-4.1 UML概述

--4.1 UML概述

-4.2 UML 及UML中的事物

--4.2 UML 及UML中的事物

-4.3 UML关系和图

--4.3 UML关系和图

-4.4 UML 图细节(上)

--4.4 UML 图细节(上)

-4.4 UML 图细节(下)

--4.4 UML 图细节(下)

-第4章 习题

--第4章 习题

第5章 软件测试

-5.1 软件测试策略

--5.1 软件测试策略(上)

--5.1 软件测试策略(下)

-5.2 测试传统的应用系统

--5.2 测试传统的应用系统

-5.3 测试面向对象的应用系统

--5.3 测试面向对象的应用系统

-5.4 测试web应用系统

--5.4 测试web应用系统

-5.5 测试移动应用系统

--5.5 测试移动应用系统

-第5章 习题

--第5章 习题

第6章 项目管理

-6.1 软件项目估算

--6.1 软件项目估算

-6.2 软件过程管理

--6.2 软件过程管理

-6.3 软件配置管理

--6.3 软件配置管理

-6.4 项目版本控制及调试

--6.4 项目版本控制及调试

-第6章 习题

--第6章 习题

3.2 设计的概念笔记与讨论

也许你还感兴趣的课程:

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