问题标签 [argument-validation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#:在扩展方法中验证“this”参数的最佳实践
假设我有一个扩展方法
为了验证论点 e,我应该:
A) if (e == null) throw new NullReferenceException()
B) if (e == null) throw new ArgumentNullException("e")
C) 不检查 e
共识是什么?
我的第一个想法是始终验证参数,因此抛出了 ArgumentNullException。话说回来,既然 TakeRandom() 变成了 e 的一个方法,或许它应该是一个 NullReferenceException。但是如果它是 NullReferenceException,如果我尝试在 TakeRandom() 中使用 e 的成员,无论如何都会抛出 NullReferenceException。
也许我应该使用 Reflector 并找出框架的作用。
c# - C#:参数验证:空/空字符串
我不知道有多少次我不得不编写代码来验证字符串参数:
有没有办法避免这种情况?是否有一些属性或按合同设计的机制来避免这种情况?有没有办法说:
无需实际创建该类型?
c# - 如果一个参数为空,最佳实践是什么?
在验证方法的输入时,我曾经检查参数是否为空,如果是,我会抛出 ArgumentNullException。我对列表中的每个参数都执行此操作,因此最终得到如下代码:
这个可以吗?我为什么要这样做?如果我只是将所有检查分组并返回一个空值而不是抛出异常,可以吗?解决这种情况的最佳做法是什么?
PS:我想改变这一点,因为方法很长,这样做很乏味。
想法?
c# - 如何避免参数验证
验证原始参数和“复杂数据”
验证参数
编写方法时,应先验证参数,然后再执行任何操作。例如,假设我们有一个代表人的类:
这个 Person 类有什么问题?name 和 age 在它们的值被设置为 Person 的字段之前不会被验证。“已验证”是什么意思?应检查这两个参数是否可以接受它们的值。例如,如果 name 的值为空字符串怎么办?或者年龄的值为-10?
当值不可接受时,通过抛出 ArgumentExceptions 或派生异常来验证参数。例如:
这正确地验证了 Person 的构造函数接收的参数。
乏味的恶心
因为您已经验证参数很长时间了(对吗?),您可能已经厌倦了在所有方法中编写这些 if (....) throw Argument... 语句。
我们可以做些什么来避免在整个代码中多次编写 String.IsNullOrEmpty?
java - 参数检查库 - 隐式/显式空值检查的参数
我目前正在为 Java 编写一个小型参数检查库。检查以流畅的界面方式编写,如下所示:
到目前为止,这些检查的语义是它们还隐式断言参数不为空。要允许 null,可以使用isNullOr()
第二个示例中的修饰符方法。
我要添加的下一件事是支持这样的检查反转:
但是现在我觉得默认的 nullness 处理变得奇怪和不直观。反转测试的正确方法是现在允许 null 。要禁止 null,必须isNotNull()
明确地预先检查:
因此,我正在考虑更改语义,以便始终需要显式检查空值。我知道一个也这样做的项目:Bean Validation。但不利的一面是,这可能会使大约 90% 的检查长 12 个字符,因为 null 通常是无效的参数。
所以,长话短说:支持和反对隐式空值检查的论据是什么?也许有任何其他库或标准可以这样做或以其他方式做到这一点?
java - 如何根据java构造函数中的参数进行响应
我有一个 MVC 类型的架构,用于向我的应用程序注册新用户。用户将注册表单提交给控制器 servlet。此 servlet 提取用户参数并将它们传递给类构造函数,该构造函数表示(并返回)一个模板(或虚拟)用户,其中所有字段都基于参数初始化。
我记得人们在使用它们之前坚持在方法或构造函数中进行参数验证。现在我尝试检查参数的有效性(例如它们不为空)。因此,当我发现任何具有无效值的参数时,如何通知 servlet 该特定参数无效,因为我无法从构造函数返回值。
请帮我。
.net - Contract.Requires 和装饰器模式。如何避免过度检查条件?
我目前有一个命令处理接口,由几个不同的类针对不同的命令类型实现。我将装饰器模式与 IoC 容器(在我的情况下为 Unity)结合使用,为这些处理程序添加横切关注点,因此我创建了一些类,例如:
- ValidatorCommandHandlerDecorator
- LoggingCommandHandlerDecorator
- AsyncCommandHandlerDecorator
这一切都按预期工作,实际上非常好。这里的潜在问题是每个装饰器实现都会检查接口的代码协定。我想通过只验证一次合同(最好在最外面的装饰器上)来潜在地避免这种情况。
是否有开箱即用的东西来实现这一目标?如果没有,您有什么建议来克服这个问题?
通用接口和合约类是这样的:
ValidatorCommandHandler(作为我如何实现它们的一个例子)看起来像这样:
即使我创建了另一个仅用于装饰器的接口,它也必须继承原始接口并且仍然会检查合同,所以我不知道该怎么做。
这是 .NET 4.0 / VS2012,如果有帮助的话,我正在使用最新版本的代码合同。
python - argparse 中的参数依赖
我有测试场景,我需要根据传递给 python 脚本的参数采取行动。要求如下:
test.py -a a1 -b b1 [[[-c c1] [-d d1]] | [-e e1 -f f1]]
- 用户必须传递强制参数“-a”和“-b”。
- 参数“-c”和“-d”是可以单独传递的可选参数。
- 参数“-e”和“-f”是可选参数,必须与强制参数一起传递。
- 如果“-c”或“-d”中的任何一个与“-e”和“-f”一起传递,那么脚本应该为参数“-c”或“-d”给出错误。
- 如果“-e”和“-f”与“-c”或“-d”一起传递,那么脚本应该为参数“-e”和“-d”给出错误。
该错误可能是所有可选参数的一般错误。
到目前为止,我正在尝试使用parents=
选项来执行此操作,argparse.ArgumentParser
但是当我尝试读取传递的参数时它会出错。
当我将脚本运行为:
我收到错误:
任何指针都受到高度赞赏。谢谢你。
答: 解决方案是 hack,但它对我有用。
IMO,argparser 应该更有效地处理参数依赖。也许有人会贡献并帮助我们所有人.. :)
matlab - 交叉参数函数参数验证是否不适用于(重复)参数?
概括
当使用依赖于参数块中的多个参数的函数参数验证(Repeating)
时,当前参数通常传递给验证函数,而其他参数作为部分填充的元胞数组传递。这与非(Repeating)
参数块中的工作方式不同。这是预期的行为还是错误?
设想
考虑下面的函数dummy1
,它使用自定义参数验证函数
mustBeEqualSize
来确保参数x
和y
具有相同的大小。由于 的验证y
取决于 的值x
,因此我将其称为“交叉参数”验证*。
*如果有更好的术语,请评论或编辑。
正如所写,这种形式的参数验证按预期工作:
在这两种情况下,mustBeEqualSize
在参数验证期间调用when 时,y
两者都作为 1xN 双数组接收,这符合我的期望:a
b
当被修改为通过添加到参数块dummy1
来接受重复参数时,就会出现问题:(Repeating)
现在,当我们调用 时dummy2(1:3, 4:6)
,参数验证失败。使用调试器,我发现 whenmustBeEqualSize
在验证期间被调用y
,a
作为 1x1 单元格数组接收,而b
仍然是 1x3 双精度数组:
当使用更多重复参数时,这个问题更加明显:
结果是
似乎在 in 的验证过程y
中dummy2
,y
接受了当前正在验证的参数的值,而x
MATLAB 分配了一个(部分填充的)单元数组缓冲区来保存所有x
传递的 - 参数。
这当然会破坏交叉参数验证,因为只有当前正在验证的参数实际上将自身呈现为单个参数,而其他参数将它们呈现为单元数组缓冲区。
问题
交叉参数验证(Repeating)
与非参数的工作方式之间的不匹配是一个错误,还是MATLAB 不支持(Repeating)
带有参数的交叉参数验证?(Repeating)
如果这种行为差异是意料之中的,有没有办法让交叉参数验证与(Repeating)
参数一起工作?
MATLAB 文档对使用重复参数的参数验证进行了以下说明
在函数中,每个重复参数变成一个元胞数组,其元素数等于函数调用中传递的重复次数。验证应用于元胞数组的每个元素。
这似乎没有说明交叉参数验证应该如何与重复参数一起工作。
使用 MATLAB R2021a (9.10.0.1602886) 进行测试。