4

現在使用している次のコードがあります....基本的に、このメソッドは各タスクに正しいブールフラグ(TRUE/FALSE)を割り当てます。ますます多くのタスクを追加する必要があるため、すべてのタスクに対応するために switch ステートメントを拡張する必要があることがわかります。

メソッドを小さく保つには、もっと簡単な方法が必要です。

コード: (命名規則は忘れてください。投稿用に変更されています)

public ClassStructure.User AssignTaskStatusToUser(ClassStructure.User,
                                                  List<ClassStructure.Tasks> TaskStatus)
{
    foreach (ClassStructure.Tasks data in TaskStatus)
    {
        string Task_CallID = data.Task_Call_ID;

        switch (Task_CallID)
        {
            case ClassStructure.Tasks_CallIDs_Strings.TASK1:
                User.TASK1 = data.Task_Flag;
                break;

            case ClassStructure.Tasks_CallIDs_Strings.TASK2:
                User.TASK2 = data.Task_Flag;
                break;

            case ClassStructure.Tasks_CallIDs_Strings.TASK3:
                User.TASK3 = data.Task_Flag;
                break;
        }
    }

    return User;
}

ClassStructure.Tasks_CallIDs_Strings = タスクの文字列表現

data.Task_Flag = ブール値

User.TASKX = ブール値

どんなフィードバックでも大歓迎です。簡単な解決策があると確信しています。

4

6 に答える 6

9

このような多くの値については、次のようなマップを使用します。

Dictionary<ClassStructure.Tasks_CallIDs_Strings, Task_Flag>

CallIDs 文字列をマッピングして値を取得します。

編集:

誰でもわかるように、この例のリファクタリングの本当の問題は、User.TASKX のリファクタリングにあります。リストにするだけで十分です。同じ文字列ClassStructure.Tasks_CallIDs_Stringsでインデックスを作成できるためです。

于 2009-02-18T15:02:39.620 に答える
2

私はこのようなことを考えていましたが、それが何のためにあるのかという点を見逃したのではないでしょうか。

public class User
{
    private Dictionary<string,Task> tasks;

    internal Dictionary<string,Task> Tasks
    {
      get { return tasks; }
      set { tasks = value; }
    }

    internal void AddTask(Task task)
    {
        tasks.Add(task.Task_Call_ID,task);
    }

    internal void AddTasks(List<Task> task)
    {
        foreach(Task task in Tasks)
        {
            tasks.Add(task.Task_Call_ID,task);
        }
    }
}

Taskクラスには、そのような柔軟性が必要な場合に関数ポインターを(実際にタスクを実行する関数に)渡すことができるプロパティを含めることができます。また、ExecuteTasksなどの他のメソッドをUserに追加することもできます...

于 2009-02-18T16:01:39.090 に答える
2

ああ...命名スキームを再考してください。

public delegate void TaskAssigner(User user, bool taskFlag)

IDictionary<string, TaskAssigner> taskAssigners = new Dictionary<string, TaskAssigner>();

...

taskAssigners.Add(ClassStructure.Tasks_CallIDs_Strings.TASK1, (u, t) => u.TASK1 = t;);
taskAssigners.Add(ClassStructure.Tasks_CallIDs_Strings.TASK2, (u, t) => u.TASK2 = t;);

...

foreach(ClassStructure.Tasks data in TaskStatus)
    taskAssigners[data.Task_Call_ID](user, data.Task_Flag);
于 2009-02-18T15:04:42.393 に答える
1

リストとして構造化されたユーザー タスクを作成しない理由:

ユーザークラス

public List<ClassStructure.Tasks> Tasks {
    get; set;
}

メソッドは次のようになります。

public void AssignTasks(User user, List<ClassStructure.Tasks> TaskStatus)    
{
    user.Tasks.AddRange(TaskStatus)   
}

つまり、メソッドはまったく必要ありません。アクセサーは、ユーザーのタスクに対して Find を実行、Tasks フラグをチェックするようになります。

于 2009-02-18T15:35:12.663 に答える
1

代わりにタスクの配列/リストを用意し、Task_CallID をそのインデックスとして使用できますか?

例えば

User.Tasks[Task_CallID] = data.Task_Flag;

それらすべてをメンバーとして持つ必要がある場合は、他のオプションがあります。

  1. Task_Call_ID から PropertyInfo 参照へのマッピングを維持し、それを使用して正しいプロパティを設定します。
  2. リフレクションを使用して、数値ビット (X) に基づいてプロパティを見つけ、そのプロパティを設定します。

これらはどちらもリフレクション ベースであり、少し厄介です。

于 2009-02-18T15:01:30.480 に答える
0

辞書はこれの優れた代替手段です。ただし、スイッチ/ケースが非常に複雑になる場合は、戦略パターンの使用を検討してください (ただし、シナリオではありません)。

于 2011-11-29T17:08:04.857 に答える