2

ウィキの質問かもしれませんが、それでも。どちらのアプローチがより Javascript の精神に準拠していますか。

var Report = function(data) {
    var that = this;
    that.send = function() { ... };
};

var r = new Report(data); // create and validate the data
r.send(); // encode and send the data

また

var sendReport = function(data) {
    ...
    // create, validate, encode and send the data
    ...
};

最初のアプローチはよりオブジェクト指向のようですが、2 番目のアプローチはより機能的ですか? 最初は、 の機能がよりテストしやすいように見えるかもしれませんReport(ただし、たとえばsend()、この段階でしかありません)。Reportまた、状態を調べる必要があるときに、デバッガーで型のオブジェクトを表示するのが好きです。

2 番目のアプローチはより「単純」かもしれませんが、テストしにくいようです。

私は個人的に最初のアプローチをとっていますが、問題は、「間違った」ドメインでオブジェクト指向の「原則」を適用しようとするかどうかです(私の質問をよりよく表現するのを手伝ってください)。

4

5 に答える 5

1

私が今見ているのは、2番目の関数はそれを受け取って送信する単純な関数であるというdataことです。そして、あなたはそれのクラスを作り、それを複数のメソッドに分割することが有利であるかどうか疑問に思っています。

したがって、これの代わりに:

sendReport(data);

あなたはするでしょう:

var a = new Report(data);
a.send();

検証Reportとエンコードのための2つの内部メソッドがあります。すべてを1つのバッチで実行するのではなく、3つの異なる関数になるため、間違いなくテスト可能になります。

パフォーマンスは考慮に入れる必要はありません。2つの追加の関数呼び出しと1つの追加のオブジェクト作成です。おそらく、1秒間に何百万回もレポートを送信することはないでしょう。特にそれはネットワークI/Oを意味するので。

また、新しいインスタンスを作成する必要はありません。次のこともできます。

var report = {
    encode: function(){},
    validate: function(){},
    send: function( data ) {
        if( this.validate( data ) ) {
            data = this.encode(data);
        }
        else {
             //?
        }

        //send
    }
}

そうすれば、新しいインスタンスを作成しなくても、上記のメリットを得ることができます。

report.send(data);
于 2012-07-18T09:51:36.567 に答える
1

あなたの質問は実際にはnewオペレーターに関するものではないようです。OO を使用するか、関数型プログラミングを使用するかが重要です。

この点で、OO は完全に JavaScript の範囲内です。API ( eg eg ) から、JavaScript が非常にオブジェクト指向の言語であることがわかります。

HTML5 はこれをさらに進め、新しいメソッドObjectオブジェクトに追加することで、オブジェクトをより適切に制御できるようにしました。

newの使用、およびそれを回避するかどうかに触れて、この優れた回答を紹介します (および を使用するように指示しますnew)。

于 2012-07-18T09:26:14.843 に答える
0

状況によって異なりますが、通常、コードが小さい場合は 2 番目を使用し、コードが大きくなるにつれて最初のコードに移行します。すべてをオブジェクト指向にすることに意味はありませんが、オブジェクトとして意味のある機能のグループがある場合は、オブジェクトを作成する必要があります。

2 番目のオプションは、単一の関数が多すぎる場合にのみテストしにくくなります。それ以外の場合は、関数のパラメーターを変更して結果を確認するだけで、非常にテスト可能です。

于 2012-07-18T09:24:52.870 に答える
0

他の人が示唆しているように、これは実際にはオブジェクト指向と機能の問題ではないと思います。

本当の問題は、レポートがそれ自体で有用な抽象化であるかどうかです。そうである場合、つまり、すぐに送信するだけでなく、他の操作を実行したい場合は、抽象化を実装すると便利です。OO では、それはクラスまたは同等のもの (JS ではコンストラクター関数) になります。関数型言語では、通常、そのような場合にモジュールまたは抽象データ型を導入します。

抽象化が必要ない場合は、単一のプロシージャ/関数を使用してください。

于 2012-07-18T09:56:50.083 に答える
0

それは、変数のオブジェクトをインスタンス化したい場合であり、JavaScript オブジェクトでより機能し、js のプロトタイプを使用でき、メソッドと変数をオーバーライドすることもできます。

于 2012-07-18T09:42:04.863 に答える