如何使复杂条件看起来不错并保存语句数量?

在我的java应用程序中,我有很多条件决定只有一个动作。 我的问题是如何使它看起来很好(我使用NetBeans所以我更喜欢不会被其代码格式化function破坏的解决方案)。 我也希望尽可能减少if / else语句的数量,因为我认为它会使它更快。

我的原始代码很乱,所以我制作了一个动作图: 复杂的行动图充满条件 。 如果你想玩它, 请复制一份 。 请记住,关于UML 语法的图表并不完美,部分原因是因为我使用谷歌文档。

这是代码:

if (!config.get("checkForSpecials") || event.isNotSpecial()) { if (config.get("filterMode").equals("blacklist")) { if (!itemFilter.contains(event.getItem().getName())) { item.process(); } } else if (config.get("filterMode").equals("whitelist")) { if (itemFilter.contains(event.getItem().getName())) { item.process(); } } else { item.process(); } } 

有两件事我不喜欢它 – 条件不太清楚(特别是当我展开完整的方法名称和配置字符串时),以及进程方法调用有三次。

将布尔值分解出来并从方法调用中缓存返回值有助于澄清代码。

此外,在逻辑表上绘制所有结果可以提供帮助。 我用这个工具来帮忙。

使用链接工具:

 A: config.get("filterMode").equals("blacklist") B: config.get("filterMode").equals("whitelist") C: filterContainsName (see below) 

该工具生成:

 (!A && !B) || (!A && C) || (A && !C) 

这导致下面的代码(用一个小的调整代替(!A && C)(B && C) ):

 boolean filterContainsName = itemFilter.contains(event.getItem().getName()); boolean useBlacklist = config.get("filterMode").equals("blacklist"); boolean useWhitelist = config.get("filterMode").equals("whitelist"); if (!config.get("safeMode") || event.isSafe()) { if((!useBlackList && !useWhiteList) || ( useWhiteList && filterContainsName) || ( useBlackList && !filterContainsName)) { item.process(); } } 

使用地图。 映射的关键是条件/大小写,值是单个方法类/ anonymouse接口,其中包含该条件的逻辑。 每当遇到某种情况/情况时,您只需在地图中查找并执行相关function即可。 这样你甚至可以将你的逻辑分离成单独的类(如果需要为了代码美)。 作为额外奖励,当条件数> 10时,您可能会获得性能奖励。

看起来很好,因为它对我来说。 也许你可以将调用item.process()的有效条件隔离到一个方法,使其更容易理解。

 if (!config.get("safeMode") || event.isSafe()) { if (isItemValidForProcess(config, itemFilter, event)) { item.process(); } } boolean isItemValidForProcess(config, itemFilter, event) { String filterMode = config.get("filterMode"); if (filterMode.equals("whitelist")) { return itemFilter.contains(event.getItem().getName()); } if (filterMode.equals("blacklist")) { return !itemFilter.contains(event.getItem().getName()); } return true; } 

信不信由你,图表并不复杂:)没有循环,它是相当线性的。

这是一个实现它的伪代码

 void action() if  if  return; if  if not  return; if  if < filter mode = whitelist> if not  return; else // black list if not  return; // finally! [process item] 

对于非常复杂的图表,答案是…… 转到 ……