4

この問題のために、javascript でインターフェイスと DTO をシミュレートしようとしています。オブジェクト dto、オブジェクト呼び出し元、および同じインターフェイス IWorker の異なる実装。

呼び出し元は、インスタンス化のために dto を受け取り、ユーザー入力をフィードしてから、Iworker の正しい実装を呼び出します (メソッドの実行)。

私のコードでは、dto のインスタンスを 1 つと caller のインスタンスを 1 つだけ持つようにしたいので、ユーザーが別の選択をするたびに caller.CallWorker() を呼び出すだけです。

アイデアが良いかどうか教えてください。javascriptでの実装は大歓迎です

どうもありがとう

編集: 助けてくれてありがとう、Bergi ソリューションを使用しますが、もう 1 つ必要な ので、実装は次のようになります。

var caller = {
    callWorker: function(obj) {
        if(obj.id == 1)  Worker1.execute();
        if(obj.id == 2)  Worker2.execute();
        if(obj.id == 2)  Worker3.execute();
    }
};

しかし、これは、html ページにすべてのワーカー定義 (実装ごとに 1 つの js スクリプト) を追加する必要があることを意味します。スクリプトを動的に追加したいだけです。実際、アクティブなワーカーは多くのビジネス ロジックに依存しているため、それらを動的に含めてページにアクティブなワーカーのみを表示します。どうすればいいですか?caller.callworker のすべての条件を実行しますか? または、よりエレガントなアプローチがあります。

4

4 に答える 4

6

私はインターフェイスをシミュレートしようとしています

動的型付け言語 JavaScript には「インターフェース」がなく、クラスもありません。最も近いシミュレーションは、特定のオブジェクトに特定のメソッド セットがあるかどうかをチェックする関数です。ただし、型や機能のテストを行うことはできません。

とDTO

DTO に最も近いのは、JSON シリアル化可能なオブジェクトです。つまり、サイクルがなく、Dateオブジェクトもホスト オブジェクトも含まれていません。

私のコードでは、dto のインスタンスを 1 つと caller のインスタンスを 1 つだけ持つようにしたいので、ユーザーが別の選択をするたびに caller.CallWorker() を呼び出すだけです。

これは別の設計パターンです: シングルトン。オブジェクトはオンザフライで作成でき、複数のインスタンス化を防ぐ必要があるクラスやコンストラクターを必要としないため、JS で簡単にコーディングできます。それらにはオブジェクトリテラルを使用してください。

JavaScriptでの実装は大歓迎です

これは単純な例ですが、必要に応じて拡張できます。

function makeDTO(id) {
    // creates a basic data structure, with empty or default values or from parameters
    return {
        id: id,
        userInput: [],
        validate: false,
        …
    };
}
var caller = {
    callWorker: function(obj) {
        // do something
    }
};

var dto = makeDTO(14);
caller.callWorker(dto);
var asString = JSON.stringify(dto);

または、よりエレガントなアプローチがあります。

ワーカーを配列またはオブジェクトにします。例えば

var workers = {
    1: {/* std worker #1 */},
    …
};
// then the caller will look like this:
var caller = {
    callWorker: function(obj) {
        var workerName = obj.id; // just the id? Or something more complex
        if (workerName in workers)
            workers[workerName].execute(obj);
        else
            dynamicallyLoadWorker(workerName, function callbackWhenLoaded(worker) {
                workers[workerName] = worker;
                worker.execute(obj);
            });
    }
};
于 2013-02-08T22:13:05.000 に答える
2

interfaceJavaScript は動的に型付けされるため、構文は必要ありません。インターフェイスから継承せずに、実装ごとにメソッドを呼び出すことができます。DTOに関しては、同じ答えが実際に当てはまります。JSON を使用してオブジェクトを作成し、前述の静的に型指定されたコンストラクトを必要とせずにネットワーク経由で転送できます。

于 2013-02-08T21:59:13.997 に答える
2

JS.Classを使用すると、インターフェースを作成できます。

于 2013-02-08T22:02:17.583 に答える