
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非常契合,鼓勵我們多寫充血模型而不是貧血模型