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

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

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

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

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

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

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

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

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」python日期与字符串互转

    1str -> date import datetime detester = ‘2017-01-01' date = datetime.datetime.strptime(detester,’ ...

  2. 前端PHP入门-012-回调函数[慎入]

    尽力而为,对于WEB前端和美工同学,比较难了!但是你们都学过JS的闭包等操作,那么这里也一定没有问题! 回调函数,可以配合匿名函数和变量函数实现更加优美.复杂的一种函数结构. 回调函数,就是在处理一个 ...

  3. extjs grid demo

    Ext.onReady(function () { var store = Ext.create('Ext.data.Store', { fields: ['id', 'name', 'account ...

  4. CentOS7,安装Tomcat8.5、JDK1.8,并设置开机启动(Linux CentOS Tomcat、JDK+Tomcat、Tomcat开机自启动)

    1.下载JDK1.8.Tomcat8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...

  5. easyui 更改dialog弹出的位置

    方法一: 在弹出dialog的时候不用$('#dialogDiv').dialog('open');打开.用$('#dialogDiv').window('open');打开.再用window的res ...

  6. 26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL

    26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL In the beginning of August I got the chance t ...

  7. PHP扩展--vld查看opcode代码

    vld安装 wget http://pecl.php.net/get/vld-0.13.0.tgz tar zxvf vld-0.13.0.tgz cd vld-0.13.0 /usr/local/p ...

  8. 重构改善既有代码设计--重构手法11:Move Field (搬移字段)

    你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...

  9. MongoDB - MongoDB CRUD Operations, Insert Documents

    MongoDB provides the following methods for inserting documents into a collection: db.collection.inse ...

  10. 关于linux下crontab mysql备份出来的数据为0字节的问题

    问题出在计划任务所执行的脚本上! 脚本中的调用的指令应该都写全路径~ 实例: # crontab -c 编辑下的内容 30 18 * * * /root/backup.sh 意思为:每天18:30执行 ...