DDD告訴而非詢問原則(TellDontAsk)

TellDontAsk

前言

之前關于實體和值對象的文章中有提過迪米特發(fā)則以及告訴而非詢問原則。偏向于值對象的設計方法,今天參考馬丁福勒的文章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.
我們應該直接通過對象獲取業(yè)務邏輯的結果,而不是根據(jù)對象的狀態(tài)自己做業(yè)務邏輯。這要求我們把業(yè)務邏輯封裝到擁有相關數(shù)據(jù)的對象中。這其實也是我們之前提到的信息專家提出的要求。

舉例來說

詢問

  • 有一個監(jiān)控對象如下,業(yè)務邏輯是如果value超過limit,那么執(zhí)行報警
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;}
  • 業(yè)務邏輯如下,首先獲取到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");
}

告訴

  • 下面是告訴的業(yè)務邏輯,自己封裝了數(shù)據(jù)和業(yè)務邏輯
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");
  }
  • 業(yè)務邏輯調(diào)用如下
public void business(){
    TellMonitor tm = new TellMonitor("Time Vortex Hocus", 2, alarm);
    tm.setValue(3);
}

總結

可見告訴而非詢問和DDD非常契合,鼓勵我們多寫充血模型而不是貧血模型

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Thoughtworks德國的顧問Ham Vocke發(fā)表在Martin Fowler網(wǎng)站上的這篇文章完整介紹了測試...
    DeepNoMind閱讀 1,748評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評論 19 139
  • 編者按:這篇文章最早撰寫于2014年,作者也是《實現(xiàn)領域驅(qū)動設計》的譯者。幾年過去了,DDD在坊間依然方興未艾,然...
    ThoughtWorks閱讀 911評論 0 0
  • 長期以來我都在實踐OOP,進而通過OOP來實現(xiàn)DDD,通過面向?qū)ο蟮募记蓙斫⒁粋€領域模型。OO的一些特性在建立領...
    ThoughtWorks閱讀 483評論 0 1
  • 原文如下:http://martinfowler.com/articles/microservices.html ...
    jacky_謙閱讀 1,039評論 0 1

友情鏈接更多精彩內(nèi)容