问题标签 [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.

0 投票
3 回答
3385 浏览

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 并找出框架的作用。

0 投票
3 回答
9177 浏览

c# - C#:参数验证:空/空字符串

我不知道有多少次我不得不编写代码来验证字符串参数:

有没有办法避免这种情况?是否有一些属性或按合同设计的机制来避免这种情况?有没有办法说:

无需实际创建该类型?

0 投票
8 回答
6799 浏览

c# - 如果一个参数为空,最佳实践是什么?

在验证方法的输入时,我曾经检查参数是否为空,如果是,我会抛出 ArgumentNullException。我对列表中的每个参数都执行此操作,因此最终得到如下代码:

这个可以吗?我为什么要这样做?如果我只是将所有检查分组并返回一个空值而不是抛出异常,可以吗?解决这种情况的最佳做法是什么?

PS:我想改变这一点,因为方法很长,这样做很乏味。
想法?

0 投票
5 回答
465 浏览

c# - 如何避免参数验证

验证原始参数和“复杂数据”

验证参数

编写方法时,应先验证参数,然后再执行任何操作。例如,假设我们有一个代表人的类:

这个 Person 类有什么问题?name 和 age 在它们的值被设置为 Person 的字段之前不会被验证。“已验证”是什么意思?应检查这两个参数是否可以接受它们的值。例如,如果 name 的值为空字符串怎么办?或者年龄的值为-10?

当值不可接受时,通过抛出 ArgumentExceptions 或派生异常来验证参数。例如:

这正确地验证了 Person 的构造函数接收的参数。

乏味的恶心

因为您已经验证参数很长时间了(对吗?),您可能已经厌倦了在所有方法中编写这些 if (....) throw Argument... 语句。

我们可以做些什么来避免在整个代码中多次编写 String.IsNullOrEmpty?

0 投票
2 回答
824 浏览

java - 参数检查库 - 隐式/显式空值检查的参数

我目前正在为 Java 编写一个小型参数检查库。检查以流畅的界面方式编写,如下所示:

到目前为止,这些检查的语义是它们还隐式断言参数不为空。要允许 null,可以使用isNullOr()第二个示例中的修饰符方法。

我要添加的下一件事是支持这样的检查反转:

但是现在我觉得默认的 nullness 处理变得奇怪和不直观。反转测试的正确方法是现在允许 null 。要禁止 null,必须isNotNull()明确地预先检查:

因此,我正在考虑更改语义,以便始终需要显式检查空值。我知道一个也这样做的项目:Bean Validation。但不利的一面是,这可能会使大约 90% 的检查长 12 个字符,因为 null 通常是无效的参数。

所以,长话短说:支持和反对隐式空值检查的论据是什么?也许有任何其他库或标准可以这样做或以其他方式做到这一点?

0 投票
3 回答
85 浏览

java - 如何根据java构造函数中的参数进行响应

我有一个 MVC 类型的架构,用于向我的应用程序注册新用户。用户将注册表单提交给控制器 servlet。此 servlet 提取用户参数并将它们传递给类构造函数,该构造函数表示(并返回)一个模板(或虚拟)用户,其中所有字段都基于参数初始化。

我记得人们在使用它们之前坚持在方法或构造函数中进行参数验证。现在我尝试检查参数的有效性(例如它们不为空)。因此,当我发现任何具有无效值的参数时,如何通知 servlet 该特定参数无效,因为我无法从构造函数返回值。

请帮我。

0 投票
3 回答
191 浏览

.net - Contract.Requires 和装饰器模式。如何避免过度检查条件?

我目前有一个命令处理接口,由几个不同的类针对不同的命令类型实现。我将装饰器模式与 IoC 容器(在我的情况下为 Unity)结合使用,为这些处理程序添加横切关注点,因此我创建了一些类,例如:

  • ValidatorCommandHandlerDecorator
  • LoggingCommandHandlerDecorator
  • AsyncCommandHandlerDecorator

这一切都按预期工作,实际上非常好。这里的潜在问题是每个装饰器实现都会检查接口的代码协定。我想通过只验证一次合同(最好在最外面的装饰器上)来潜在地避免这种情况。

是否有开箱即用的东西来实现这一目标?如果没有,您有什么建议来克服这个问题?

通用接口和合约类是这样的:

ValidatorCommandHandler(作为我如何实现它们的一个例子)看起来像这样:

即使我创建了另一个仅用于装饰器的接口,它也必须继承原始接口并且仍然会检查合同,所以我不知道该怎么做。

这是 .NET 4.0 / VS2012,如果有帮助的话,我正在使用最新版本的代码合同。

0 投票
1 回答
359 浏览

python - argparse 中的参数依赖

我有测试场景,我需要根据传递给 python 脚本的参数采取行动。要求如下:

test.py -a a1 -b b1 [[[-c c1] [-d d1]] | [-e e1 -f f1]]

  1. 用户必须传递强制参数“-a”和“-b”。
  2. 参数“-c”和“-d”是可以单独传递的可选参数。
  3. 参数“-e”和“-f”是可选参数,必须与强制参数一起传递。
  4. 如果“-c”或“-d”中的任何一个与“-e”和“-f”一起传递,那么脚本应该为参数“-c”或“-d”给出错误。
  5. 如果“-e”和“-f”与“-c”或“-d”一起传递,那么脚本应该为参数“-e”和“-d”给出错误。

该错误可能是所有可选参数的一般错误。

到目前为止,我正在尝试使用parents=选项来执行此操作,argparse.ArgumentParser但是当我尝试读取传递的参数时它会出错。

当我将脚本运行为:

我收到错误:

任何指针都受到高度赞赏。谢谢你。

答: 解决方案是 hack,但它对我有用。

IMO,argparser 应该更有效地处理参数依赖。也许有人会贡献并帮助我们所有人.. :)

