1

だからここに私のプロジェクトがあります:

複数の製品バージョンのいくつかのテスト タイプのテスト データを表示するための中央インターフェイス/ダッシュボードを構築しています。私たちは大規模な製品で TestNG を使用しており、十分なテストが作成されていませんが、それは別のトピックの議論です。ディレクトリ構造は次のようになります。

ファイルシステム/productVersion+testType/uniqueDateAndBuildID/testng-results.xml

その results.xml ファイルには、ファイルシステムディレクトリに対応する子テストタグを持つタグが含まれており、実際のテストケースの結果 (合格、不合格など) を含む xml ファイルに対応しています。

制御の流れ: クライアントはメイン ページにアクセスします --> サーバーはプロパティ ファイルを開きます --> サーバーは Web サーバー プロパティ (ローカルで作業している場合は Websphere または Tomcat) をチェックします --> サーバーはそれに基づいて一連の定数を設定します。定数には、ルート ファイルシステム ディレクトリ、ファイル システム セパレータ (翻訳)、「類似タイプ (異なるプラットフォームでも基本的に同じテスト)」、および追加するベース URL が含まれます。--> 次に、サーバーはプロパティ ファイルをさらに読み取り、すべての XML 処理を行います。結果は ObjectOutputStream を使用してファイルシステムだけでなくメモリにもキャッシュされます。--> 結果の大きなリストがクライアントに返され、UI の処理/表示が行われます。

ここで問題が発生します。共有フォルダーにあるにもかかわらず、これらのグローバル変数 (Globals クラスに含まれている/設定されている...悪いことは知っています:-/) にアクセスできません。なぜプロパティを再度ロードできないのか疑問に思っているなら、それはクライアントが File() を含まない GWT 化された Javascript だからです。したがって、私の次の考えは、上位レベルの Java の読み取りを少し行った後、おそらく Globals シングルトン オブジェクトを使用してそれを戻すことでした..しかし、それは不可能ではないにしても、同じくらい悪いようです。 ここでの提案は素晴らしいでしょう。

このすべてがかなり緊密に結合されており、以前の Java 教育ではまだ理解できていませんでした。これは開発者がチェックするための単なる内部ポータルであるため、実際にコードをテストする意味はないようです。正しく表示され、適切にログに記録され、エラーを適切に処理する限り、そうですか? 全体として、クラスは 15 未満なので、大したことではないと思います。リファクタリングしてすべてをクリーンアップして「より良いJava」にするか、すべてをコメントして制御の流れを明確に描写するか、それとも小さいのであまり心配しないでください。将来、物事を設計する前にもっと考えなければならないことはわかっていますが、Java を始めてから触れてきた高度な Java 原則の多くについては本当に知りませんでした。

少し考えた後、編集して、可能な回避策を思いつきました。結果のリストだけを返す代わりに、グローバルの「ヘッダー」オブジェクトを含む他のカスタム リストの実装を返してはどうですか? 状態を維持できました。

4

3 に答える 3

5

A simple solution would be the Dictionary class:

Provides dynamic string lookup of key/value string pairs defined in a module's host HTML page. Each unique instance of Dictionary is bound to a named JavaScript object that resides in the global namespace of the host page's window object. The bound JavaScript object is used directly as an associative array.

You just need to add some dynamic content to your host HTML page - make the server print the values read from the properties file in the form of a JavaScript object:

var GlobalProperties = {
  property1: "value1",
  property2: "value2"
};

Then, use Dictionary in your code to read those values:

Dictionary globalProperties = Dictionary.getDictionary("GlobalProperties");
String property1 = globalProperties.get("property1");

PS: If you are looking for good ideas/advices on how to make your code less coupled -> more testable, I'd recommend Misko Hevery's blog. He's got many interesting posts, like why singletons are usually bad (global state, not the pattern itself). But most importantly - it has the awesome guide to writing testable code (some guidelines used internally in Google).

于 2010-08-25T23:58:12.097 に答える
1

GWT-RPC呼び出しと考えられるHashMapを備えた単純なオブジェクトを使用してこれらのグローバル変数を渡すか、最初に取得した結果にこのHashmapを含めることができます(「結果の大きなリスト[それ]はに返送されますUI処理/表示を行うクライアント。」)

于 2010-08-24T22:25:01.270 に答える
1

コンパイルされた JavaScript からサーバー側のシングルトンにアクセスすることはできません。

基本的に 2 つのオプションがあります。クライアント コードでグローバル変数を表すクラスを作成するSerializableか、グローバル変数オブジェクトを渡すことができますが、これはかなり非効率的なソリューションです。

最も簡単な方法はHashMap<String, String>、シリアル化可能なオブジェクトで a を使用することです。これは RPC 呼び出しで取得できます。

public class GwtGlobalVariables implements Serializable {
    private HashMap<String, String> map = new HashMap<String, String>();

    public void put(// a  delegate put method of choice

    public void setMap() // a getter / setter for the map if you need it
}

クラスが GWT モジュールのソース フォルダー内にあることを確認します。つまり、エントリ ポイントと同じ場所にある可能性があります。

マップに必要な値を入力し、rpc を介して渡すと、クライアント側のコードに含まれます。

于 2010-08-25T14:56:34.523 に答える