Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查参数的更好方法?_Javascript_Java_C# - Fatal编程技术网

Javascript 检查参数的更好方法?

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"

在各种情况下,我都会遇到这样的问题:我需要检查函数的参数,以确保程序流正确

我发现创建if-else块只是为了检查null指针、数字范围、正确的字符串、正确的对象等等,这变得有点单调乏味。此外,代码变得更难阅读,因此更难获得概述

所以我想如果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一起工作

那么回到问题上来:有没有一种好的方法来定义前置条件、后置条件、方法不变量、类以及类似的东西,这些东西在各自的语言中都很容易阅读


另外,我不确定我在这里设置的标记是否正确,因为对于不同的语言来说,这是一个实际的问题,关于这些语言中的程序员可能面临的概念。很抱歉先回答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 */;
}