2015-12-14 40 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());