Javascript 检查参数的更好方法?
在各种情况下,我都会遇到这样的问题:我需要检查函数的参数,以确保程序流正确 我发现创建if-else块只是为了检查null指针、数字范围、正确的字符串、正确的对象等等,这变得有点单调乏味。此外,代码变得更难阅读,因此更难获得概述 所以我想如果java/javascript/c中有一种方法。。。带有函数的编程语言,其中可以定义一些前置条件 例如,在java中:Javascript 检查参数的更好方法?,javascript,java,c#,Javascript,Java,C#,在各种情况下,我都会遇到这样的问题:我需要检查函数的参数,以确保程序流正确 我发现创建if-else块只是为了检查null指针、数字范围、正确的字符串、正确的对象等等,这变得有点单调乏味。此外,代码变得更难阅读,因此更难获得概述 所以我想如果java/javascript/c中有一种方法。。。带有函数的编程语言,其中可以定义一些前置条件 例如,在java中: void doSomething( int a {0 <= a < 10}, String b {b != "wrong"
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一起工作
那么回到问题上来:有没有一种好的方法来定义前置条件、后置条件、方法不变量、类以及类似的东西,这些东西在各自的语言中都很容易阅读
另外,我不确定我在这里设置的标记是否正确,因为对于不同的语言来说,这是一个实际的问题,关于这些语言中的程序员可能面临的概念。很抱歉先回答Java问题。我们有: 通过对代码将要使用的数据结构使用注释,可以使用声明性方法 然后,在后台有一些框架,负责根据声明的预期验证实际数据 这里的基本思想是:绝对不需要手动验证数据结构。相反,您可以建立一个可应用于此类结构的表示法,然后使用一个通用框架将声明转换为运行时检查 JavaScript也有类似的想法,请参见库示例
当然,同样的东西也存在于C中。例如,参见SO问题。Java在JDK中没有参数验证功能。 然而,还有一种具有类似能力的方法。还有实现上述规范的第三方库和框架。流行的框架之一是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 + ")";
}
}
是一种相当标准的跨语言方法。断言的好处在于,在大多数环境中,您可以将它们包括在测试中,但在发布版本中关闭它们,因为您发现了它们所防御的bug。因此,断言当然不是处理用户输入的方式
Java和.Net平台都直接支持它们。JavaScript不直接支持断言,但它们很容易添加一个实用函数,或者您可以为它们编写一个Babel插件,将断言编译为空,用于发布版本
断言示例:
您可能需要查看和标签。Betrand Meyer是用埃菲尔编程语言介绍的。对不起,每个问题你应该问一个问题。用3种不同的语言标记则正好相反。请下定决心,只要求一种特定的语言。正是因为答案在很大程度上依赖于目标语言。@Josh-删除这些标记显然与作者的意图相冲突,我已回滚编辑。这个意图可能是不正确的,我有点惊讶没有找到一个语言中立的标记,我犹豫着创建一个,尤其是因为我认为曾经有一个,所以它可能已经被烧掉了,但我们不能将焦点缩小到代表他们的一种语言。如果我们能找到其他合适的标记,我们可以删除所有三个语言标记…@GhostCat我知道我有点懒得用不同的标记问同样的问题。因为我必须使用各种语言,所以我想对各种可能性进行概述。实际上,使用Spring,您可以对方法参数和返回值使用javax.validation约束,前提是所述方法位于一个用@org.springframework.validation.annotation.validated注释的类中,这正是我所寻找的。不过,唯一让我困扰的是,您仍然需要以与以前相同的方式编写代码,因为有可能关闭断言。因此,更多的是测试代码,而不是保证正确的流。但这对我来说是非常有用的。谢谢。@telion-我们的想法是,您不需要在运行时进行这些检查,因为您已经进行了彻底的测试,并且知道这些值将在范围内。您所需要做的只是在接收点验证用户输入,而不是每个方法的每个参数,因为您的测试告诉您没有 这些都错了-
void doSomething(int a, String b) {
assert a >= 0 && a < 10;
assert !b.equals("wrong") && /*...your second condition didn't make sense for strings */;
}