「尋ねるな命じろ」
「尋ねるな命じろ」(Don't Ask, Tell)は、オブジェクト指向設計における重要な原則の一つです。
この原則は、オブジェクトの内部状態を外部から「尋ねる」のではなく、オブジェクトに対して「何をするか」を「命じる」ことで、カプセル化と責務の明確化を促します。
背景と目的
問い合わせ(質問)の問題点
-
カプセル化の破壊:
オブジェクトの内部状態を外部に問い合わせると、その内部実装に依存するコードが増え、変更に弱い設計となります。 -
責務の不明確さ:
外部がオブジェクトの状態をチェックし、そこから処理を決定すると、どのオブジェクトが本来の責務を持つべきかが曖昧になります。
命じる(指示する)のメリット
-
カプセル化の維持:
オブジェクトに具体的な操作を命じることで、内部状態はオブジェクト内に隠蔽され、外部からの不要な依存を防ぎます。 -
責務の明確化:
各オブジェクトが自分自身の状態や振る舞いを管理することで、システム全体の責務が明確になり、保守性や拡張性が向上します。
原則の適用例
悪い例(「尋ねる」パターン)
以下の例では、クライアントが BankAccount
オブジェクトから直接残高を問い合わせ、その値に基づいて判断を行っています。
class BankAccount:
def __init__(self, balance):
self.balance = balance
def get_balance(self):
return self.balance
# 悪い例: 外部が内部状態を問い合わせ、処理を判断している
account = BankAccount(100)
if account.get_balance() >= 50:
print("十分な残高があります。")
else:
print("残高が不足しています。")
良い例(「命じる」パターン)
「尋ねるな命じろ」の原則に則り、クライアントは BankAccount に対して直接操作を命じ、オブジェクト自身が内部状態に基づいて判断を行います。
class BankAccount:
def __init__(self, balance):
self.balance = balance
def has_sufficient_balance(self, amount):
# 内部で残高が十分かどうかを判断する
return self.balance >= amount
# 良い例: クライアントは命令を出し、オブジェクトに判断させる
account = BankAccount(100)
if account.has_sufficient_balance(50):
print("十分な残高があります。")
else:
print("残高が不足しています。")
まとめ
- 「尋ねるな命じろ」の原則は、オブジェクトに直接操作を命じ、内部状態の問い合わせを避けることで、カプセル化を強化し、責務を明確にします。
- このアプローチにより、コードの保守性や拡張性が向上し、システム全体が変更に強くなります。
- 結果として、各オブジェクトが自らの役割を担い、柔軟で堅牢な設計が実現されます。
この原則は、堅牢なオブジェクト指向設計を目指す上で非常に有効な指針となります。