2015-12-14 19 views
0

我有返回員工職位列表List<string> listPositions的方法。如果方法返回只有一個字符串的基本邏輯是這樣的:用if和其他幾種方法重構業務邏輯如果

if (listPositions.Contains("Admin")) 
{ 
    // business logic 1,for example Console.WriteLine("I'm Admin"); 
} 
else if (listPositions.Contains("OfficeDirector")) 
{ 
    //business logic 2 
} 
else if (listPositions.Contains("Regular") || listPositions.Contains("HumanResource")) 
{ 
    //business logic 3 
} 

現在,方法可以返回一個以上的字符串,這樣員工可以管理和辦公室主任example.Now我需要實施第一組合if和第一個else if,我不想迷失在幾個if語句中,所以我問你是否有更優雅的解決方案來解決這個問題。 謝謝。

+0

首先,將數據結構切換到「HashSet」而不是「List」。 – Servy

回答

0

您可以使用switch語句,我發現它們更容易閱讀。或者,而不是使用if/else,if/else,只需在一行中添加一堆if語句即可。然後,這些可以捕捉有效的位置:

if (listPositions.Contains("Admin")) 
{ 
    // Concatenate some string or add to a list for final checking 
} 
if (listPositions.Contains("OfficeDirector")) 
{ 
    // Concatenate some string or add to a list for final checking 
} 
if (listPositions.Contains("Regular") || listPositions.Contains("HumanResource")) 
{ 
    // Concatenate some string or add to a list for final checking 
} 

然後必須在對哪個位置的人認爲年底一些檢查,並應用所有相關的業務邏輯。

1

你想在這裏使用的是一個strategy pattern。關於這方面的開創性文本是Gamma et al。的書Gang Of Four。人。如果你是新手設計模式,Head First Design Patterns可能更容易訪問。大量的網站和其他資源討論這種模式。我強烈建議您檢查一下這些資源中討論的其他設計模式。

2

您可以定義Dictionary<string, Action>Dictionary<string, Func>

Dictionary<string, Action> actions = new Dictionary<string, Action> 
{ 
    { "Admin", new Action(() => Console.WriteLine("I'm Admin")) }, 
    { "OfficeDirector", new Action(() => Console.WriteLine("I'm OfficeDirector")) }, 
    { "Regular", new Action(() => Console.WriteLine("I'm Regular or HumanResource")) }, 
    { "HumanResource", new Action(() => Console.WriteLine("I'm Regular or HumanResource")) }, 
}; 

,然後簡單地調用邏輯:

foreach(var position in listPositions) { 
    if (actions.ContainsKey(position)) { 
    actions[position](); 
    } 
} 

編輯: 或者作爲重點Predicate<string>使用,稍微複雜些例子:

static Dictionary<Predicate<string>, Action> PredicatedActions = new Dictionary<Predicate<string>, Action>() 
{ 
    { p => p == "Admin", new Action(() => Console.WriteLine("I'm Admin")) }, 
    { p => p == "OfficeDirector", new Action(() => Console.WriteLine("I'm OfficeDirector")) }, 
    { p => p == "HumanResource" || p == "Regular", new Action(() => Console.WriteLine("I'm Regular or HumanResource")) } 
}; 

然後只是請致電適用的操作:

var actionToExecute = listPositions.SelectMany(
    position => PredicatedActions.Keys.Where(condition => condition(position)).Select(key => PredicatedActions[key]) 
).Distinct(); 

actionToExecute.ToList().ForEach(action => action());