Bla*_*ppo 25 java language-features assert design-by-contract
在探讨问题时,我最近assert在Java中发现了关键字.起初,我很兴奋.我还不知道有用的东西!一种更有效的方法来检查输入参数的有效性!耶老师!
但后来我仔细研究了一下,我的热情并没有像一个简单的事实那样"完全被扼杀"而"温和":你可以关闭断言.*
这听起来像是一场噩梦.如果我断言我不希望代码继续输入,如果输入listOfStuff是null,为什么我想要忽略该断言?听起来好像我正在调试一段生产代码,并怀疑listOfStuff可能错误地传递了一个,null但没有看到任何触发该断言的日志文件证据,我不相信listOfStuff实际上已经发送了一个有效值; 我还必须考虑断言可能完全被关闭的可能性.
这假设我是调试代码的人.不熟悉断言的人可能会看到并且(非常合理地)假设如果断言消息没有出现在日志中,则不会出现listOfStuff问题.如果你的第一次遭遇assert是在野外,你甚至会发现它可以完全关闭吗?毕竟,它不像是一个允许你禁用try/catch块的命令行选项.
所有这些都让我想到了我的问题(这是一个问题,而不是一个咆哮的借口!我保证!):
我错过了什么?
是否有一些细微差别使得Java的实现assert比我给它的功劳更有用?在某些情况下,从命令行启用/禁用它的能力实际上是非常有价值的吗?当我设想在生产代码中使用它代替语句时,我是否误解了它if (listOfStuff == null) barf();?
我觉得这里有一些重要的东西,我没有得到.
*好的,从技术上讲,它们实际上是默认关闭的; 你必须不遗余力地打开它们.但是,你仍然可以完全击败他们.
这assert首先是一个调试工具的概念需要很长的路要走,才能使它对我有意义.
我仍然认为应该在生产环境中禁用输入检查非平凡私有方法的概念,因为开发人员认为不可能输入错误.根据我的经验,成熟的生产代码是一种疯狂的,庞大的东西,多年来由具有不同技能的人们开发,其目标是快速变化的不同程度的理智要求.即使糟糕的输入确实是不可能的,从现在起六个月后的一段邋maintenance维护编码也可以改变这一点. 提供的链接gustafc(谢谢!)包括这个例子:
assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;
禁用如此简单的生产检查让我感到愚蠢乐观.然而,这是编码哲学的差异,而不是破碎的特征.
另外,我绝对可以看到这样的价值:
assert reallyExpensiveSanityCheck(someObject) : someObject;
感谢所有花时间帮助我理解这个功能的人; 这是非常赞赏.
Dan*_*nas 23
assert是契约式设计的有用部分.在这种情况下,断言可用于:
判断断言的代价可能很高(例如,在调用类的任何公共方法之前和之后必须保持类不变量).断言通常仅在调试版本中用于测试目的; 你断言那些不可能发生的事情 - 这些事情都是犯错的同义词.断言根据自己的语义验证您的代码.
断言不是输入验证机制.如果输入在生产环境中确实是正确的或错误的,即对于输入输出层,则使用其他方法,例如异常或良好的旧条件检查.
gus*_*afc 19
Java的断言并不是真正用于参数验证 - 它特别声明断言不是用来代替亲爱的IllegalArgumentException(也不是它们在C-ish语言中的使用方式).它们更适用于内部验证,让您对代码进行假设,而这些代码在查看时并不明显.
至于将其关闭,你这样做,在C(++),也是如此,只是,如果有人的有一个断言少建,他们也没有办法打开它.在Java中,您只需使用适当的VM参数重新启动应用程序.
我见过的每种带有断言的语言都具有关闭断言的功能。当你写一个断言时,你应该想“这很愚蠢,这在宇宙中不可能是假的”——如果你认为它可能是假的,那么它应该是一个错误检查。该断言只是为了在开发过程中出现严重错误时为您提供帮助;当您构建生产代码时,您可以禁用它们以节省时间并避免(希望)多余的检查
断言旨在确保您确定代码所实现的事情确实得到实现。它有助于产品开发阶段的调试,并且通常在代码发布时被省略。
我缺少什么?
您没有按照应有的方式使用断言。你说“检查输入参数的有效性” - 这正是你不想用断言验证的事情。
这个想法是,如果断言失败,则代码中 100% 有错误。断言通常用于比其他方式出现之前更早地识别错误。
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |