使用if和其他几个if重构业务逻辑

时间:2015-12-14 22:58:44

标签: c# if-statement

我有返回员工职位列表List<string> listPositions的方法。如果方法只返回一个字符串,那么基本逻辑将是这样的:

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
}

现在,方法可以返回多个字符串,因此员工可以是Admin和Office Director。现在我需要在第一个if和第一个else if中组合实现,而我不需要&#39;我想在几个if语句中迷失,所以我问你是否有更优雅的解决方案来解决这个问题。 谢谢。

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

您想在这里使用的是strategy pattern。关于此的开创性文本是Gamma等人的Gang Of Four书。人。如果您不熟悉设计模式,Head First Design Patterns可能更容易访问。许多网站和其他资源都在讨论这种模式。我强烈建议您查看这些资源中讨论的其他设计模式。

答案 2 :(得分: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
}

然后在最后检查一下这个人持有的职位,并应用所有相关的业务逻辑。