オブジェクト指向プログラミング (OOP) の基礎である Tell, Don't Ask 原則 は、データとそのデータを操作するメソッドの両方をカプセル化するオブジェクトの設計を提唱しています。このアプローチは、カプセル化を強化することで、より保守しやすく堅牢なシステムを促進します。
「尋ねないで教えてください」の原則は、オブジェクトのデータを取得して外部で処理するのではなく、オブジェクトに何をすべきかを指示することに重点を置いています。 これにより、オブジェクト自体内でロジックと状態を維持することが促進されます。
オブジェクトのデータにアクセスして外部の決定を行うのではなく、オブジェクトに内部アクションを実行するように直接指示します。この戦略により、コードが簡素化され、依存関係が最小限に抑えられ、システムの拡張性と保守性が向上します。
センサーの値と、この値がしきい値を超えたときにトリガーされるアラームを含むシナリオを調べてみましょう。
<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>
「Tell, Don't Ask」では、動作が 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
の名前を取得して、適切な挨拶を外部的に決定します。
✅ 責任の委任: オブジェクトが連携し、意思決定のためにオブジェクトが別のオブジェクトからのデータを必要とする場合。
例: トラフィック管理のために
Router
の負荷をクエリするServer
。
興味がありますか? ?私のプログラミング原則シリーズの他の投稿をご覧ください!
今後の投稿についても最新情報を入手してください:
以上が「尋ねずに伝えてください」の原則を数秒で説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。