0 投票
1 回答
88 浏览

matlab - 交叉参数函数参数验证是否不适用于(重复)参数?

概括

当使用依赖于参数块中的多个参数的函数参数验证(Repeating)时,当前参数通常传递给验证函数,而其他参数作为部分填充的元胞数组传递。这与非(Repeating)参数块中的工作方式不同。这是预期的行为还是错误?

设想

考虑下面的函数dummy1,它使用自定义参数验证函数 mustBeEqualSize来确保参数xy具有相同的大小。由于 的验证y取决于 的值x,因此我将其称为“交叉参数”验证*

*如果有更好的术语,请评论或编辑。

正如所写,这种形式的参数验证按预期工作:

在这两种情况下,mustBeEqualSize在参数验证期间调用when 时,y两者都作为 1xN 双数组接收,这符合我的期望:ab

当被修改为通过添加到参数块dummy1来接受重复参数时,就会出现问题:(Repeating)

现在,当我们调用 时dummy2(1:3, 4:6),参数验证失败。使用调试器,我发现 whenmustBeEqualSize在验证期间被调用ya作为 1x1 单元格数组接收,而b仍然是 1x3 双精度数组:

当使用更多重复参数时,这个问题更加明显:

结果是

似乎在 in 的验证过程ydummy2y接受了当前正在验证的参数的值,而xMATLAB 分配了一个(部分填充的)单元数组缓冲区来保存所有x传递的 - 参数。

这当然会破坏交叉参数验证,因为只有当前正在验证的参数实际上将自身呈现为单个参数,而其他参数将它们呈现为单元数组缓冲区。

问题

交叉参数验证(Repeating)与非参数的工作方式之间的不匹配是一个错误,还是MATLAB 不支持(Repeating)带有参数的交叉参数验证?(Repeating)如果这种行为差异是意料之中的,有没有办法让交叉参数验证与(Repeating)参数一起工作?

MATLAB 文档对使用重复参数的参数验证进行了以下说明

在函数中,每个重复参数变成一个元胞数组,其元素数等于函数调用中传递的重复次数。验证应用于元胞数组的每个元素。

这似乎没有说明交叉参数验证应该如何与重复参数一起工作。

使用 MATLAB R2021a (9.10.0.1602886) 进行测试。