【问题标题】:Parameters check responsibility between caller and called? [closed]参数检查调用者和被调用者之间的责任? [关闭]
【发布时间】:2011-12-07 01:54:09
【问题描述】:

一般来说,调用者应该保证将格式正确的数据传递给被调用的方法(因此被调用的方法假定数据始终有效)还是被调用的 strong> 应该进行数据验证的方法?每种方法的优缺点是什么?

this.data = user.input;

// Caller check data
if (!this.data) throw new Exception("Data cannot be null.");
obj.consume(this.data);

public void consume(data)
{
   // Called check data
   if (!data) throw new Exception("data cannot be null.");
}

【问题讨论】:

    标签: design-patterns programming-languages methods call


    【解决方案1】:

    面向外部的(公共、受保护、导出等)方法应该验证它们的输入,因为它们可能被未知的未来调用者调用。对于面向内部的(私有、内部、内部等)方法,这不是必需的,因为调用者在您的控制之下并且可以假定知道它在做什么。

    【讨论】:

      【解决方案2】:

      一般来说,每个公共方法都应该将其输入作为一个单元进行验证:

      public Output Method1(Input1 input1, Input2 input2)
      {
        if(input1 == null)
          throw new NullReferenceException("input1");
        if(input1 == null)
          throw new NullReferenceException("input2");
        // ...
      }
      

      您不断在每一层中通过异常进行验证,并且每一层决定是处理该异常还是将其扔到下一层。

      【讨论】:

      • this 有什么好处 - 当您引用 input1 时,它无论如何都会抛出......
      【解决方案3】:

      这个问题无法笼统地回答。如您所见,这里的两个人已经有了不同的想法。 (就我而言,我不同意每个公共方法都需要检查它们的参数......)所以何时检查:如果您的方法得到外部数据,例如通过 REST 请求。这意味着服务层级别上的所有方法都需要检查它们的参数,并且这些方法是公共的、包访问还是受保护的完全无关紧要。在私有方法上我也会这样做,除非我 100% 确定其他人已经在更高级别上进行了检查。

      OTOH,如果我制作了一个“库”,那么我也可以在文档中指定:确保所有给定的参数都正确,库不执行参数检查。 例如。我有一个用于矩阵和向量计算的库,我当然不会在使用它们进行计算的每种方法中执行“vec!= null”和“mat!= null)。我也明确地不做 vec.length() == mat.height() 测试。如果有的话,我会使用断言。(参见例如经典的 C 字符串操作)。

      因此,如果您现在需要更多保存库,没有人会阻止您为库中的每个操作编写包装方法来进行此类检查。

      但是,在必须使对象持久化的环境中,您可能需要注意它们的内部状态是“正确的”。所以你可能想要更严格的参数处理。然而,在这里你不能简单地决定:所有公众都进行检查,所有私人都没有。然而,作为一个开发团队,你可以决定:我们总是这样做,因为我们看到它有一定的价值(也许避免单元测试代码中的错误)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多