1

私は同僚にリファクタリングを提案しましたが、彼は基本的に SRP を引用して反論しました。これが状況です。

私たちには、html 生成という関連するすべてのヘルパー メソッドがあります。適用するオプションがたくさんある可能性があります。それらを AB と C と呼びましょう。これらを組み合わせて一致させることができます。

彼の元のコードでは、すべてのオプションと有効な組み合わせに対して個別の方法を使用していました。順列はすぐに制御不能になる可能性があるため、これは悪いことだと思いました。

public string MethodWithA() { /* ... */ }

public string MethodWithB() { /* ... */ }

public string MethodWithC() { /* ... */ }

public string MethodWithAandB() { /* ... */ }

public string MethodWithAndC() { /* ... */ }

public string MethodWithBandC() { /* ... */ }

私たちの状況はこれほど極端ではありませんが、一般的なケースを求めています。

単一のメソッドが必要であり、オプションはパラメーターまたは列挙型フラグとして渡される必要があると言いました。

public string Method(SomeOptions flags)
{
    /* minimal base processing */

    if (/* flag A */)
    {
        ModifyForA();
    }

    /* etc for B and C */
}

彼の反応は、そのようにフラグをオンにすることは、メソッドが複数のことを行っていることを意味するというものでした。「クリーンコード」がフラグやスイッチステートメントが匂いであると言っていることは知っていますが、このケースには当てはまらないと思います。そのルールは、ポリモーフィズムの機会を見つけることだと思います。いずれにせよ、私のバージョンはまだ 1 つのことをしていると思いますが、それは解釈次第だと思います。

どちらのアプローチが優れているかを判断するために使用できる完全に主観的ではないものはありますか?

4

1 に答える 1

1

あなたの例は少し一般的すぎるため、わかりにくいですが、これらのアプローチはどちらも好きではありません。あなたが正しく指摘しているように、最初のものは組み合わせの爆発をもたらしますが、代替手段はテストや分析が不可能な巨大な方法になります. 私はある種のビルダーを好むか、流暢なインターフェースと呼ぶのが今では一般的です。次に、次のようなものがあります。

string html = htmlBuilder.WithA().WithC().Build()
于 2013-03-28T14:20:09.110 に答える