1

オブジェクト指向プログラマーとしてやじを飛ばすようなレガシー コードに出くわしました。

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

今、実装がお互いを認識しないようにリファクタリングする必要があると思います。それを行う方法は簡単です。私が明確に理解できないのは、SOの善良な人々が私を助けてくれることを望んでいるのですが、なぜですか。

理論的な理由はわかります。オブジェクト指向の設計がひどいのです。しかし、私はここで悪魔の擁護者を演じて、質問しています - 2 つの実装が互いの知識を持っていることの実際的な欠点は何ですか。この (私の考えでは) アンチパターンを取り除くために、なぜ時間とお金を費やさなければならないのでしょうか?

これに関する情報やリンクをいただければ幸いです。

4

4 に答える 4

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();
    }
}

なぜ、関心の分離を「ひどくオブジェクト指向の設計」と見なすのですか?装飾されたクラスが、物事をより効率的にするために、それ自体の一部ではないメンバーの特定の実装について知っていて、呼び出しているとしても、それは私には特にひどいようには見えません。それはただ1つのクラスが別のクラスを知っているだけであり、それらはたまたま同じインターフェースを実装しています。それらは、についてしか知らない上記の例よりも緊密に結合されていますが、それでも「ひどい」わけではありません。IFooIFooIFoo

于 2012-05-07T19:21:18.827 に答える
1

インターフェイス 1 の実装 1 がインターフェイス 1 の実装 2 を認識している、またはそれとやり取りしていることに問題はありません。

意図した、または意図しないプロキシ パターンの実装を見つけたと思います http://en.wikipedia.org/wiki/Proxy_pattern

お役に立てれば :)

于 2012-05-08T11:25:07.310 に答える
0

最初の実装が呼び出す「他の実装」のそのメソッドは、私がライブラリ関数と呼ぶものです。それを別のモジュール/ファイル/プロジェクト/その他(言語/開発環境によって異なります)に配置し、両方の実装にそれを含めて、そこから使用します。

共通コードを含むいくつかのインターフェースの2つの実装にはまったく問題はありませんが、もちろん、共通コードを各実装から分離して、どちらかをプログラムにロードし、もう一方をロードする必要がないようにする必要があります。

于 2012-05-07T19:19:52.810 に答える
0

これについての私の考えは

  1. やがて、一方の実装を廃止し、それを個別に保持している場合、もう一方の実装に変更はなく、テストする必要がないとします。分離がない場合は、他の実装の分離とテストに時間を費やす必要があります。

  2. 単一責任を持つことは常にクリーンです。

于 2012-05-07T19:22:08.530 に答える