2012-05-07 7 views
1

オブジェクト指向のプログラマーとして私のすべてのヘックルを育てたレガシーコードが出てきました。インターフェイスの実装は独立していなければなりません

よく使用されるパターンは次のとおりです。 インターフェイスには2つの実装があり、1つの実装ではもう一方のメソッドが呼び出されます。

ここで、実装が互いに知り合わないようにリファクタリングする必要があると思います。どのようにそれを行うのは簡単です。私が明確に理解できないもの - &だから、善良な人々が私を助けてくれることを望んでいるのはなぜ?

私は理論上の理由を見ることができます - それはひどいオブジェクト指向設計です。しかし私はここで悪魔の主唱者を演じて、お互いに知識を持っている2つの実装の実際的な欠点は何かを尋ねています。なぜ時間が&お金がこの(私の心の中で)反パターンを取り除くために費やされるべきですか?

これに関する情報やリンクは高く評価されます。

+0

ですね http://en.wikipedia.org/wiki/Proxy_pattern

希望を見つけたと思います。互換性の理由から、インターフェイスを変更するだけではできません。あなたはすべてのクライアントを破ります。したがって、新しいメンバーを追加してインターフェイスの新しいバージョンを作成し、元のインターフェイスメソッドを順番に呼び出して、元のインターフェイスをすべて複製します。それを行う最善の方法ではないかもしれませんが、それは方法であり、それは好都合であるという美徳を持っています。 –

+0

良い質問ですが、本当にSOの形式には属していないようです - これは間違いなく意見の勧誘であり、私はこれらの意見のいくつかを見たいと思っています。 –

+0

「それはひどいオブジェクト指向設計です」とは、(理論的には、それが意味するものであれ)それを取り除く理由ではなく、裏付けのない包括的なステートメントです。 – delnan

答えて

1

interface1のインプリメンテーション1がinterface1のインプリメンテーション2を認識しているか相互作用していても問題はありません。

は、私はあなただけプロキシパターンの意図や国連意図実装このことができます:)バージョン管理が行われているよう

+0

+1のリンクです。これは私が持っていたことを正確に説明します(それをやった理由と一緒に!) – OceanBlue

0

最初の実装が呼び出す「その他の実装」の方法は、私がライブラリ関数と呼ぶものです。別のモジュール/ file/project/whatever(あなたの言語/ dev envに依存します)に入れ、両方の実装にそれを組み込み、そこから使用するようにしてください。

一般的なコードを含むインターフェイスの2つの実装には間違いはありませんが、共通のコードを各実装から分離して、プログラムにロードできるようにする必要があります。

+0

確かに。それはそれを行う一つの方法でしょう。そうでない場合は、両方の拡張機能で使用できる共通コードを持つ基本クラスを持つ。問題はそれを行う方法ではありません。問題は、インターフェイスの2つの実装にお互いの知識があることは悪いですか? – OceanBlue

2

私は理論上の理由を見ることができます - それはひどいオブジェクト指向設計です。

なぜですか?それは私にとっては全く妥当に聞こえる。

たとえば、にはすべての通話をと飾りたいとします。あなたがいることを確認なぜ

public class DecoratedFoo : IFoo 
{ 
    private readonly IFoo original; 

    public DecoratedFoo(IFoo original) 
    { 
     this.original = original; 
    } 

    public string Bar() // Defined in IFoo 
    { 
     // Update statistics here, or whatever 
     return original.Bar(); 
    } 
} 

:コールが行われた頻度の統計を追加、またはチェックなど、いくつかの権限を追加するには本当実装、およびちょうどデリゲートは別にその装飾を保つために理にかなっています「ひどくオブジェクト指向の設計」となる懸念の分離?装飾されたクラスが具体的な実装IFooを知り、より効率的にするためにIFooの一部ではないメンバーを呼び出すとしても、それは私にとって特にひどいものではありません。別のクラスを知っているクラスの1つで、同じインターフェースを実装しています。それらは上記の例よりも密接に結合されており、のみは約IFooを知っていますが、それでもまだ「ひどい」ではありません。

+0

ジョン、それは面白いです。私の考えは主に読みやすさとメンテナンスでした。どのインプリメンテーションが誰によって使用されているかは、すべてSpringインジェクションによって行われるので、他のインプリメンテーションにはインジェクションがインジェクトされます。論理スレッドに従うのはかなり難しいです。 – OceanBlue

+0

@OceanBlue:私の経験はまったく逆です。私は、 "コア"実装の本物のビジネスロジックを統計収集に関する非機能的な要件とはるかに簡単に分離できることを発見しました。 –

+0

+1はコメント&例です。 – OceanBlue

0

使用すると、1つの実装を引退していて、別途、他に変化がないことを続けていると、あなたはそれをテストする必要がいけない場合は、この上の私の考えは、やがてに

  1. を想定しています。分離がない場合は、他の実装を分離してテストするのに時間を費やす必要があります。

  2. それは常に単一の責任を持っているクリーナーです。

関連する問題