3

私はいくつかのコードを継承し、その中に500行のswitchステートメントがあります。基本的に、タスクをオンにしてstring、対応するアクションを実行します。

それ以来、各caseステートメントを新しいクラスの独自のメソッドに移動しました。巨大なswitchステートメントはまだ存在しますが、ロジックをインライン化する代わりに、各ケースはメソッドを呼び出すだけなので、非常に便利です。

問題は、メソッドが多くの異なるものを変更することです。メソッドの50%には0個の引数を渡す必要があります。一部の40%には5個の引数が必要で、残りの10%にはそれぞれ10個の引数が必要です。

現在これは機能しますが、もっと良くしたいと思います。switchステートメントを削除するか、何らかの方法で渡されるパラメーターの量を減らします。

sをsにDictionaryマップしてスイッチ全体を削除することを考えていましたが、多くのrefパラメーター(プリミティブ型)を使用していて、それらをに渡す方法がないため、これは機能しません。コンストラクターを作成し、後で参照的に変更してもらいます。stringAction

この問題の明らかな解決策は、16個程度の変数すべてを別のクラスに配置して渡すことですが、それらの多くはあまり関連していないため、ある問題を別の問題に置き換えるだけです(非凝集データを含む長いパラメーターリスト)。クラス)。

このコードを改善する他の方法があるかどうか疑問に思っていました。読んでくれてありがとう。

4

3 に答える 3

3

どんな種類のコードも見ることができなくても、私ができる唯一のアドバイスは、SOLID設計原則を使用したテストを念頭に置いてリファクタリングを検討する必要があるということです。ロジックのモジュール(またはスイッチの条件)ごとに異なるクラスを作成し、(メソッドのパラメーターとしてではなく)それらのオブジェクトのコンストラクターを介して依存関係を渡し、作業に使用できる統一されたインターフェイスを作成しようとします。いくつかのテストで。ファクトリをスローすることにより、これらのオブジェクトの条件付き作成を抽出したい場合があります。しかし、混乱のように聞こえます。幸運を。

于 2012-10-17T03:32:13.047 に答える
3

あなたの質問にはコードが含まれていないので、答えも実際にはできません。最善の方法は、史上最高のソフトウェアブックの1つである82ページを参照することだと思います。リファクタリング:既存のコードの設計の改善

「オブジェクト指向コードの最も明白な症状の1つは、switchステートメントが比較的不足していることです。ほとんどの場合、switchステートメントが表示される場合は、ポリモーフィズムを検討する必要があります。」

次に、これを実現するために使用する特定のパターンのいくつかをリストします。

于 2012-10-17T03:46:33.310 に答える
1

デリゲートでパラメーターを使用することはできますが、組み込みまたは汎用のデリゲートrefを使用することはできません。次のように独自に定義する必要があります。ActionFunc

public delegate void DelegateWithRefParameters(ref int i, ref long l, ref bool b, ref object o);

public class Program
{
    public static void Main(string[] args)
    {
        int i = 0;
        long l = 0;
        bool b = false;
        object o = null;

        var lookup = new Dictionary<string, DelegateWithRefParameters>() 
        {
            { "object", ModifyObject },
            { "int", ModifyInt },
            { "bool", ModifyBool },
        };

        string s = "object";

        lookup[s](ref i, ref l, ref b, ref o);
    }

    private static void ModifyObject(ref int i, ref long l, ref bool b, ref object o)
    {
        o = new object();
    }

    private static void ModifyInt(ref int i, ref long l, ref bool b, ref object o)
    {
        i++;
    }

    private static void ModifyBool(ref int i, ref long l, ref bool b, ref object o)
    {
        b = !b;
    }              

}

同じシグニチャを使用するには、すべてのメソッドを変更する必要があります。

于 2012-10-17T03:36:05.560 に答える