私は次のようなものを持っています: self.megacity.resourceloader.sound.mcintro.play()
このような長いものを防ぐエレガントな方法はありますか? ある種の構造変化でしょうか。
ありがとう。
デメテルの法則を調べて、プログラム内のコンポーネント間の結合を緩めるより良い方法を見つけてください。
オブジェクト指向プログラムに適用される場合、デメテルの法則はより正確には「関数/メソッドのデメテルの法則」(LoD-F) と呼ぶことができます。この場合、オブジェクト A はオブジェクト インスタンス B のサービスを要求する (メソッドを呼び出す) ことができますが、オブジェクト A はオブジェクト B を「経由して到達」し、さらに別のオブジェクト C にアクセスしてそのサービスを要求することはできません。そうすることは、オブジェクト A が暗黙のうちにオブジェクト B の内部構造についてより多くの知識を必要とすることを意味します。代わりに、必要に応じて B のインターフェイスを変更して、オブジェクト A の要求を直接処理し、関連するサブコンポーネントに伝達できるようにする必要があります。あるいは、A がオブジェクト C への直接参照を持ち、それに対して直接要求を行うこともできます。法則に従えば、オブジェクト B だけが自身の内部構造を知っています。
x = self.megacity.resourceloader.sound.mcintro
x.play()
Facade パターンを使用します。例:
class SoundPlayer:
def play_megacity(self):
return self.megacity.resourceloader.sound.mcintro.play()