面向过程的软件开发通过非常集中化的控制机制来分解功能,在程序设计中表现就是大量的条件判断,深层次的循环嵌套等。

这种模式下,我们可以通过分析方法的参数,局部变量及其访问的全局变量来得到方法对数据的依赖性,但是我们只有分析整个项目代码才能得到数据对方法的依赖性。

面向对象的软件开发主要关注在非常分布的环境中分解数据以及同数据相关的功能。通过高内聚(数据与其相关行为的高度融合)和低耦合(实体之间的相互隔离)来 实现功能的分布,典型表现就是不需要过多的条件判断以及深层次的循环嵌套等。

这里我们可以通过类本身就得到数据与方法相互之间的依赖性,而不是需要分析整合程序。

当然,面向过程并非永远黑暗,面向对象也并非永远一片光明。

面向对象是面向过程发展历程上改革性的一步,其有两个典型的容易诱惑设计者的危险:

第一:容易创建庞大的“万能类”,该类包含过多的功能;

第二:容易创建“泛滥成灾的类”,整个程序被淹没在类的海洋中。

3.1 在水平方向尽可能统一地分布系统功能,也即,按照设计,顶层累应当统一的共享工作。

人们思考问题时,经常是跳跃性的,该给动物们建立一个模型了。        哦,是动物,有哺乳动物,两栖动物。。。,有海洋动物,陆地动物。        wait wait。。。,什么?海洋动物?怎么好像这种分法很别扭。

  如果你在建类的时候在这里停顿下来,那恭喜你,你对了,这种分法并不是按照统一的规则进行分类,在统一水平线上功能存在很多交叉,哺乳动物可能具有海洋动物和陆地动物的行为,而海洋动物可能也具有哺乳动物和两栖动物的行为,使用者不可避免需要大量的If ...Else...来进行类型的区分。

3.2 在系统中不要创建全能类/对象。

  对名字包含Driver,Manager,System,SubSystem的类要特别加以小心。

3.3 对公共接口中定义了大量的Get/Set访问方法的类要多加小心。

  大量的访问方法意味着相关的数据和行为没有集中存放。我们不应该要求使用者去关心一个类里能Get到多少内容,更应该让使用者关心的是这个类能Do多少事情。

  对汽车类说,如果让驾驶员Get发动机是没有意义的,我们的汽车对驾驶员来说更应该像下面:

  1. class 汽车
  2. {
  3. void 加速();
  4. void 停止();
  5. void 左转();
  6. }

而不是下面这样

  1. class 汽车
  2. {
  3. 发动机 Get发动机();
  4. 方向盘 Get方向盘();
  5. }

3.4 对包含太多互不沟通的行为的类多加小心。

  互不沟通的行为是指只访问了类的一部份数据成员,全能类经常有互补沟通的行为。       在写一个类的时候经常会有如下形式:

  1. class XXXX
  2. {
  3. //序列化操作
  4. string filename;
  5. void Save();
  6. void Load();
  7. ......
  8. //***操作
  9. 。。。
  10. //@@@操作
  11. }
 

如果一个类的公共接口里的方法需要进行分类描述的话,基本上可以确认属于这种情况了。

3.5 有用户界面交互的程序中,界面应当依赖模型,模型不应当依赖界面。

考虑DIP原则,则界面本身影像有抽象接口。

3.6 尽可能地按照现实世界建模。

实际中我们经常为了遵守系统功能分布原则,避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则。

这条原则对维护人员非常有利。

