在各种情况下,我都会遇到问题,我需要检查函数的参数以确保正确的程序流。
我发现创建if-else块只是为了检查nullpointer,数字范围,正确的字符串,正确的对象等变得有点乏味。此外,代码变得更加难以阅读,因此拥有概述也变得更加困难。
所以,我想如果java / javascript / c#...(其中包含函数的编程语言)中有一种方法可以定义一些前提条件,那该怎么办?
例如在Java中:
void doSomething( int a {0 <= a < 10}, String b {b != "wrong" && b != [1-9]}){
...
}
或类似的内容:
§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...
}
或方法标题上方。 基本上,第二个想法也可以为后置条件提供帮助,您只需要看一下该函数就可以知道自己需要做什么,以便该函数正常工作。
但是我不确定是否已经实施了类似的东西, 但是我想使它更容易成为功能的“元信息”的概述,以便可以预期所需的和不希望的行为,并且使其与OCL一起使用可能会更容易。
回到问题所在:有没有一种好的方法来定义前置条件,后置条件,也许可以定义易于使用相应语言阅读的方法(可能是类和类似内容)的不变量?
(P.S。林先生不确定我在此处设置的标签是否“正确”,因为对于不同的语言来说,这是一个可能会遇到使用这些语言的程序员所面临的概念的实际问题。对此表示抱歉)
答案 0 :(得分:5)
Java在JDK中没有参数验证功能。 但是,specification for Bean Validation具有相似的功能。并且有实现上述规范的第三方库和框架。 Spring是最受欢迎的框架之一,它具有用于基于注释的Validation
的模块以下是进行此类验证的示例:
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 + ")";
}
}
答案 1 :(得分:1)
首先为Java进行答疑。那里有bean validation:
这里的基本思想:您绝对不“手动”验证数据结构。取而代之的是,您建立一个可以应用于此类结构的符号,然后您有了一个通用框架,可以将声明转换为运行时检查。
JavaScript有类似的想法,例如,请参见validatejs库。
当然,C#中也存在相同的东西。例如,请参见this SO问题。
答案 2 :(得分:1)
Assertions是一种相当标准的跨语言方法。关于断言的好处是,在大多数环境中,您可以包括它们以进行测试,但是要根据已发现它们可以防御的错误的理论将其关闭以进行发布。因此,断言当然不是处理用户输入的方式。
Java和.Net平台(assert
)一样直接支持它们(Debug.Assert
)。 JavaScript没有对断言的直接支持,但是很容易为它们添加了实用程序功能,或者您可以为它们编写Babel插件,以将断言编译为零以用于发行版本。
assert
示例:
void doSomething(int a, String b) {
assert a >= 0 && a < 10;
assert !b.equals("wrong") && /*...your second condition didn't make sense for strings */;
}