【问题标题】:When to use assert in client & common GWT code何时在客户端和通用 GWT 代码中使用断言
【发布时间】:2011-05-16 20:54:52
【问题描述】:

StackOverflow 上有几个问题讨论了何时应该使用断言语句而不是抛出一些异常。 (例如hereherehereherehere

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

所以我的问题是:有没有人考虑过一组最佳实践规则来管理如何在 GWT 中使用 assert 语句?我的团队成员问我“既然断言被编译出来,拥有它们是否有意义?”,我想为他们提供一个好的答案。

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

【问题讨论】:

    标签: java gwt assert design-by-contract


    【解决方案1】:

    Google 的 FAQ

    仅将断言用于调试目的,而不是生产逻辑,因为断言只能在 GWT 的开发模式下工作。默认情况下,它们会被 GWT 编译器编译掉,因此在生产模式下没有任何影响,除非您明确启用它们。

    这与您链接到的问题的答案没有任何不同。 Java 代码是由 javac 以通常的方式编译还是由 GWT 编译为 JavaScript, “assert”的意思是“如果这不是真的我有一个错误”。相比之下,表单的代码

    if (condition) throw new Exception(msg);
    

    的意思是“如果这是真的,那么我们将遇到程序必须处理的意外情况。”

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

    【讨论】:

    • “常见问题解答”的链接实际上链接到这个问题。你有真正的参考吗?
    • 修复了链接。感谢您的反馈。
    【解决方案2】:

    默认情况下,GWT 编译器会删除它们,但您可以根据需要保留它们。如果您认为断言在编译代码中很有用,请在调用 com.google.gwt.dev.Compiler 时添加 -ea 命令行参数。然后编译器会将 Java 断言转换为 JavaScript。

    Google Web Toolkit 2.3.0
        Compiler [-logLevel level] [-workDir dir] [-gen dir] [-style style] [-ea] [-XdisableClassMetadata] [-XdisableCastChecking] [-validateOnly] [-draftCompile] [-optimize level] [-compileReport] [-strict] [-localWorkers count] [-war dir] [-deploy dir] [-extra dir] module[s] 
    
         ...
          -ea Debugging: causes the compiled output to check assert statements
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多