首頁 >後端開發 >C++ >幾秒鐘內解釋「告訴,不要問」原則

幾秒鐘內解釋「告訴,不要問」原則

Linda Hamilton
Linda Hamilton原創
2025-01-19 10:03:10469瀏覽

「告訴,不要問」原則是物件導向程式設計 (OOP) 的基石,提倡設計封裝其資料和操作該資料的方法的物件。這種方法透過增強封裝來培育更可維護和更健壯的系統。


?理解「告訴,不要問」

「告訴,不要問」原則強調指導對像做什麼,而不是檢索資料並在外部進行處理。 它促進在物件本身內保留邏輯和狀態。

您無需存取物件的資料來做出外部決策,而是直接指示物件執行內部操作。這種策略簡化了程式碼,最大限度地減少了依賴,並提高了系統的可擴展性和可維護性。


?‍?‍?範例:感測器值監控

讓我們檢查一個涉及感測器值以及該值超過閾值時觸發警報的場景。

「詢問」方法

<code>class AskMonitor {
  private int value;
  private int limit;
  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 value) { this.value = value; }
  public int getLimit() { return limit; }
  public String getName() { return name; }
  public Alarm getAlarm() { return alarm; }
}</code>
用法:

<code>AskMonitor monitor = new AskMonitor("Temperature Sensor", 100, alarm);
monitor.setValue(120);

if (monitor.getValue() > monitor.getLimit()) {
  monitor.getAlarm().warn(monitor.getName() + " is too high");
}</code>
「講述」方法

透過“告訴,不要問”,該行為被整合到

類別中。 Monitor

<code>class TellMonitor {
  private int value;
  private int limit;
  private String name;
  private Alarm alarm;

  public TellMonitor(String name, int limit, Alarm alarm) {
    this.name = name;
    this.limit = limit;
    this.alarm = alarm;
  }

  public void setValue(int value) {
    this.value = value;
    if (this.value > this.limit) {
      alarm.warn(name + " is too high");
    }
  }
}</code>
用法:

<code>TellMonitor monitor = new TellMonitor("Temperature Sensor", 100, alarm);
monitor.setValue(120);</code>
「Tell」版本透過將邏輯封裝在

方法中,消除了外部決策。 setValue


⭐ 「只說,不問」的優點

更強的封裝:資料和行為緊密耦合。
簡潔的程式碼:透過內部化行為最小化外在邏輯。
提高可維護性:更容易修改和擴充功能。


?何時「告訴」

封裝行為: 當一個物件本質上知道如何處理其資料時。

範例:一個 對象,意識到其限制,應該在超過該限制時自動觸發警報。 Monitor

狀態觸發的操作: 當狀態變更需要後續操作(例如通知、日誌記錄)時。

範例: 物件會在設定檔修改時自動更新活動日誌。 UserProfile


?何時「詢問」

資料擷取: 當需要資料而不改變物件的狀態時。

範例: 擷取 物件的電子郵件地址。 User

外在決策:當決策依賴外在因素時。

範例: 取得 的姓名以從外部確定適當的問候語。 Person

責任委派:當物件協作時,一個物件需要另一個物件的資料來進行決策。

範例: A Router 查詢 Server 的負載以進行流量管理。


?相關資源

有興趣嗎? ?探索我的程式設計原理系列中的其他帖子!

  • 100秒解說KISS設計原理
  • 100秒講解DRY原理

隨時更新未來的貼文:

  • 領英
  • Github
  • 推特/X

以上是幾秒鐘內解釋「告訴,不要問」原則的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn