- 浏览: 40789 次
- 性别:
- 来自: 未知
最新评论
-
teasp:
哪有两个Long啊?分明是两个long,这是原始类型,它们所占 ...
如何计算java内存大小--谁吃了对象引用的16byte? -
niwtsew:
楼主总结的不错,我也有此体会。一定要淡定
这段代码不是我写的
Don’t Ask, Tell
先举一个计算工资的老例子. 不同的员工有各种不同的工资计算方法, 这种情况下如何为全公司的员工计算呢? 想想现实中的情况, 在公司可能有一个会计部,每到发薪的日子. 会计部就会把全公司的员工资料集中到一起, 看看张三是什么类型的员工, 如果是小时工就按小时工来计算,如果是办公室主任就按主任的方法来计算. 基于这样的考虑, 我们在建模的时候也会相应的建立一个类似于会计部的类, 其中定义了一个计算工资的方法, 在方法中每计算一个员工前先会询问一个这个员工的类型, 如果是A类型怎么算, 如果是B类型怎么算, 可以想象这个计算工资的方法将十分庞大,并充满了if else(switch case)的代码.将来如果多了一个员工类型,还要来修改这个方法.
Ask员工类型, 根据类型选择相应的处理逻辑, 这就是以上的方案,可以看出这不是一个好的解决办法. 好的方法是什么呢? 既然我们要根据员工的类型来判断采用何种计算方法, 而员工显然知道自己是何种类型以及自己的工作量, 那么为什么不交给员工自己来算呢?(具体实现的时候就会涉及到多态等等方法, 这不是本文讨论的重点,在此不做详细介绍)此时会计部干什么呢? 计算工资这个活动总要有人发起, 所以会计部现在的工作就是Tell所有的员工, 让大家计算工资,然后把结果汇总.
现在你可以看到Don’t Ask, Tell的影子了吧.
Ask 带来的坏处:
1. 破坏对象的封装性, 你不得不暴露很多的属性供别人Ask.
2. 容易使得一些对象过于复杂(会计部), 而一些对象(员工)又过于简单, 甚至成为了仅仅包含数据的”哑”对象.
Tell 带来的好处:
1. 更多的考虑责任分配的合理性, 方法涉及的数据在哪里方法就应该在哪里. 这样对象的内聚性就大大加强了.
2. 增强了对象的封装性, 对象不必暴露更多的属性.
3. 可以充分发挥面向对象的特性,比如多态, 减少”哑”对象从而获得更强的可维护性,扩展性以及面对变化的能力.
上面那个计算工资的例子可以说是被用滥了, 再来看看在其他场合如何运用Don’t Ask, Tell的思想. 集合的遍历操作, 在日常的编程中屡见不鲜. 你是否考虑过它也在一定程度上破坏了Don’t Ask, Tell原则呢? We ask for every element in Collection, then operator on it. Why not just tell the collection to do something. 如果采用ask的办法, 在我们的程序中将不断的出现遍历集合的操作. (重复代码,Bad Smell) 所以我们应该将尽量将集合遍历的操作放在集合内即Refactory away External Loops. 如果你留意了.Net2.0对集合类的最新支持ForEach,你就会发现MS也考虑到了这点.
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 List<string> strs = new List<string>();
6 strs.Add("hello");
7 strs.Add("world");
9 strs.ForEach(delegate(string str) // here use anonymous method
10 {
11 Console.WriteLine(str);
12 });
13 }
14 }
不过如我在.Net2.0的集合操作 --- What i hope? 一文中提到, 似乎考虑的还不是非常完善.
当然事情没有绝对, 有人会问究竟Tell到什么程度呢? 是不是Money还要负责自己的兑换操作? 这就看你把汇率放哪了. 如果汇率也在Money中, 那Money可以提供兑换的功能, 但是可以看出这不是一个好的设计. 汇率或许应该在Bank对象中, 那Money的兑换操作还是放在Bank中比较合适. 这里就涉及到责任分配的问题, 责任分配的好坏将决定对象的内聚性及耦合性. 其关键在于责任(方法)所涉及的主要状态(数据)到底在哪个对象当中.
Don’t Ask, Tell可以说是面向对象中一个非常重要的原则(Martin Fowler甚至将其称为面向对象最难理解的一个原则之一), 如果将其引申到TDD中又带来什么样的新观点呢?
发表评论
-
系统的性能优化--记项目总结
2011-09-06 00:40 1081项目过去都3个多月了, ... -
转载:面向程序员的数据库访问性能优化法则
2010-12-22 00:06 736http://blog.csdn.net/yzsind/arc ... -
logger的功能
2010-07-19 23:40 8871.最明显的功能,排查线上问题。 平时遇到bug时,要 ... -
我们需要什么样的logger
2010-07-19 23:28 851在生产环境中,针对具 ... -
大资源的分配与控制
2010-07-19 23:13 731在应用中,总有一些业务操作可能会引起大数据量的查询,基于应用健 ... -
缓存小技巧--实现cache的锁
2010-07-19 22:34 1144在有些业务背景下,需要cache防止并发的情况,然后cache ... -
缓存小技巧--缓存的分级
2010-07-19 22:22 883在大型的互联网应用中,如果缓存的是大量的数据,可以考虑多级缓存 ... -
缓存小技巧--缓存key的分组
2010-07-19 22:15 2282这篇没有任何技术含量,仅仅是一个良好的编程习惯 随着应 ... -
缓存小技巧--key的关联性
2010-07-19 22:11 1530如果我们对一个比较复杂的模型做cache,会有如下需求: 1 ... -
缓存小技巧--NullObject模式&&表识cache
2010-07-19 22:01 984在我们的应用中,有一张表的查询量非常之大,高峰期时6000次/ ... -
缓存小技巧--异步更新缓存时remove cache数据
2010-07-12 23:24 3922在支撑大规模、高并发、高可用的互联网应用中,异步更新分布式缓存 ... -
AOP应用
2010-06-26 15:51 876AOP应用已经很广了,谈一谈平时工作用到的地方: 1. 打印 ... -
胆大心细的游戏--SOA环境下系统重构
2009-12-29 02:40 0站坑。。。 -
探寻ThoughtWorks的敏捷实践,专访ThoughtWorks咨询师 <摘要>
2009-11-24 13:52 1026敏捷包括TDD、重构、简单设计、持续集成等。 TDD确保编码 ... -
Java对象的强、软、弱和虚引用
2009-11-12 20:03 610在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程 ... -
复杂对象的输出--定制toString
2009-10-28 20:50 1641先来看一个类 public class ComplexObj ... -
java序列化总结
2009-10-26 23:10 7191.Serializable接口 只是一个表识接口,仅仅是告 ... -
可伸缩性的艺术(2)
2009-07-26 16:41 850本来翻译出来想放在技 ... -
可伸缩性的艺术(1)
2009-07-26 16:36 1139本来翻译出来想放在技 ... -
一些实用命令
2009-05-26 11:05 5261.windows下的删除 还在为windows下删除大文件 ...
相关推荐
course don't load course don't load course don't load course don't load
Don’t Make Me Think田士庆
Don't Make Me Think.pdf 高清 书签版
You Don t Know JS ES6 Beyond 2015
Apache You don't have permission to access / on this server是一个在配置Apache时候,常常遇到的问题
You probably don’t really know. Computers and the Internet have revolutionized the modern world, but if you’re like most people, you have no clue how these things work and don’t know the real ...
极好的经典 设计书籍,做UE/UI或者产品设计的必看经典书籍
You Don't Know JS(中英全6本,带目录),You Don't Know JS(中英全6本,带目录)
don't try harder
No matter how much experience you have with JavaScript, odds are you don't fully understand the language. As part of the "You Don't Know JS" series, this concise yet in-depth guide focuses on new ...
You Don't Know JS(高清带目录中文版)1-3,单次上传不能超过60M,分两次上传了。4-6到要去另一个资源贴上下。。。
Unit4 Don't eat in class
don't make me think 英文版第2版
you don't know JS 全套 一共六本,很值得看!
Don’t Pay for What You Don’t Need Guide.pdf
Apress - Firewalls Don't Stop Dragons, 3rd.2018
《you don't know js》全本 高清,可直接复制里面的文字与代码
Fun data structure from entry to advanced (no encryption) -----Chapter 2 Don't underestimate the array .part1
《I+don't+believe+it》课件-03.ppt