zoukankan      html  css  js  c++  java
  • 命令,不要去询问(Tell, Don’t Ask)”原则

    我看到的最多被违反的原则是“命令,不要去询问(Tell, Don’t Ask)”原则。这个原则讲的是,一个对象应该命令其它对象该做什么,而不是去查询其它对象的状态来决定做什么(查询其它对象的状态来决定做什么也被称作‘功能嫉妒(Feature Envy)’)。

    这篇文章里有个很生动的例子,我至今记忆犹新:

    if (person.getAddress().getCountry() == “Australia”) {

    这违反了得墨忒耳定律,因为这个调用者跟Person过于亲密。它知道Person里有一个Address,而Address里还有一个country。它实际上应该写成这样:

    if (person.livesIn(“Australia”)) {

    非常的明了。今天我又看到一个关于“Tell, Don’t Ask”原则的文章,里面提供了4个关于这个原则的例子,都很有价值。

    例一

    不好:

    <% if current_user.admin? %><%= current_user.admin_welcome_message %><% else %><%= current_user.user_welcome_message %><% end %>

    好:

    <%= current_user.welcome_message %>

    例二

    不好:

    def check_for_overheating(system_monitor)if system_monitor.temperature > 100system_monitor.sound_alarmsendend

    好:

    system_monitor.check_for_overheatingclass SystemMonitordef check_for_overheatingif temperature > 100sound_alarmsendendend

    例三

    不好:

    class Postdef send_to_feedif user.is_a?(TwitterUser)user.send_to_feed(contents)endendend

    好:

    class Postdef send_to_feeduser.send_to_feed(contents)endendclass TwitterUserdef send_to_feed(contents)twitter_client.post_to_feed(contents)endendclass EmailUserdef send_to_feed(contents)# no-op.endend

    例四

    不好:

    def street_name(user)if user.addressuser.address.street_nameelse'No street name on file'endend

    好:

    def street_name(user)user.address.street_nameendclass Userdef address@address || NullAddress.newendendclass NullAddressdef street_name'No street name on file'endend

    好的面向对象编程是告诉对象你要做什么,而不是询问对象的状态后根据状态做行动。数据和依赖这些数据的操作都应该属于同一个对象。

    命令,不要去询问!

  • 相关阅读:
    flume采集log4j日志到kafka
    解决spring 事务管理默认不支持SQLException等运行时异常
    基于黑名单的xss过滤器
    VMware创建Linux虚拟机并安装CentOS(三)
    dubbo 常见错误
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    zookeeper工作原理、安装配置、工具命令简介
    VMware创建Linux虚拟机并安装CentOS(二)
    NSPredicate谓词
    IOS网络请求之NSURLSession使用详解
  • 原文地址:https://www.cnblogs.com/secbook/p/2655149.html
Copyright © 2011-2022 走看看