📜  斯卡拉 |前提条件(断言、假设、要求、确保)

📅  最后修改于: 2022-05-13 01:55:10.886000             🧑  作者: Mango

斯卡拉 |前提条件(断言、假设、要求、确保)

前置条件是指 Scala 中的一些条件,在进一步处理任何代码或程序之前需要满足这些条件。在Scala中,按合同设计(DbC)的过程,一个软件设计过程赋予Scala前提条件以意义和意义。上述方法由 Betrand Mayer 提供,它为代码块提供了一些后置条件和前置条件,如果不满足,则会引发异常。

Scala 前置条件是一组具有不同条件的主要功能,程序员在设计软件时必须遵循这些条件。这些函数来自Predef.scala包,无需导入任何单独的包。
方法是:

  1. 断言——用于一般断言
  2. 假设——陈述一个公理
  3. Require – 专门检查输入
  4. 确保- 是一个也已涵盖的后置条件。
  • 断言

    Assert 方法需要在执行某个操作时满足某个条件。如果满足此条件,则代码可以正常工作,否则将引发异常。在运行时检查异常。因此,assert() 方法是一种动态检查不变量的方法。上述方法将布尔语句作为参数,并在整个程序中检查是否违反了它。它抛出异常或断言错误。

    考虑以下程序作为申请过程的驾驶执照批准的一部分。如果申请人年龄不等于或超过 18 岁,则会产生错误。

    // Code to check the age of the applicant
    val applicant_age = 16
      
    // assert method calling
    assert(applicant_age>17)
    

    如果年龄超过了要求的最小值,则进程向前移动,否则,程序将抛出异常,如下所示:

    Exception in thread "main" java.lang.AssertionError: assertion failed

    Predef.scala中查找相同的代码,可以找到与上面类似的代码:

    def assert(assertion: Boolean) { 
      if (!assertion) 
        throw new java.lang.AssertionError("assertion failed") 
    } 
    
  • 认为

    假设方法预计将被静态分析工具使用。它应该限制为执行程序而必须检查的条件数量。如果违反了假设条件,检查器会默默地离开路径并且不允许程序走得更深。假设()方法与前面提到的断言()具有相同的语法,唯一的区别是它的执行。

    下面的例子讨论了一个假设申请人的年龄在任何情况下都大于或等于 18 岁的情况下执行的程序。主要代码已被避免,仅包含对假设 () 的调用的代码被合并。

    // Code to check the age of the applicant
    license_approval(17)
      
    // Method to approve the License application
    def license_approval(applicant_age:Int) {
      
      assume(applicant_age>=18)
    //……………
    //…………
    //…………
    //The main code for checking the other details of the applicant. 
    //……………
    //…………
    //…………
    }
    

    假设()方法为静态检查器提供了一个可以依赖的公理。这减轻了检查员的负担。如果假设()参数的布尔条件满足,则程序将运行更深的代码,否则,它会抛出异常:

    Exception in thread "main" java.lang.AssertionError: assumption failed

    类似的代码可以在 Predef.scala 包中找到:

    def assume(assumption: Boolean) { 
      if (!assumption) 
        throw new java.lang.AssertionError("assumption failed") 
    } 
    

    虽然 assert() 是一种在所有执行路径中断言条件或检查整个程序的不变条件的方法,但另一方面,assert() 用于减少静态分析器的负载。它在本地工作以开发一种分而治之的机制,以帮助分析器假设条件并检查代码。

  • 要求:

    这种方法具有处理问题的创新模式。如果某个条件不满足,它通常会责怪方法调用者。如果条件满足,程序继续执行,如果不满足,则抛出异常。 assert() 和假设() 的语法与之前的语法相同,后面是布尔条件作为参数。 require()函数的工作可以用一个例子来展示:
    以下示例显示了一种将任何奇数加倍的方法。如果函数传入的数字是奇数,则工作顺利,如果不是,则抛出异常。

    // Code to double the odd numbers
    def double_odd_numbers(number:Int) : Int = {
      
        require(number%2==1) // Checking if the number is odd using assume method
      
        number * 2;
      
    } 
    // Calling function
    double_odd_numbers(13)
    

    如果不满足条件,则抛出以下异常:

    Exception in thread "main" java.lang.IllegalArgumentException: requirement failed

    在 Predef.scala 中查找异常代码,我们遇到以下代码:

    def require(requirement: Boolean) { 
      if (!requirement) 
        throw new IllegalArgumentException("requirement failed") 
    } 
    
  • 确保:

    确保是不同于其他条件的后置条件。此方法通常与 require() 方法一起应用,以制作可运行的程序。考虑到上面的例子本身,我们可以通过添加一个要求输入数字小于某个限制的确保条件来修改代码。

    // Code to double the odd numbers
    def double_odd_numbers(number:Int, lmt:Int) : Int = {
      
        require(number%2==1) // Checking if the number is odd using assume method
      
        number * 2;
      
    } ensuring(number * 2 < lmt) // Ensuring that the number produced is less than the limit. 
      
    // Calling function
    // The method also requires a limit [parameter to be passed. 
    double_odd_numbers(13, 100)
    

    因此,assert() 方法要求检查器必须证明后面的条件作为参数,而另一方面,assert() 通过假设某个条件成立来帮助检查器减轻负担。而 require() 方法指定了函数调用者必须遵循的条件。

    如果程序员试图消除由assert() 和assert() 方法产生的异常,可以使用-Xdisable-assertions命令来做到这一点。