DDD告诉而非询问原则(TellDontAsk)

TellDontAsk

前言

之前关于实体和值对象的文章中有提过迪米特发则以及告诉而非询问原则。偏向于值对象的设计方法,今天参考马丁福勒的文章https://martinfowler.com/bliki/TellDontAsk.html 了解下广义的告诉而非询问原则。真是遗憾没有早点知道这些大拿!

原则概述

Rather than asking an object for data and acting on that data, we should instead tell an object what to do. This encourages to move behavior into an object to go with the data.
我们应该直接通过对象获取业务逻辑的结果,而不是根据对象的状态自己做业务逻辑。这要求我们把业务逻辑封装到拥有相关数据的对象中。这其实也是我们之前提到的信息专家提出的要求。

举例来说

询问

  • 有一个监控对象如下,业务逻辑是如果value超过limit,那么执行报警
class AskMonitor...
  private int value;
  private int limit;
  private boolean isTooHigh;
  private String name;
  private Alarm alarm;

  public AskMonitor (String name, int limit, Alarm alarm) {
    this.name = name;
    this.limit = limit;
    this.alarm = alarm;
  }
  public int getValue() {return value;}
  public void setValue(int arg) {value = arg;}
  public int getLimit() {return limit;}
  public String getName()  {return name;}
  public Alarm getAlarm() {return alarm;}
  • 业务逻辑如下,首先获取到AskMonitor对象,然后取出里边的value和limit做对比,如果超限就报警
public void business(){
    AskMonitor am = new AskMonitor("Time Vortex Hocus", 2, alarm);
    am.setValue(3);
    if (am.getValue() > am.getLimit()) 
      am.getAlarm().warn(am.getName() + " too high");
}

告诉

  • 下面是告诉的业务逻辑,自己封装了数据和业务逻辑
class TellMonitor...
  private int value;
  private int limit;
  private boolean isTooHigh;
  private String name;
  private String name;
  private Alarm alarm;
  public void setValue(int arg) {
    value = arg;
    if (value > limit) alarm.warn(name + " too high");
  }
  • 业务逻辑调用如下
public void business(){
    TellMonitor tm = new TellMonitor("Time Vortex Hocus", 2, alarm);
    tm.setValue(3);
}

总结

可见告诉而非询问和DDD非常契合,鼓励我们多写充血模型而不是贫血模型

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Thoughtworks德国的顾问Ham Vocke发表在Martin Fowler网站上的这篇文章完整介绍了测试...
    DeepNoMind阅读 1,638评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • 编者按:这篇文章最早撰写于2014年,作者也是《实现领域驱动设计》的译者。几年过去了,DDD在坊间依然方兴未艾,然...
    ThoughtWorks阅读 613评论 0 0
  • 长期以来我都在实践OOP,进而通过OOP来实现DDD,通过面向对象的技巧来建立一个领域模型。OO的一些特性在建立领...
    ThoughtWorks阅读 440评论 0 1
  • 原文如下:http://martinfowler.com/articles/microservices.html ...
    jacky_谦阅读 940评论 0 1