2016-04-06 19 views
5

私はnode.jsモジュールにパターンを使用しています。これは私には明らかであると思われるので、何か間違っていなければならないと思っています。モジュールにグローバルなプライベート変数を保持するために、モジュールオブジェクトのプロパティとしてそれらを添付するだけです。これと同じように:第二の例では、ファイルの先頭にvar someClientを探して行く必要があるため名前空間として `module`を使用します。

module.exports = { 

    init: function() { 
    module.someClient = initializeSomethingHere() 
    }, 

    someMethod: function(done) { 
    module.someClient.doSomething(done) 
    } 
} 

これは...

var someClient; 

module.exports = { 
    init: function() { 
    someClient = initializeSomethingHere() 
    }, 

    someMethod: function(done) { 
    someClient.doSomething(done) 
    } 
} 

...このようなものよりも、私には望ましいと思われますの方法でvarキーワードの省略が意図的であることを確認してください。私はこのパターンが他の場所で使われていることは一度も見たことがないので、理想的ではないものが欠けているのだろうかと思います。

思考?

+0

私は必要なものに応じて両方を使用します。コンストラクタをエクスポートする必要がある場合、オプション2。たくさんの異なる場所で共有されるオブジェクトが必要な場合、オプション1。どちらも間違っていません。どちらも「最高」です。ノードモジュールは*キャッシュ*されているので、このコードが 'require()'していると、オプション1 *は変更が安全ではないので危険ではありません。時にはそれがまさにあなたが望むものです。また、コードを見てみましょう:完全に異なるもの(プロトタイプのオブジェクトコンストラクタ対オブジェクトリテラル)をエクスポートしているので、必要な場合は完璧です。 –

答えて

4

考えられるいくつかの欠点があります。

1)これらのプロパティはモジュール外でアクセスしたり変更したりすることは技術的に可能ですが、モジュール自体への参照が外部で利用できる場合にのみ可能です。モジュールを独自の書き出し(最も単純な例であるmodule.exports = module;)で使用できるようにすると、それらが公開されます。

2)組み込みプロパティや、まだ存在しない将来の組み込みプロパティとのネーミング競合がある可能性があります(これにより、node.jsの将来のバージョンでコードが破損する可能性があります)。これは非常に問題があり、デバッグするのが非常に難しいかもしれません。現在、モジュールオブジェクトの組み込みプロパティは、children, exports, filename, id, loaded, paths,parentです。

これは、ファイルの先頭にあるvar someClientを検索して、varキーワードの省略がinitメソッド内で意図的であることを確認する必要があるためです。

これが理由であれば、module以外の名前空間を使用することができます。たとえば、var private = {};を各ファイルの先頭に追加し、次にmodule.someClientの代わりにprivate.someClientを使用します。

'use strict'; varの偶発的な省略はエラーであり、偶発的なグローバルではありません。

1

欠点

  • オプション1:この方法は、組み込みのプロパティまたは@paulproが彼の答えで述べたように、まだ存在していない将来の組み込みプロパティとの競合を命名しがちです。

  • オプション2:varキーワードが不足していて、someClientがグローバルに公開されています。あなたは、常にファイルの先頭にあるvar someClientを検索する必要があります。

代替

JavaScriptが関数スコープを持っているとして、それが関数内ですべてのものを定義する方が良いでしょう。関数内にプライベートメンバーとパブリックメンバーを作成する。以下は、従うことができるデザインパターンです:

'use strict'; 

module.exports = (function(){ 

    //private 
    var someClient; 

    //public properties 
    var that={}; 

    that.init = function() { 
    someClient = initializeSomethingHere() 
    }, 

    that.someMethod: function(done) { 
    someClient.doSomething(done) 
    } 

    //expose only the required methods 
    return that; 
})(); 

ここで公開されているメソッドは、そのオブジェクトにアタッチされているメソッドだけです。残りはすべて関数スコープ専用です。 varキーワードがsomeClientにない場合でも、機能の外側にはアクセスできません。これは、上部に'use strict'を使用すると発生しません。

xyz.jsファイルを必要とするときにロジックが初めてで、関数ではなくthatオブジェクトが返されます。

関連する問題