更好的检查参数的方法?

tel*_*ion 0 javascript c# java

在我遇到问题的各种情况下,我需要检查函数的参数以保证正确的程序流.

我发现创建if-else块只是为了检查nullpointer,数字范围,正确的字符串,正确的对象等等,这变得有点乏味.此外,代码变得更难以阅读,因此获得概述变得更加困难.

所以我想如果在java/javascript/c#...(带有函数的编程语言)中有一种方法可以定义一些前置条件.

所以例如在java中:

  void doSomething( int a {0 <= a < 10}, String b {b != "wrong" && b != [1-9]}){
   ...
  }
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

  §a: 0 <= a && 10 > a || a == 25 ...
  §b: ...
  §ifWrongPreConditions: return; //or throw a new default Exception or whatever
  void doSomething( int a, String b){
    §a: 0 <= a && 10 > a || a == 25 ...
    §b: ...
    §ifWrongPreConditions: return; //or throw a new default Exception or whatever
  ...Code...
  }
Run Code Online (Sandbox Code Playgroud)

或高于方法头.基本上第二个想法也可以帮助后期条件,你只需要看一下这个函数来知道你需要做什么,这样功能就可以正常工作了.

但是我不确定是否有类似已经实现过的东西,但是我希望能够更容易地对函数的"元信息"进行概述,以便预测所需的和不期望的行为并且可能更容易使其与OCL一起使用.

回到这个问题:是否有一种很好的方法来定义Pre-,Post-Conditions,也许是方法(可能是类和类似的东西)的不变量,这些方法在各自的语言中都很容易阅读?

(PS我不确定我在这里设置的标签是否"正确",因为对于不同语言来说这是一个关于可能会遇到那些语言的程序员的概念的实际问题.提前抱歉)

Sha*_*her 5

Java在JDK中没有参数验证功能.但是,Bean Validation的规范具有类似的功能.并且有第三方库和框架实现上述规范.其中一个流行的框架是Spring,它有一个基于注释的验证模块

以下是此类验证的示例:

package hello;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class PersonForm {

    @NotNull
    @Size(min=2, max=30)
    private String name;

    @NotNull
    @Min(18)
    private Integer age;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Person(Name: " + this.name + ", Age: " + this.age + ")";
    }
}
Run Code Online (Sandbox Code Playgroud)