-1

我编写了以下代码,它首先验证一个矩阵,然后它会调用一个私有函数来添加它们,它验证是成功的。现在根据有效的 java 在私有函数中再次验证是一个很好的做法。但是,如果验证步骤本身很长,我们是否需要验证私有函数中的所有内容?如果不是那么在哪里画线?

private static void check(int[][] m1, int[][] m2, char op) {
    if (m1 == null || m2 == null) {
        throw new NullPointerException("No input matrix should be null.");
    }
    /**
     * Switch case was thought to be beneficial in case of future extensibility.
     * http://en.wikipedia.org/wiki/Switch_statement#Advantages_and_disadvantages
     */
    switch (op) {
        case 'a' : if (m1.length != m2.length && m1[0].length != m2[0].length) throw new IllegalArgumentException("bla bla"); else break;
        case 'm' : if (m1[0].length != m2.length) throw new IllegalArgumentException("bla bla"); else break;
    }
}

public static int[][] add (int[][] m1, int[][] m2) {
    check (m1, m2, 'a');
    return add(m1, m2, m1.length - 1, m1[0].length - 1);
}

private static int[][] add (int[][] m1, int[][] m2, int rows, int cols) {
    assert m1 != null;
    assert m2 != null;

    // final can be returned check Arrays docjar line 2843.
    final int[][] m = new int[rows + 1][cols + 1];

    for (int i = 0; i <= rows ; i++) {
        for (int j = 0; j <= cols; j++ ) {
            m[i][j] = m1[i][j] + m2[i][j];
        }
    }
    return m;
}

在这里,我只验证了矩阵是否为空.. 但如果我不验证传递的其他参数,那将毫无用处。再一次,这个问题是通用的,所以请不要建议代码改进。此代码仅作为一个更广泛问题的示例 - 在调用私有函数时要验证多少。谢谢,

4

2 回答 2

2

验证是将应用程序/库拆分为层的原因之一。

“公共”层应该验证。通常这是一个服务层或 API,或者通常是其他开发人员将调用的类/方法。

然后,在低级操作中,省略了验证,并且该方法确实希望输入已经经过验证。这个事实应该在 javadoc 中提到。

相关说明 - 当我第一次将验证违规收集到 a 时,我采用了一种技术List,然后在一个异常中报告所有这些违规。这对用户来说非常方便,因此他不必经历烦人的循环修复/尝试/修复/尝试/修复/尝试,而是修复、修复、修复、修复、尝试。

于 2013-07-06T03:32:50.933 回答
0

在我看来,在低级操作中显式检查空引用等(例如不同大小的矩阵)构成“代码膨胀”。在此示例中:应在加载或以其他方式修改矩阵结构的每个操作之后进行验证...对矩阵中 VALUES 的所有后续操作都应假定有效矩阵。

我还将直接在每个操作方法中进行“特定于操作”的验证,除非/直到验证代码变得“庞大”,在这种情况下,我会将其分解为单独的“验证 * 操作 *”方法。

这只是我的意见......基于在适当的时候向用户报告“错误输入”的经验,并帮助我在测试和调试过程中寻求破坏自己的错误。

干杯。基思。

PS:另一种选择是断言,它仅在“调试标志”打开时才有效,而不是在效率可能成为问题的生产环境中。

于 2013-07-06T00:43:52.660 回答