OOD沉思录 --- 面向动作与面向对象 --- 避免全能类的更多相关文章

  1. OOD沉思录 --- 面向动作与面向对象 --- 避免泛滥成灾的类

    3.7 从设计中取出不需要的类 只有Get/Set方法的类不算是一个必要的类,Get/Set方法也不算是有意义的行为.这种类降级为属性更加合适. 3.8 去除系统外部的类 如果一个类只调用系统领域的方 ...

  2. OOD沉思录 --- 类和对象的关系 --- 包含关系3

    4.7 类包含的对象数目不应当超过开发者短期记忆数量,这个数目通常应该是6左右 4.8 让系统在窄而深的包含体系中垂直分布 假设有如下两份菜单: 正餐 --->甜瓜 --->牛排 ---& ...

  3. OOD沉思录 --- 类和对象的关系 --- 包含关系1

    4.5 如果类包含另一个类的对象,那么包含类应当向被包含的对象发送消息(调用方法).  也就是说,所有的包含关系都应当是使用关系. 如果不是这样,那么包含的类有什么用处呢?当然,面向过程的开发人员会想 ...

  4. OOD沉思录 --- 类和对象的关系 --- 包含关系4

    4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...

  5. OOD沉思录 --- 类和对象的关系 --- 包含关系2

    4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...

  6. OOD沉思录 --- 类和对象的关系 --- 使用关系原则

    4.1 尽量减少类的协作的数量,即减少使用者和被使用者的数量. 协作意味着一定程度的耦合,但是完全没有协作的类也是没有意义的,最多只能作为一个库使用. 通过抽象,依赖接口,可以最大程度减少依赖的实现类 ...

  7. OOD沉思录 --- 类和对象的关系 --- 使用关系

    使用关系 对象A的方法MethodA使用了B的方法MethodB,则表示A对B存在使用关系 使用关系的最关键问题在于,A如何找到B,存在6种方案 方案一: A包含了B,B作为一个成员定义在A的类中,那 ...

  8. OOD沉思录 --- 继承

    一,继承只应被用来为特化层次结构建模 实际上也就是要满足LSP原则,水果类<-榴莲的继承是特化   二,派生类必须知道他们的基类,基类不应当知道他们的派生类   复用的前提   三,基类中的所有 ...

  9. OOD沉思录 --- 导引

    一个对象一定会有如下4个属性: 1,它的身份标示,可能只是它在内存中的地址; 2,它的类的属性(通常是静态属性)和这些属性的值(通常是动态的); 3,它的类的行为(从实现者的角度看); 3,它的公开接 ...

随机推荐

  1. 「Python」19个python编写技巧

    1. 交换赋值 2. Unpacking 3. 使用操作符in 4. 字符串操作 5. 字典键值列表 6. 字典键值判断 7. 字典 get 和 setdefault 方法 8. 判断真伪 9. 遍历 ...

  2. 下载外部jar包后,链接源码和javadoc.jar

    今天下载了一个Apache Common的一个jar包,对于引入源码和JavaDoc有了新的认识,在这里记录一下. Binaries是指二进制文件,包含使用的jar包.Source是指源码. xxx. ...

  3. 再谈System.arraycopy和Arrays.copyOf

    之前转载过一篇博文,介绍过这两个方法,今天想要再次详细的了解一下. public static native void arraycopy(Object src, int srcPos, Object ...

  4. vue使用插件 使用库

    用插件1.引用import VueResource from 'vue-resource'2.使用Vue.use(VueResource); 用库(bootstrap alertify )1.引入: ...

  5. TestNG指南

    转载自:http://blog.csdn.net/bigapplestar/article/details/7300137 今天突然收到通知,统一改用TestNG写测试用例,开始查这方面的资料,学习一 ...

  6. Vue.js和angular.js区别

    Vue.js:易学 简单 指令以v.xxx 一片HTML代码配合json,在new出来Vue,js实例 个人维护项目 适用于移动端 应用超越了angular angular.js:上手难 指令以ng. ...

  7. webDriver检索table数据

    最近在做爬虫相关工作,用到了webdriver,记录一些遇到的问题和解决方法: 如何查找 table中的行 例如: <div id="a"> <table cla ...

  8. 如何构建一个很棒网站页脚(Website Footer)

    对于很多人来说,制作页脚是只是设计师顺手而为的任务.它似乎很容易,似乎可以忽略不计.因为很多人都觉得网站底部很少人会去看,而且页脚链接的所有链接的点击率(CTR)都是最低的,何必呢? 真是这样的吗?下 ...

  9. 【BZOJ】4318: OSU! 期望DP

    [题意]有一个长度为n的01序列,每一段极大的连续1的价值是L^3(长度L).现在给定n个实数表示该位为1的概率,求期望总价值.n<=10^5. [算法]期望DP [题解]后缀长度是一个很关键的 ...

  10. array_unshift() 函数

    出处:http://www.w3school.com.cn/php/func_array_unshift.asp