概念
デメテルの法則(Law of Demeter、LoD)は、1980年代後半にノースイースタン大学のイアン・ホーランド(Ian Holland)によって開発されたオブジェクト指向システム設計のガイドラインです。この法則は、「直接的に関連する友達とのみ最小限のコミュニケーションを行う」という原則を通じて、オブジェクト間の結合度を低くし、システムのモジュール性を向上させることを目指しています。
重要なポイントは、オブジェクトが自分が生成したオブジェクトまたは直接渡されたオブジェクトとのみ相互作用すべきであることです。これは、オブジェクト間の相互作用を完全に排除することを意味しないことに留意してください。重要なのは、オブジェクトが不必要に他のオブジェクトに間接的にアクセスすることを避けることです。
この法則に従うことで、情報の過度な伝達を制御し、複雑なシステム設計で不必要な依存関係を減らすことができ、システムの保守性と拡張性を向上させることができます。さらに、エンジニアは短期記憶に少ない情報を保持することで、システムの構造をより簡単に理解し、変更することができます。
原則
「F」というメソッドがあると仮定したとき、デメテルの法則が言う"F"メソッドの「直接関連する友達」は次のようになります。
- 「F」メソッドを持つオブジェクトのメソッド
- 「F」メソッドを持つオブジェクトのプロパティ
- 「F」メソッドのパラメータ
- 「F」メソッド内で生成されたオブジェクト
例(RUBY)
class Mail
attr_reader :from, :to, :body
def initialize(from, to, body)
@from = from
@to = to
@body = body
end
end
class Mailer
attr_reader :smtp_server_address
def initialize(smtp_server_address)
@smtp_server_address = smtp_server_address
end
# メールオブジェクト(Mail)の生成と初期化を担当し、実際のメール送信のために内部的にdeliverメソッドを呼び出します。
def send_email(from, to, body)
mail = Mail.new(from, to, body) # 3.「F」メソッドのパラメータ、4.「F」メソッド内で生成されたオブジェクト
deliver(mail) # 1. 「F」メソッドを持つオブジェクトのメソッド
end
private
# deliverメソッドはSMTP サーバに接続してメールを転送するコードなど実際にメールを送るロジックをカプセル化します。
def deliver(mail)
puts "Connecting to SMTP server at #{$smtp_server_address}..." # 2. 「F」メソッドを持つオブジェクトのプロパティ
puts "Email from '#{mail.from}' to '#{mail.to}' sent with body: '#{mail.body}'"
end
end
mailer = Mailer.new("smtp.example.com")
mailer.send_email("sender@example.com", "receiver@example.com", "Hello, this is a test email.")
参考
- Law of Demeter (General Formulation) - Northeastern University
- The Pragmatic Programmer - Bend, or Break (Decoupling)