デメテルの法則

law-of-demetre.png

デメテルとは農業の女神だそうです。

定義

最小知識の原則(Principle of Least Knowledge)とも呼ばれる。

直接の友達とだけやりとりする

オブジェクト間のやりとりと、少数の身近な「友達」だけに減らすようにする。

直接の友達って具体的にはなに?

直接関係のあるオブジェクトの関数だけを呼ぶ。
それはどんな関数か?

  • 自分のメンバ関数
  • 関数の引数として渡されたオブジェクトのメンバ関数
  • 関数が作成またはインスタンス化するあらゆるオブジェクト
  • 自分のメンバ変数担っているオブジェクトの関数

これらを見てると、大体網羅されているように思える
じゃあ、これに反した悪い例ってなんだろう?

ダメな例

System.out.printn();

というのがダメなパターン。
でも上の文は、Hello Worldでも出てくる有名な一文ですよね?
このパターンを消そうと躍起になることはないのです。

これのメリット

  • オブジェクト間の依存性が減る
  • システムのある部分に対する変更が他の部分にも連鎖してしまうような設計を回避できる

多くのクラスの間に多くの依存関係を構築すると、保守コストがかかり、他者が理解し難い脆弱なシステムになる

あまりこれを気にしすぎるとどうなるか?

  • 沢山のラッパークラスを書くことになる
  • その結果複雑さと開発期間が増加し、実行時のパフォーマンスが悪化するかも。
  • Androidの場合関数の個数に上限があるので、これを気にしすぎると関数の個数が増えてよくない

わたし的にはこの法則を気にしてただのラッパー関数書くぐらいだったらやらなくていいと思う

関連するデザインパターン


facade

サポートサイト Wikidot.com facade