如何使复杂条件看起来不错并保存语句数量?
在我的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]
对于非常复杂的图表,答案是…… 转到 ……