代码之家  ›  专栏  ›  技术社区  ›  Paul Sasik

什么是防护方法/类?

  •  2
  • Paul Sasik  · 技术社区  · 15 年前

    我刚注意到这里提到的守卫方法/类 question 我并没有从答案中得到这个概念。唉,乔恩·斯基特与微软网站的链接从来没有加载过。一些快速的谷歌搜索似乎只产生产品,而不是软件工程概念。

    如有任何解释和/或样品,将不胜感激。(尤其是在.NET方面。)

    3 回复  |  直到 14 年前
        1
  •  1
  •   Khanzor    15 年前

    guard子句是面向方面编程的一部分,您可以在其中定义方法的允许输入。

    根据我对.NET实现的了解(我还没有真正研究过),您可以使用属性(例如

    public static void NeverGetNull([ThisParamNotNull]MyClass i, [ThisParamNotNull]OtherClass j)
    {
       // Will never need to check for null values on i or j!
    }
    

    实际上,我知道erlang中的哪些guard表达式,其中方法调度依赖于guard方法。下面我将给出一些伪代码来说明这一点:

    myMethod(input i) where i is an int
    {
     return i + 10
    }
    myMethod(input i) where i is an int and i > 10
    {
     return i - 10
    }
    
    var i = myMethod(1) // returns 11
    var i = myMethod(i) // returns 1
    

    可能不太明显,您可以在guard中提供一个表达式,在分派期间对其进行评估。挺干净的,嘿?

        2
  •  1
  •   James Black    15 年前

    如果不指定异常,则.NET将 RaiseContractFailedEvent ,但可以指定 ArgumentOutOfRangeException ArgumentNullException .

    如果您查看jon skeet的链接,在文档pdf中,您将看到许多示例,其中之一是:

    Contract.Requires( x ! = null );
    

    这是合同设计的一部分,您可以在其中指定前提条件和后置条件。其优点是,在使用输入参数之前不需要进行大量的验证,这有助于调用函数了解结果是否符合约定,因此,如果字符串返回不允许为空,那么在调用函数时,由于先决条件检查,不必测试空值。

        3
  •  0
  •   gn22    15 年前

    这是典型的guard子句用例的一个很好的概要:

    Refactoring guard clauses, or “How to ask politely”