1

まともなオブジェクトサイズを持つ2つの変数(req、res)を共有する、クラスを作成するためのクリーンな方法またはコードを適切に構造化するための何らかの方法を実現するための最良の方法(パフォーマンス、メモリに関して)は何でしょうか。

はい、Node.js を使用する人にとっては req 変数と res 変数ですが、関係ありません。

これは私がこれまでに試したことです:

function Client(req, res){
  var self = this;

  self.req = req;
  self.res = res;

  route.call(self);
  handleRoute.call(self);
  handleRequestData.call(self);
}

function route(){
  var self = this;

  self.req.route = // ...
}

function handleAuth(){
  var self = this;

  self.req.auth = // ...
}

function handleRequestData(){
  var self = this;

  self.req.data = // ...
}

req と res はメソッド、プロパティを持つかなりまともなオブジェクトであると述べたので、改善できるかどうか疑問に思っています。.call(self) はインスタンスを通過するので、それが最も効果的な方法でしょうか?

また、「var self = this;」の使用も好きではありません。ずっと、駄目です。

ところで、Coffeescript は使いたくありません。

解決策 1. (req と res を大量に通過するため失敗します)

ファイル1.client.jsに到達したと仮定しましょう

var Client = {
  route: function(req, res){},
  auth: function(req, res, callback){ callback(req, res); },
  getData: function(req, res, callback){ callback(req, res); } // async
}

ファイル2.main.js

var client = require('./client.js');

client.route(req, res); // fine because this is syncronous.

// This is where the problem is, massive passing through req and res parameters.
client.auth(req, res, function(req, res){
  client.getData(req, res, function(req, res){
    // Do something...
  });
});
4

2 に答える 2

1

routehandleAuth、およびhandleRequestData関数を再利用するつもりですか? それらは Client コンストラクター関数に対して「プライベート」である可能性があります。

function Client(req, res) {
    function route() {
        //...
    }

    function handleAuth() {
        //...
    }

    function handleRequestData() {
        //...
    }

    route();
    handleRoute();
    handleRequestData();
}

私がメンバーとして設定reqしていないことを確認してください。あなたの場合、これが必須かどうかはわかりません。また、これはできることの始まりにすぎません。この回答へのコメントに記載されているように、新しいものが作成されるたびに、プライベート関数の新しいインスタンスも作成され、リソースが浪費されます。resthisClient

より洗練されたアプローチではClient、自己呼び出し関数式を使用して定義できます。

var Client = (function() {
    function route(req, res) {
        //...
    }

    function handleAuth(req, res) {
        //...
    }

    function handleRequestData(req, res) {
        //...
    }

    // This is the constructor function:
    return function(req, res) {
        route(req, res);
        handleRoute(req, res);
        handleRequestData(req, res);
    }
})();

ここで、Clientは最も外側の括弧で囲まれた関数式の積として定義されます。関数式は、クロージャー関数routehandleRoute、およびにアクセスできるコンストラクター関数を返しますhandleRequestData。これらの各関数は、reqおよびresパラメータで定義されていることに注意してください。このように、これらは静的なプライベート関数のように動作し、 によって参照されるものに関係なくコーディングして使用できますthis

self = this について: JavaScript がthisキーワードについて非常に混乱する可能性があることが知られています。ここにいくつかの情報があります。そのため、 likeまたはthisという名前のクロージャー変数に代入すると便利な場合があります。やみくもにやるべきではありませんが...結局のところ。selfme

于 2012-08-21T20:37:22.853 に答える
1

コンテキスト ( ) を常にローカル変数 ( ) に保存している理由がわかりません。異なるスコープを持つローカル オブジェクトに持ち込む必要がない限り、そのまま使用することもできます。thisselfthis

また、プロトタイプ内の他のメソッドをチェーンして、それらの内部のコンテキストにアクセスできます。

function Client(req, res){

  this.req = req;
  this.res = res;

  this.route();
  this.handleRoute();
  this.handleRequestData();
}

Client.prototype.route = function(){
  this.req.route = // ...
}

Client.prototype.handleAuth = function(){
  this.req.auth = // ...
}

Client.prototype.handleRequestData = function(){
  this.req.data = // ...
}

「パブリック」メソッドが必要ない場合は、次のようにします。

function Client(req, res){

  this.req = req;
  this.res = res;

  route.call(this);
  handleRoute.call(this);
  handleRequestData.call(this);
}

function route(){
  this.req.route = // ...
}

function handleAuth(){
  this.req.auth = // ...
}

function handleRequestData(){
  this.req.data = // ...
}
于 2012-08-21T20:34:20.513 に答える