8

StackOverflowには、assertステートメントを使用する必要がある場合と例外をスローする場合の問題について説明するいくつかの質問があります。(ここここここ、ここここここの例。

ただし、assert-vs-throwの従来の知識は、JVM内で実行しているという仮定に基づいているのではないかと思うようになりました。JavaがJavaScriptに変換され、ブラウザーのコンテキストで実行されるGWTユニバースでは、一連のトレードオフの感じが異なります。ブラウザーで実行する場合、アサートは常にコンパイルされ、JavaScriptのサイズを小さく保つものはすべてコンパイルされます。特にWebアプリケーションを携帯電話で実行する必要がある場合は、これがメリットです。ただし、アサートはDevModeで実行されるため、開発中にユーティリティが使用されます。

だから私の質問は次のとおりです:GWTでassertステートメントを使用する方法を管理する一連のベストプラクティスルールについて誰かが考えたことはありますか?チームのメンバーに「アサーションがコンパイルされたので、それを持っているのは理にかなっていますか?」と聞かれましたが、良い答えが欲しいです。

また、GoogleのGWTの開発者がこのテーマに関して持っている哲学について誰かが洞察を持っていますか?GWTソースコードを見ると、彼らはそれを頻繁に使用しているように見えます。

4

2 に答える 2

14

グーグルのFAQは言う

アサーションはGWTの開発モードでのみ機能するため、本番ロジックではなく、デバッグ目的でのみアサーションを使用してください。デフォルトでは、これらはGWTコンパイラーによってコンパイルされるため、明示的に有効にしない限り、実稼働モードでは効果がありません。

これは、リンクした質問に対する回答と何ら変わりはありません。Javaコードがjavacによって通常の方法でコンパイルされているか、GWTによってJavaScriptにコンパイルされているかにかかわらず、「アサート」は「これが当てはまらない場合はバグがある」ことを意味します。対照的に、フォームのコード

if (condition) throw new Exception(msg);

「これが本当なら、プログラムが処理しなければならない予期しない状況が発生する」という意味です。

アサーションのポイントがわからないチームのメンバーについては、アサーションを有効にして実行される一連の単体テストがあるはずであることを説明します。テストのコードカバレッジが良好で、いずれもアサーションが失敗しない場合は、assertステートメントで示された仮定が成り立つことが示されます。

于 2011-05-17T09:25:27.123 に答える
4

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
于 2011-05-22T00:32:27.207 に答える