`
soleghost
  • 浏览: 42030 次
  • 性别: Icon_minigender_1
  • 来自: 未知
社区版块
存档分类
最新评论

Don’t Ask, Tell

阅读更多

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中又带来什么样的新观点呢?

 

 

分享到:
评论

相关推荐

    人教版七年级下册英语之祈使句巩固练习.pdf

    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 ...

    直接英语优质PPT课件.pptx

    祈使句通常用来表达命令、请求、劝告、警告或禁止等,其基本结构是动词原形加上其他成分,或者以"Please"或"Don't/Never"开头。 1. **祈使句的基本形式**: - 简单祈使句:如 "Go and wash your hands." 这种结构...

    中考英语句型翻译练习总汇.pdf

    - 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"的核心...

    中考英语句型翻译练习总汇.doc

    - 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 ...

    初三英语中考专项复习宾语从句PPT学习教案.pptx

    +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. **练习与应用** - 学生应通过大量练习来熟练掌握...

    2021-2022年收藏的精品资料中考英语50个重点句型.doc

    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...

    中考英语句型翻译练习总汇..doc

    - Don’t **ask me to help you**; you must **help yourself**. (不要让我帮你的忙!你必须要自己解决问题。) - My mother **asked us not to eat anything** before we go to bed. (妈妈让我们睡觉前不吃东西。)...

    成才之路201520人教版高一英语必修1 Unit 2作业题及答2精选.doc

    例如,第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" 变成了 ...

    八年级英语上册Unit6Lessons34_36语法练习园新版冀教版

    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...

    高中英语 知识点大全51 动词不定式的省略

    当动词如allow, ask, tell等后面跟不定式作宾语补足语时,"to"也可以省略。例如: - "Don't touch the light unless your mother allows you to" 可以简化为 "Don't touch the light unless your mother allows ...

    English around the world-Grammar学案.doc

    7. 建议或禁止类,直接引语中的"Don't"在间接引语中保持不变,即`said, "Don't smoke any more."` 8. 请求类,祈使句变为let sb. do结构,时间状语today不变,即`Let me go home earlier today.` 9. 请求类,ask ...

    2021最新电大网上形考管理英语考试题及答案.docx

    - 鼓励多提问:"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...

    asktheway英语问路PPT教学课件.pptx

    - 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. (对不起,我不能确定,你最好问那边的警察。...

    2020_2021学年高中英语Unit2EnglisharoundtheworldSectionⅢGrammar习题含解析新人教

    - 若直接引语是祈使句,间接引语通常用动词ask、tell、order等加上不定式(to do)或not to do。 2. 语序调整: - 直接引语如果是以第二人称开头,间接引语中需将人称改为第三人称,并根据上下文调整宾语位置。 ...

    动词不定式与动名词用法总结.doc

    - 疑问词引导的不定式短语可作宾语、宾语补足语或主语,如"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形式,同样具备多种语法功能,...

Global site tag (gtag.js) - Google Analytics