- 浏览: 42030 次
- 性别:
- 来自: 未知
最新评论
-
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 1112项目过去都3个多月了, ... -
转载:面向程序员的数据库访问性能优化法则
2010-12-22 00:06 760http://blog.csdn.net/yzsind/arc ... -
logger的功能
2010-07-19 23:40 9231.最明显的功能,排查线上问题。 平时遇到bug时,要 ... -
我们需要什么样的logger
2010-07-19 23:28 877在生产环境中,针对具 ... -
大资源的分配与控制
2010-07-19 23:13 758在应用中,总有一些业务操作可能会引起大数据量的查询,基于应用健 ... -
缓存小技巧--实现cache的锁
2010-07-19 22:34 1185在有些业务背景下,需要cache防止并发的情况,然后cache ... -
缓存小技巧--缓存的分级
2010-07-19 22:22 917在大型的互联网应用中,如果缓存的是大量的数据,可以考虑多级缓存 ... -
缓存小技巧--缓存key的分组
2010-07-19 22:15 2326这篇没有任何技术含量,仅仅是一个良好的编程习惯 随着应 ... -
缓存小技巧--key的关联性
2010-07-19 22:11 1565如果我们对一个比较复杂的模型做cache,会有如下需求: 1 ... -
缓存小技巧--NullObject模式&&表识cache
2010-07-19 22:01 1014在我们的应用中,有一张表的查询量非常之大,高峰期时6000次/ ... -
缓存小技巧--异步更新缓存时remove cache数据
2010-07-12 23:24 3958在支撑大规模、高并发、高可用的互联网应用中,异步更新分布式缓存 ... -
AOP应用
2010-06-26 15:51 921AOP应用已经很广了,谈一谈平时工作用到的地方: 1. 打印 ... -
胆大心细的游戏--SOA环境下系统重构
2009-12-29 02:40 0站坑。。。 -
探寻ThoughtWorks的敏捷实践,专访ThoughtWorks咨询师 <摘要>
2009-11-24 13:52 1057敏捷包括TDD、重构、简单设计、持续集成等。 TDD确保编码 ... -
Java对象的强、软、弱和虚引用
2009-11-12 20:03 636在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程 ... -
复杂对象的输出--定制toString
2009-10-28 20:50 1678先来看一个类 public class ComplexObj ... -
java序列化总结
2009-10-26 23:10 7581.Serializable接口 只是一个表识接口,仅仅是告 ... -
可伸缩性的艺术(2)
2009-07-26 16:41 889本来翻译出来想放在技 ... -
可伸缩性的艺术(1)
2009-07-26 16:36 1182本来翻译出来想放在技 ... -
一些实用命令
2009-05-26 11:05 5561.windows下的删除 还在为windows下删除大文件 ...
相关推荐
2. Ask him 变为 "Don't ask him." 3. Please wait for her 变为 "Please don't wait for her." 4. Read the book carefully 变为 "Don't read the book carelessly." 5. Sit under the tree, please 变为 "Don't ...
祈使句通常用来表达命令、请求、劝告、警告或禁止等,其基本结构是动词原形加上其他成分,或者以"Please"或"Don't/Never"开头。 1. **祈使句的基本形式**: - 简单祈使句:如 "Go and wash your hands." 这种结构...
- Don't ask me to help you. You must rely on yourself. (不要让我帮你!你必须要靠自己。) 6. **Tell sb. to do/ tell sb. not to do**:这两个结构表示“告诉某人做/不要做某事”。 - Let me tell you how ...
在IT行业中,"Tell Don't Ask"原则是一个重要的设计哲学,尤其在面向对象编程中被广泛推崇。这个原则源于Smalltalk社区,由Martin Fowler在其著作《重构:改善既有代码的设计》中进行了阐述。"Tell Don't Ask"的核心...
- Don’t ask me to help you; you must rely on yourself. (不要让我帮你的忙!你必须要自己解决问题。) - My mother asks us not to eat anything before we go to bed. (妈妈让我们睡觉前不吃东西。) 6. tell ...
+to +v.",否定形式为"ask/tell/…+sb.+ not to + v.",如"Could you tell me how often you go to the library?" 或者 "Ask him not to forget the meeting." 6. **练习与应用** - 学生应通过大量练习来熟练掌握...
for sth.** - 请求或要求得到某物,如"Don’t always ask your parents for money."告诫不要总是向父母要钱。 5. **ask/tell sb. how to do sth.** - 教导别人如何做某事,如"I asked /told the man how to get to...
- Don’t **ask me to help you**; you must **help yourself**. (不要让我帮你的忙!你必须要自己解决问题。) - My mother **asked us not to eat anything** before we go to bed. (妈妈让我们睡觉前不吃东西。)...
例如,第1题"“Don't play games in the classroom, ” the monitor said to us." 转换成 "The monitor told us not to play games in the classroom." 这里时态由一般现在时变为一般过去时,祈使句"Don't" 变成了 ...
4. "I don’t know how told you the news." 应改为"I don’t know how to tell you the news." know后面跟不定式表示知道如何做某事。 5. "Would you like us seeing Beijing Opera?" 应改为"Would you like us to...
当动词如allow, ask, tell等后面跟不定式作宾语补足语时,"to"也可以省略。例如: - "Don't touch the light unless your mother allows you to" 可以简化为 "Don't touch the light unless your mother allows ...
7. 建议或禁止类,直接引语中的"Don't"在间接引语中保持不变,即`said, "Don't smoke any more."` 8. 请求类,祈使句变为let sb. do结构,时间状语today不变,即`Let me go home earlier today.` 9. 请求类,ask ...
- 鼓励多提问:"Don't be afraid to ask a lot of questions." - 对他人的到来表示欢迎:"I hope you'll be happy working here." 6. **词汇词性与搭配**: - "Isn't it impolite to call people by their first...
- Sorry, I don’t know. I’m new here, too. (对不起,我不知道。我也是刚到这儿的。) - I'm sorry, I'm not sure. You'd better ask the policeman over there. (对不起,我不能确定,你最好问那边的警察。...
- 若直接引语是祈使句,间接引语通常用动词ask、tell、order等加上不定式(to do)或not to do。 2. 语序调整: - 直接引语如果是以第二人称开头,间接引语中需将人称改为第三人称,并根据上下文调整宾语位置。 ...
- 疑问词引导的不定式短语可作宾语、宾语补足语或主语,如"He didn't tell me where to go.", "I don't know what to say now.", "I don't know what to do next." 动名词,即动词ing形式,同样具备多种语法功能,...