猿问

检查参数的更好方法?

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


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


所以我想如果在 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 配合使用。


所以回到问题:有没有一种好方法来定义在相应语言中易于阅读的前置条件、后置条件,也许是方法的不变量(可能是类和类似的东西)?


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


绝地无双
浏览 175回答 3
3回答

弑天下

断言是一种相当标准的跨语言方法。断言的好处在于,在大多数环境中,您可以将它们包含在测试中,但在发布版本时关闭它们,基于您发现了它们所防御的错误的理论。出于这个原因,断言当然不是处理用户输入的方式。Java 直接支持它们 ( assert),就像 .Net 平台 ( Debug.Assert) 一样。JavaScript 不直接支持断言,但它们很容易添加一个实用程序函数,或者您可以为它们编写一个 Babel 插件,将断言编译为发布版本的任何内容。assert 例子:void doSomething(int a, String b) {&nbsp; &nbsp; assert a >= 0 && a < 10;&nbsp; &nbsp; assert !b.equals("wrong") && /*...your second condition didn't make sense for strings */;}

繁星coding

首先回答Java。我们有bean 验证:您使用声明性方法,通过在您的代码将使用的“数据结构”上使用注释然后你有一些“在后台”的框架,负责根据声明的期望验证实际数据这里的基本思想:您绝对不会“手动”验证数据结构。相反,您建立一个可以应用于此类结构的符号,然后您拥有一个通用框架来将声明转换为运行时检查。JavaScript 也有类似的想法,例如请参见validatejs库。当然,同样的东西也存在于 C# 中。例如,请参阅此SO 问题。
随时随地看视频慕课网APP
我要回答