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

Amu*_*nak 8 java conditional-statements

在我的java应用程序中,我有很多条件决定只有一个动作.我的问题是如何使它看起来很好(我使用NetBeans所以我更喜欢不会被其代码格式化功能破坏的解决方案).我也希望尽可能减少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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*umb 7

将布尔值分解出来并从方法调用中缓存返回值可以帮助澄清代码.

此外,在逻辑表上绘制所有结果可能会有所帮助.我用这个工具来帮忙.

使用链接工具:

A: config.get("filterMode").equals("blacklist")
B: config.get("filterMode").equals("whitelist")
C: filterContainsName (see below)
Run Code Online (Sandbox Code Playgroud)

该工具制作出来:

(!A && !B) || (!A && C) || (A && !C)
Run Code Online (Sandbox Code Playgroud)

这导致了下面的代码(用小的调整,替换(!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();
    }
}
Run Code Online (Sandbox Code Playgroud)