4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员)

这其实就是高内聚的翻版强调。如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念。

最明显的情况就是类的一半方法使用了一半的数据成员,而另一半方法使用了另一半的数据成员,那么这个类就应该一分为二。

我们假设一个澡堂,有VIP客户和普通客户,各自有不同的服务(普通客户享受中专生服务,VIP客户享受大学生服务),则定义如下:

  1. class 澡堂
  2. {
  3. stack<中专生> 普通服务员;
  4. stack<大学生> VIP服务员;
  5. 普通接待()
  6. {
  7. 普通服务员.Pop().侍候();
  8. }
  9. 普通结帐()
  10. {
  11. 普通服务员.Pop().结帐();
  12. }
  13. Vip接待()
  14. {
  15. VIP服务员.Pop().侍候();
  16. }
  17. VIP结帐()
  18. {
  19. VIP服务员.Pop().结帐();
  20. }
  21. }
这是一个我经常看到的类似结构,这种结构不可避免地会在使用者的代码里进行很多条件判断,来确定到底调用那个版本的方法,而这种判断最好避免。     
原因在于这一个类包含了两个概念,一个是针对普通客户,一个是针对VIP客户,违反了本条原则,我们应当将其分开,这里可以考虑再次抽象
  1. class 澡堂
  2. {
  3. abstract 接待();
  4. abstract 结帐();
  5. }
  6. class 普通澡堂:澡堂
  7. {
  8. stack<中专生> 服务员;
  9. 接待()
  10. {
  11. 服务员.Pop().侍候();
  12. }
  13. 结帐()
  14. {
  15. 服务员.Pop().结帐();
  16. }
  17. }
  18. class VIP澡堂:澡堂
  19. {
  20. stack<大学生> 服务员;
  21. Vip接待()
  22. {
  23. 服务员.Pop().侍候();
  24. }
  25. VIP结帐()
  26. {
  27. 服务员.Pop().结帐();
  28. }
  29. }

这样这个类的使用者可以使用如下方法:

  1. 澡堂 tmp=null;
  2. if(顾客 is 普通客户)
  3. tmp=new 普通澡堂();
  4. if(顾客 is VIP客户)
  5. tmp=new VIP澡堂();
  6. tmp.接待();
  7. //......
  8. tmp.结帐();

眼神好的可能马上就会提出,这里也进行了判断,但是这里的判断我们可以通过两种手段来处理

一,字典

在外部保存一个字典:Dictionary<顾客类型,澡堂> dic;         那么上面的代码就成为下面这样:

  1. 澡堂 tmp=dic[顾客类型];
  2. tmp.接待();
  3. //......
  4. tmp.结帐();

二,简单工厂

实现一个简单工厂,澡堂Factory,则使用代码如下:

  1. 澡堂 tmp=澡堂Factory.Create(顾客类型);
  2. tmp.接待();
  3. //......
  4. tmp.结帐();

这两种方式都可以在程序配置的时候进行调整,将类型的依赖延迟到配置细节中(而这正是类型注入的要旨,别被那些专有的很玄的框架名次忽悠,其实就是这么简单)。

OOD沉思录 --- 类和对象的关系 --- 包含关系2的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. php课程 11-37 类和对象的关系是什么

    php课程 11-37 类和对象的关系是什么 一.总结 一句话总结:类生成对象,对象是类的实例化,一定是先有类,后有对象,一定是先有标准,再有个体. 1.oop的三大优势是什么? 重用性,灵活性.扩展 ...

  7. OC学习--类和对象的关系

    1. 如何创建对象 面向对象解决问题的时候必须有对象, 那应该如何创建对象? 以建造汽车为例子来解释: >建造汽车需要造车图纸, 图纸上 清楚的描述出 汽车具备的属性和功能(行为) >属性 ...

  8. Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员、局部),匿名对象的调用,构造代码块(5)

    Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员.局部),匿名对象的帝爱用,构造代码块(5)

  9. 2.java面向对象类与类/类与对象之间关系详解

    继承.实现.依赖.关联.聚合.组合的联系与区别 下面的内容很基础,同时也很简单,但是也很重要. 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功 ...

随机推荐

  1. Vue基础---->VueJS的使用(二)

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.今天我们就来学习一 ...

  2. MySQL+Keepalived实现双机HA

    host1与host3互为主从,即host1为host3的主机,同时也为host3的从机   host1 192.168.203.131 host2 192.168.203.132 host3 192 ...

  3. 奥特曼小分队之四(Work Breakdown Structure)

    写在前面的话:游戏介绍http://www.cnblogs.com/atmxfd/p/5415107.html 需求 我们的游戏是一款基于局域网的游戏,用户只需将服务端和客户端置于同一局域网下即可使用 ...

  4. AOP——代理技术

    一.如何理解代理技术 Proxy:不用你去做,别人代替你去处理.如Windows快捷方式,又如房屋中介 起到一个中介作用,通过代理对象,可以去掉客户不能看到的内容和服务或者添加客户需要的额外服务. 二 ...

  5. Scrum团队

    5.Scrum团队成立 5.1 团队名称,团队目标.团队口号.团队照: 团队名称:@four! 团队目标:做出像“数学口袋精灵”那么棒的软件 团队口号:多劳多得 团队照: 5.2 角色分配 产品负责人 ...

  6. jquery选择器(原创)<三>

    现在来看看表单域选择器 1.:input选择器 :input选择器,用于选择所有Input,textarea,select和button元素,语法格式如下: $(":input") ...

  7. thread_AtomicBoolean

    Boolean值的变化的时候不允许在之间插入,保持操作的原子性 它提供了原子性操作,其中exists.compareAndSet(false, true)这个操作把比较和赋值操作组成了一个原子操作,中 ...

  8. Sql server脏读、更新丢失、不可重复读、幻象读问题及解决方案

    1.脏读:一个事务读到另外一个事务还没有提交的数据.解决方法:把事务隔离级别调整到READ COMMITTED,即SET TRAN ISOLATION LEVEL READ COMMITTED.这时我 ...

  9. windbg学习进阶之——dump分析常用命令收集

    #重要说明 (1) windbg命令分为标准命令,元命令和扩展命令. 标准命令提供最基本的调试功能,不区分大小写.如:bp  g  dt  dv  k等 元命令提供标准命令没有提供的功能,也内建在调试 ...

  10. 重新想象 Windows 8 Store Apps (50) - 输入: 边缘手势, 手势操作, 手势识别

    [源码下载] 重新想象 Windows 8 Store Apps (50) - 输入: 边缘手势, 手势操作, 手势识别 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...