我从来没有得到断言的想法 - 你为什么要使用它们?
我的意思是,让我说我是一个公式驱动程序,所有断言都是安全带,头盔等.
测试(在调试中)都没关系,但现在我们想做赛车(发布)!我们是否应该放弃所有安全性,因为测试时没有问题?
我永远不会删除它们.我认为大多数声称删除类似于断言的东西的人从不描述他们的代码或断言是绝对流离失所.我从未见过任何真正的性能优势,特别是关于80/20规则.
所以,我是否以某种方式忽略了这一点,或者任何人都可以告诉我,为什么我应该使用断言?顺便说一句,我正在使用单元测试.
jal*_*alf 51
首先,性能差异可能很大.在一个项目中,我们的断言确实造成了3倍的放缓.但他们帮我们发现了一些非常讨厌的错误.
这正是重点.
断言可以帮助您捕获错误.而且因为它们在发布版本中被删除,我们可以负担得起将其中很多内容放入其中而不用担心性能问题.如果你不是真的对任何失败的断言采取行动,它们就变得毫无价值,所以我们不妨删除它们.
即使捕获错误并抛出异常也不是真正的解决方案.程序逻辑存在缺陷,即使我们处理异常,程序仍然会被破坏.
什么断言基本归结为"为什么要抓住你无法处理的错误?"
在开发过程中必须捕获一些错误.如果他们没有通过测试并进入客户使用的发布版本,那么程序就会被破坏,并且没有任何运行时错误检查会修复它.
我从来没有得到断言的想法 - 你为什么要使用它们?
我的意思是,让我说我是一个公式驱动程序,所有断言都是安全带,头盔等.
是的,这是何时不使用断言的一个很好的例子.这些是在运行时可能实际出错的事情,需要检查.你的公式驱动程序可能会忘记一些安全预防措施,如果他这样做,我们希望在任何人受伤之前停止整个事情.
但检查发动机是否安装怎么办?我们需要在比赛期间检查一下吗?
当然不是.如果我们在没有引擎的情况下进入比赛,我们就会被搞砸,即使我们发现了错误,也不能对它做任何事情.
相反,这是一个必须在开发过程中捕获的错误,或者根本不会捕获.如果设计师忘记将发动机放入汽车,他们需要在开发过程中检测到这个错误.这是一个断言.它在开发过程中与开发人员相关,但之后,错误必定不存在,如果确实如此,我们无能为力.
这基本上就是差异.通过处理可以处理的错误,可以帮助用户.
断言就是为了帮你,通过提醒您必须永远摆在首位发生错误,必须修复产品之前,可以发货.错误不依赖于用户输入,而是依赖于代码执行应该执行的操作.
四方的平方根绝不能评估为三.这个错误根本不可能.如果它确实发生,你的程序逻辑就会被打破.无论我们对它进行多少错误处理都无关紧要,它必须在开发过程中被捕获或根本不被捕获.如果我们使用异常处理来检查这个错误并处理它,那么会有什么例外?告诉用户"程序从根本上被破坏了.不要使用它"?
来自开发人员的电子邮件可以实现这一点.为什么要把它构建到程序代码中呢?这是一个根本不可能发生的问题的例子.如果是这样,我们必须返回并修复该程序.没有其他形式的错误处理是可能的.
但是有些错误,比如无法打开文件进行阅读,都是可能的.即使它发生可能是一件坏事,但我们必须承认它可能发生.所以我们需要处理它.
断言是为了捕捉不可能发生的错误.
cdl*_*ary 36
Andrew Koenig曾经对运输代码中的异常和断言的使用进行了很好的哲学讨论.最后,当程序处于不可挽回的破坏状态时,你正在防止做狂野的事情.
因此,我相信,当程序发现其内部状态无可辩驳的错误时,最好立即终止,而不是让其调用者有机会假装没有错.
如果您愿意,我认为应该保留例外情况,以便在捕获异常后可以做一些合理的事情.当你发现一个你认为不可能的情况时,很难说后来会发生什么.
Nos*_*dna 18
从代码完成2:"对预期发生的条件使用错误处理;对不应发生的条件使用断言."
一个常用的例子是在分割之前检查分母中的零.
您应该将断言从生产代码中删除.他们在开发过程中会帮助您发现错误.
单元测试不是断言的替代品.
因为它们使调试更容易.
调试的耗时部分是从您首次注意到的症状到代码中的错误中追踪问题.写得好的断言会使您注意到的症状更接近实际的代码问题.
一个非常简单的例子是一个错误,你索引超过数组的末尾并导致内存损坏,最终导致崩溃.从崩溃追溯到违规索引操作可能需要很长时间.但是,如果您在检索索引的索引操作旁边有一个断言,那么您的程序将在错误旁边失败,因此您将能够快速找到问题.
这是一个有争议的话题。许多人,像我一样,实际上更喜欢在生产代码中保留它们。如果您的程序无论如何都将陷入困境,那么您最好在那里放置断言,这样您的客户至少可以给您行号和文件名(或您配置断言要执行的任何信息或操作)。如果您忽略了断言,那么客户只能向您报告“它崩溃了”。
这意味着您可能不应该在断言检查中执行昂贵的操作,或者至少不应该进行分析以查看它们是否会导致性能问题。