簡體   English   中英

重構我的C#代碼 - 切換語句

[英]Refactor my C# code - Switch statement

我有以下代碼,我目前正在使用....基本上,此方法為每個任務分配正確的布爾標志(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 =布爾值

歡迎任何反饋。 我相信有一個簡單的解決方案。

對於像這樣的很多值,我會使用這樣的地圖:

Dictionary<ClassStructure.Tasks_CallIDs_Strings, Task_Flag>

並通過映射CallIDs字符串來檢索值。

編輯:

正如大家現在所看到的,重構這個例子的真正問題在於重構User.TASKX。 使它成為一個列表就足夠了 - 因為它可以被相同的字符串ClassStructure索引.Tasks_CallIDs_Strings

哦......重新考慮你的命名方案。

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

我在想這樣的事情 - 但也許我錯過了這一切的重點?

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類可以具有允許您傳遞函數指針(到實際執行任務的函數)的屬性 - 並且您可以向User添加其他方法,如ExecuteTasks ......

你可以改為使用數組/任務列表,並使用Task_CallID作為索引嗎?

例如

User.Tasks[Task_CallID] = data.Task_Flag;

如果您必須將它們全部作為成員,還有其他選擇:

  1. 保持從Task_Call_ID到PropertyInfo引用的映射,並使用它來設置正確的屬性
  2. 使用反射根據數字位(X)查找屬性並設置該屬性

這兩個都是基於反射的,有點討厭。

為什么不將用戶任務結構化為列表:

用戶類

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

您的方法變為:

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

也就是說你完全不需要這個方法。 然后,您的訪問者將運行查找用戶的任務並檢查任務標志。

字典是一個很好的選擇。 但是,當交換機/案例變得非常復雜時,請考慮使用策略模式(盡管不適用於您的場景)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM