软件构建中的设计

一、设计的挑战

1、设计中存在的一些问题是必须通过解决或者部分解决才能明确的问题,所以在实际设计中你必须把问题“解决”一遍,才能定义它,然后再次解决,循环往复,最终形成一个可行性方案。

2、设计师了无章法的过程,多次的犯错时设计的关键所在。在设计阶段犯错并加以改正比在实际编码中发现问题并改正花费的代价要低很多。

3、设计是确定取舍和不断调整顺序的过程。

二、关键的设计概念

## **1、设计的首要技术使命是 管理复杂度** ##

在设计程序的时候,我们不应该在同一时间把整个程序都塞进大脑里面,而应该学会去分解程序,从而能在一个时刻专注于程序的某个模块。

在软件架构层次上,我们应该把整个系统分解成多个子系统,从而来降低问题的复杂度。

## 2、理想的设计特征 ##
1、最小的复杂度。设计首要目标是降低复杂度
2、易于维护。
3、松散耦合。程序的模块之间的关联应该尽可能的小
4、可拓展性。增强系统结构而无须破坏其底层结构
5、可重用性。能提炼出公共模块,供其它项目使用
6、高扇入。大量的类使用了系统底层的某些工具类。
7、低扇出。一个类中少量或者适量食用其他的类。
8、可移植性。
9、精简性。设计的系统没有多余的部分
10、层次性。保持各个层次之间的独立性
11、标准化的技术

## 3、设计的层次##
1、第一层:软件系统层。系统的整体
2、第二层:分解为子系统或包
该层主要确定 如何划分各个子系统/子模块, 以及 规定各个子系统之间如何通信/关联/联系。
注:
子系统之间的 关系不能出现环形循环。
如果无法确定子系统之间的关系,可以对子系统之间的联系和通信进行限制,等需要的时候再一步步放开。

3、第三层:分解为类
包扩整个系统的所有类和接口

4、第四层:类的子程序
5、第五层:类的子程序的内部实现
注:
整个层次设计都是一层层的不断分解,由系统到函数的内部实现,在详细设计时,最终都是要设计到具体的函数实现的。

三、设计实现的方法–启发式方法

设计的首要技术依据始终是–管理复杂度。
下面是实现一个类封装的步骤

1、找出现实的对象

  • 辨识出/提炼出对象及其属性(方法和数据)
  • 确定可以对各个对象的操作场景
  • 确定出各个对象对其他对象的关系和操作
  • 确定对象的属性的public/private
  • 定义每个对象的公开接口

从复杂度来看,提取对象能帮你划分不同的复杂度层次。

2、形成一直的抽象

抽象是让你关注某一概念时忽略其中一些细节的能力,即在不同的层次处理不同的细节。

基类是一种抽象,他让你集中精力关注一组派生类所具有的共性,并在基类层次忽略各个派生类的各自不同部分的细节。

从复杂度来看,抽象的主要好处在于忽略该层次无关的细节。

3、封装实现细节

封装是抽象的补充。抽象是让你从高层的细节来看一个对象,而封装是除此之外你不能看到细节的其它层次。

从复杂度来看,封装帮助你管理复杂度的方法是不让你看到复杂度。

4、当继承能简化设计时,就继承

5、信息隐藏/封装接口

信息隐藏的可能是某些易变的区域,或者是隔离区域,类的功能就是把部分信息隐藏起来,但该区域改变时,不会对类提供的公共子接口产生影响,即私有数据的改变,不应该影响类的公共接口和使用接口的 程序。

设计类的接口和设计其他环节一样,都是迭代过程。如果你第一次设计的类没得到合适的接口,可以多试几次,直到稳定。

信息隐藏的一些障碍:
1、信息过度分散。(可是尝试分解为多个类)
2、循环依赖。(要避免循环依赖)
3、把类内的数据误认为全局数据。(把全局数据转变成类内部数据,避免全局数据造成的耦合问题)

信息隐藏问题是接口设计的核心:如果你能在给类的公开接口增加函数或者数据而不牺牲类的隐私性(不会随意变化),那就做下去,否则,换种方法。

从发杂都来看,信息隐藏让你不再关注类的复杂细节,除非你必须关注的时候;隐藏变化源,让其影响只能在类内部,不会改变公共接口。

6、找出易变区域

好的设计就是能适应变化,能把不稳定的区域隔离,从而把变化的影响限制在一个函数、类或者包内。

找出易变区域的方法: 首先找出对用户有用的最小子集,这一子集构成系统核心,不会轻易变化。然后以微小的步伐扩充系统,不断改变,找出可变部分。

7、保持松散耦合

尽量创建不依赖或者少依赖其他模块的模块。

一个模块越容易被其他模块调用,那他们之间的 耦合就越松散。

要避免语义耦合

**对复杂度而言,松散耦合的好处你可以轻易的使用它,而不用关心他的具体实现的复杂程度。如果一个模块要求你使用时同时关注:其内部的工作原理、对全局数据的修改、不确定的功能点等,那么这个模块就丧失了抽象能力。
类和函数是降低复杂度的首选工具,如果他们没有帮你简化复杂度,那他们就是失职的。**

8、使用设计模式

9、其他启发方法

1、高内聚性。
内聚性是指类内部的子程序或者子程序之间的所有代码都在支持一个中心目标的紧密程度,即这个类的目标是否集中。

包含一组密切相关的功能的类被称为有高内聚性。

设计类的启发方法是,朝着高内聚性考虑。

2、构造分层结构

分层结构是指一种分层的信息结构,其中最通用或者最抽象的部分位于层次的最上面,越来越详细的具体的部分房子啊更低的层次。

四、设计实践

1、迭代
当你首次尝试得到某个足够好的方案之后,不要停下来。第二个设计肯定好于第一个,而你也能从中得到收获,有助于改善整体设计。

2、分而治之
分解处理

3、自上而下和自下而上的设计方法

自上而下设计是从很高的抽象层次开始。你定义出基类或者其他不特殊的设计元素,在开发过程中,逐渐增加细节层次,找出派生类、合作类以及其他细节元素。

自上而下分解成度:持续分解,直到下一层直接编码比分解更容易为止。

自下而上 是开始于细节部分,然后向一般性归纳延伸。通常是先找出具体细节对象,然后从细节生成基类。

2中模式一种是分解,一种是合成,自上而下能找出系统的通用特征,而自下而上能直接分析系统的各种细节功能。
相互启发试探,才能设计出一个最佳的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值