何时在客户端和通用GWT代码中使用断言

poh*_*ohl 8 java gwt assert design-by-contract

StackOverflow上有几个问题讨论了何时应该使用assert语句而不是抛出一些异常的问题.(这里,这里,这里,这里这里的例子.

但是,我开始怀疑assert-versus-throw的传统智慧是基于您在JVM中运行的假设.在GWT Universe中,您的Java被音译为JavaScript并在浏览器的上下文中运行,这一组权衡感觉不同:在浏览器中运行时,断言总是被编译掉,并且任何使JavaScript的大小变小的东西是一个胜利,特别是如果你的网络应用程序必须在手机上运行.断言确实可以在DevMode中运行,因此它们在开发过程中具有实用性.

所以我的问题是:有没有人考虑过一套最佳实践规则来管理如何在GWT中使用断言语句?我有我的团队成员问我"因为断言被编译出来,有它们是否有意义?",我想对他们有一个好的答案.

此外,是否有人对Google的GWT开发人员在此主题上的理念有所了解?查看GWT源代码,他们似乎经常使用它.

gat*_*kin 14

谷歌的常见问题解答

仅使用断言进行调试,而不是生产逻辑,因为断言只能在GWT的开发模式下工作.默认情况下,它们由GWT编译器编译掉,因此除非您明确启用它们,否则在生产模式下不会产生任何影响.

这与您链接的问题的答案没有任何不同.无论Java代码是通过javac以通常的方式编译还是由GWT编译为JavaScript,"断言"意味着"如果这不是真的我有一个错误." 相反,形式的代码

if (condition) throw new Exception(msg);
Run Code Online (Sandbox Code Playgroud)

意味着"如果这是真的,那么我们就会遇到程序必须处理的意外情况."

对于没有看到断言点的团队成员,解释说他们应该有一堆单元测试,这些测试在启用断言的情况下运行.如果测试具有良好的代码覆盖率并且没有一个导致断言失败,那么断言语句指示的假设被证明是成立的.