美文网首页技术原理
DDD告诉而非询问原则(TellDontAsk)

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

作者: 后厂村老司机 | 来源:发表于2022-09-15 15:38 被阅读0次
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非常契合,鼓励我们多写充血模型而不是贫血模型

相关文章

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

    前言 之前关于实体和值对象的文章中有提过迪米特发则以及告诉而非询问原则。偏向于值对象的设计方法,今天参考马丁福勒的...

  • 设计模式--原则

    总原则: 针对接口编程,而非针对实现编程 使用对象组合、而非继承 1.单一职责原则: 2.开放封闭原则: 应对新需...

  • MarkDown

    ###fff ..aa..... ddd ddd ddd ddd ddddddasdf

  • 双赢过程思维导图

    本节阅读要点总结: 双赢的解决方案,告诉我们凡事要坚持原则而非立场。 双赢过程四步骤: ...

  • test1

    *title* dddd ddd ddd ddd

  • 1.3 落实DDD(Domain Driven Design)

    我仅说一下我对DDD的理解,仅代表个人观点。DDD和面向对象、和设计模式原则、和《代码整洁之道》说的是一个道理的不...

  • 基于接口而非实现编程

    “基于接口而非实现编程”这条原则的另一个表述方式,是“基于抽象而非实现编程”。后者的表述方式其实更能体现这条原则的...

  • 09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定

    基于接口而非实现编程这条原则的另一个表述方式是"基于抽象而非实现编程". 后者表述的方式其实更能体现这条原则的设计...

  • 第一节 DDD相关概念

    什么是DDD DDD相关概念 1.1什么是DDD 领域驱动设计,即Domain Driven Design(DDD...

  • 2018-02-09

    # aaa ## aaa ### ddd ddd

网友评论

    本文标题:DDD告诉而非询问原则(TellDontAsk)

    本文链接:https://www.haomeiwen.com/subject/xoorortx.html