首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用if和几个if重构业务逻辑

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

Stack Overflow用户
提问于 2015-12-15 06:58:44
回答 3查看 146关注 0票数 0

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

代码语言:javascript
复制
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
}

现在,方法可以返回多个字符串,所以employee可以成为example.Now的管理员和办公室主任我需要在第一个if和第一个else if中组合实现,我不想迷失在几个if -语句中,所以我想问您是否有更好的解决方案来解决这个问题。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-12-15 08:50:57

您可以像这样定义Dictionary<string, Action>Dictionary<string, Func>

代码语言:javascript
复制
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")) },
};

然后简单地调用逻辑:

代码语言:javascript
复制
foreach(var position in listPositions) {
  if (actions.ContainsKey(position)) {
    actions[position]();
  }
}

Edit:或者用作密钥Predicate<string>,稍微复杂一点的示例:

代码语言:javascript
复制
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")) }
};

然后只需调用适用的操作:

代码语言:javascript
复制
var actionToExecute = listPositions.SelectMany(
  position => PredicatedActions.Keys.Where(condition => condition(position)).Select(key => PredicatedActions[key])
).Distinct();

actionToExecute.ToList().ForEach(action => action());
票数 2
EN

Stack Overflow用户

发布于 2015-12-15 07:37:55

您在这里要使用的是一个strategy pattern。关于这一点的开创性文本是Gamma et的Gang Of Four一书。阿尔。如果您是设计模式的新手,Head First Design Patterns可能更容易访问。大量的网站和其他资源都在讨论这种模式。我强烈建议您查看它以及这些资源中讨论的其他设计模式。

票数 1
EN

Stack Overflow用户

发布于 2015-12-15 07:04:28

您可以使用switch语句,我发现它们更容易阅读。

或者,不要使用if /else、if / else,只需在一行中使用一组if语句。然后,这些可以捕获有效位置:

代码语言:javascript
复制
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
}

然后在最后检查人员所担任的职位,并应用所有相关的业务逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34278164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档