在我的java应用程序中,我有很多条件决定只有一个动作。我的问题是如何使它看起来很好(我使用NetBeans所以我更喜欢不会被其代码格式化功能破坏的解决方案)。我也希望尽可能减少if / else语句的数量,因为我认为它会使它更快。
我原来的代码很乱,所以我制作了一个动作图:。 Take 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();
}
}
有两件事我不喜欢它 - 条件不太清楚(特别是当我展开完整的方法名称和配置字符串时),以及进程方法调用有三次这样的事实。
答案 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]
对于非常复杂的图表,答案是...... 转到 ...