测试这个的最佳方法是什么?具有4个位置的二进制数字

Chr*_*311 7 java binary combinatorics

考虑Web表面上的4个输入字段A,B,C和D. 用户可以任意填写任何这些.如何填充这些字段有16种组合.允许的是:

A B C D
-------
1 0 0 0
1 1 0 0
1 1 1 0
1 1 1 1
Run Code Online (Sandbox Code Playgroud)

其中1表示not null0表示null.

我正在使用jsf的MVC模式.我不希望逻辑在视图中,而是在控制器中.在Java中检查这个的最佳方法是什么?

到目前为止,我实施了两个解

解决方案1:

@Override
public boolean isInputInvalid(Integer a, Integer b, Integer c, Integer d) {
    if (isNotSet(a) && isNotSet(b) && isNotSet(c) && isNotSet(d) {
        return true;
    }
    return (firstParameterDoesNotExistAndSecondDoesExist(a, b)) || (firstParameterDoesNotExistAndSecondDoesExist(b, c)) || (firstParameterDoesNotExistAndSecondDoesExist(c, d));
}

private boolean firstParameterDoesNotExistAndSecondDoesExist(Integer firstParameter, Integer secondParameter) {
    return isNotSet(firstParameter) && !isNotSet(secondParameter);
}

private boolean isNotSet(Integer parameter) {
    return parameter == null;
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

public boolean isInputValid(Integer a, Integer b, Integer c, Integer d) {
    if (exists(a) && !exists(b) && !exists(c) && !exists(d) || //
            exists(a) && exists(b) && !exists(c) && !exists(d) || //
            exists(a) && exists(b) && exists(c) && !exists(d) || //
            exists(a) && exists(b) && exists(c) && exists(d)) {
        return true;
    }
    return false;
}

private boolean exists(Integer level) {
    return level != null;
}
Run Code Online (Sandbox Code Playgroud)

注意:

第一种方法检查输入是否无效,而第二种方法检查输入是否 有效(注意方法的名称).

我写了16个单元测试用例,两个版本都运行绿色.

您对如何使代码更具可读性有任何提示/提示/技巧吗?

Rob*_*bAu 2

有效组合为:1000、1100、1110 和 1111

如果您只关心可读性:

public static List<String> validOptions = Arrays.asList("1000","1100","1110","1111");

public boolean isValid(Integer a, Integer b, Integer c, Integer d)
{
    StringBuilder sb = new StringBuilder();
    sb.append(a==null ? 0 : 1); 
    sb.append(b==null ? 0 : 1), 
    sb.append(c==null ? 0 : 1); 
    sb.append(d==null ? 0 : 1);
    return validOptions.contains(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是最快或最干净的解决方案(浪费一些 CPU 和内存)