反转价值

时间:2013-08-25 15:39:53

标签: java refactoring

我有一个标志,我想传递给一个函数,该函数根据map中的值返回true或false:

// userList is a List<String> and is stored as the value field in a map
// user is a String
if(flag)
{
    if (userList == null)
        return false;
    else if(userList.size() == 0)
        return true;

    return userList.contains(user);
}
else
{
    if (userList == null)
        return true;
    else if(userList.size() == 0)
        return false;

    return !userList.contains(user);
}

我的问题是:无论如何要整理这个代码,有很多复制(if和else块是相同的,除了它们的返回值是彼此相反的)。

我不是一个非常有经验的代码,我真的很感激一些指导!

6 个答案:

答案 0 :(得分:2)

使用flag值而不是常量。

if (userList == null)
    return !flag;
else if(userList.size() == 0)
    return flag;

XOR将用于最后一个陈述(留给读者的练习:-p)

答案 1 :(得分:2)

我们可以将公共处理移动到它自己的方法,然后根据flag变量进行分支,如下所示。

public boolean userExists(String user) {
    return userList != null && (userList.size() == 0 || userList.contains(user));
}

...

if(flag) return userExists(user);
else return !userExists(user);

作为旁注,您可能会遇到逻辑错误。在return true的情况下,我不确定您为什么要userList.size() == 0

答案 2 :(得分:2)

这是一种简化整段代码的方法,删除了外部if/else语句:

if (userList == null)
    return !flag;
else if (userList.isEmpty())
    return flag;
return userList.contains(user) == flag;

答案 3 :(得分:1)

if (userList == null)
    return !flag;
else if(userList.size() == 0)
    return flag;

return flag ? userList.contains(user) : !userList.contains(user);·

答案 4 :(得分:0)

您可以通过使返回值成为flag的函数来轻松删除重复:

if (userList == null) {
    return !flag;
} else if (userList.size() == 0) {
    return flag;
}

return !flag ^ userList.contains(user);

答案 5 :(得分:0)

return userList != null && userList.contains(user) == flag;

可以做这个工作。