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

时间:2013-01-10 20:58:07

标签: java conditional-statements

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

我原来的代码很乱,所以我制作了一个动作图:complex action diagram full of conditionsTake a copy如果你想玩它。请记住,该图表对于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();
    }
}

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

4 个答案:

答案 0 :(得分:7)

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

此外,在逻辑表上绘制所有结果可以提供帮助。我使用this tool来帮助。

使用链接工具:

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();
    }
}

答案 1 :(得分:4)

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

答案 2 :(得分:3)

对我来说很好看。也许您可以将调用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;
}

答案 3 :(得分:0)

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

这是一个实现它的伪代码

void action()

    if <sort out specials>
        if <is it special>
            return;

    if <check for unsafe items>
        if not <safe items list contains item>
            return;

    if <filter status = on>
        if < filter mode = whitelist>
            if not <item is on filter>
                return;
        else // black list
            if not <item is on filter>
                return;

    // finally!            
    [process item]

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