2016-03-21 9 views
1

Law of Demeter(LOD)を呼び出すと、長時間の呼び出しができなくなります。クラス内で直接作成されたオブジェクト、またはメソッド内で作成されたオブジェクト、メソッド内でパラメータとして渡されたオブジェクトのみでメソッドを呼び出すと言います。 B b;がクラスAフィールドであるとBが、その後、A.javab.c.performOperation();を呼び出すためのよくない習慣をタイプC、(C c;)のフィールドを持っている場合。デモータの法則を実装する際のアダプタパターンヘルプがどのようにして

私の理解によれば、各クラスはフィールドを抽出してメソッドを呼び出すのではなく、フィールド内のフィールドで操作を行う小さなメソッドを持つべきです。また、これを達成するためにVisitor patternを使用できることを理解しています。しかし、私はアダプタを読むこともこれを実装する一つの方法です、私は理解できませんでした。

アダプタは、単にそれにAdapteeクラスのオブジェクトを持っており、他のシステムのinterface(両方Adapteeinterfaceそれぞれ、他に互換である)を実装します。 Adapteeのメソッドを呼び出すために委譲を使用します。ここでLODは縫い目に違反していませんが、アダプターのパターンを使用していないかどうかはわかりません。

私から取ったリファレンスサイトからです:http://c2.com/cgi/wiki/LawOfDemeter?LawOfDemeter

ObjectQueries?およびAdapterPatternは、LawOfDemeter を実装する2つの方法です。 - DaveOrme

答えて

1

は、これは私がその意味を考えるものです:彼らはデメテルの法則に従うように、アダプタのパターンを使用することについて語るとき

、彼らはあなたが説明した標準Adapterパターンのユースケースよりも別のケースについて話しています。

他の誰かが公共の場で公開されること、書いたことを、我々はクラスがあるとしましょう:

public class DataClass { 
    public Data data; 
} 

我々はどこにでも我々のコードでデータフィールドにアクセスしたい場合は、我々はチェーンを呼び出して取得:

dataClass.data.doOperation() 

アダプタは、このコールチェーン「非表示」に使用することができます。

public class DataClassAdapter { 
    DataClass wrappedInstance; 

    public void doOperation() { 
     wrappedInstance.data.doOperation(); 
    } 
} 

その後、我々はCALができ私は好きです:

dataAdapter.doOperation(); 

コールチェーンなし。

「アダプタ」という単語は、ここでは多少誤って使用されていると私は主張します。アダプタのパターンは多少似ていますが。

+1

あなたが書いたものの拡張:アダプターパターンは緩やかに解釈されています。 *ラッパーメソッド*は、LoDを尊重しないコードの解決策です。 1つのパブリックメソッドを他の一連のカプセル化メソッドに変換するため、オブジェクトアダプタはラッパーとして見ることができます。 Façadeは同じことを行うことができます。それは単に委任(または間接参照)です。しかし、GoFアダプターパターンの[多型呼び出しを本質の一部として](http://stackoverflow.com/a/13323703/1168342)、オブジェクトアダプターは、そうでないコードの解決策ではありませんLoDを尊重する。 – Fuhrmanator

関連する問題