2

しばらくの間、私はjavascriptアプリケーションを開発してきました。通常、単純なタスクを実行するための小さなスクリプトですが、継承を使用して疑似クラシックOOクラスを作成するためのDeanEdwardsのbase2ライブラリを使用するかなり大きく複雑なアプリケーションもあります...javascriptで。

base2ライブラリは、主に、私がよく知っている古典的なOOパラダイムに従うことができたために非常に役立ちました。また、より堅牢で成熟したjavascriptアプリケーション(たとえばbackbone.js )を構築するために使用できる他のいくつかのフレームワークも知っています。しかし、私は常に、このタイプのライブラリは、言語が実際には適していない原則を使用してコードを記述する方法を構築するための「不正行為」の方法であると感じています。

私は、オブジェクト/関数を定義し、それらをインスタンス化し、プロトタイプの継承を使用してポリモーフィズムを実現するためのさまざまな方法を読んでいます。これは本当に言語が基本的なレベルでどのように機能するかであり、それが迷惑または奇妙であると判断して、私が慣れている方法で物事を行う方法を見つけようとするのではなく、それを利用する必要があると感じています(古典的なOOの方法)。

したがって、このタイプのライブラリを使用していないアプリケーションを見ると、Java、C ++などの従来の汎用言語ではアプリケーションを作成する方法が非常に多いようです...アプリケーションを構築する正しい方法は、より明確に定義されているようです。 (良いコードと悪いコードを区別する方がはるかに簡単です)。誰かが明日私に「projectXの開発を始めてください」と尋ねた場合、再構築するには遅すぎるときに、後で私に噛み付くことがないと確信できる方法で、オブジェクトの定義と構造化を開始する方法がわかりません。全部。

プロトタイプの継承を使用すると、プロの複雑なjsアプリのスケルトンはどのようになりますか。したがって、クラシックOOを模倣するためのライブラリを使用せずに、単純なMVCタイプのアプリを想定しますが、より複雑な比率に簡単に拡張できます。オブジェクトを定義する方法は?オブジェクト/「クラス」をグループ化(名前空間)する方法は?言い換えれば、誰ももう理解できない混乱に終わることなくそれを行う方法は?

4

1 に答える 1

6

オブジェクト指向のJavascript「クラス」を作成する際に従うパターンは2つあります(JSには実際のクラスはないと思いますが、それらを模倣できます)。1つ目は、より使い慣れたOOの方法であり、理解しやすいものです。

// in JS, functions can be used as OO classes
var Person = function(name) {
    var self = this;

    //private methods and attributes
    this.getNickname = function(){
        return "Yaka";
    };

    //public methods and attributes (return obj)
    return {
        getName : function() {
            return name + ' ' + self.getNickname();
        }
    }
};

//static functions attached to 'Person' class 
Person.hasBrain = function() {
    return true;
}

このモデルを使用すると、クラスにプライベート、パブリック、および静的セクションを設定して、適切なカプセル化を行うことができます。ただし、これは最適な方法ではありません。すべてのオブジェクトがすべてのインスタンスメソッドの独自のコピーを保持するためです。プロトタイプベースのプログラミングでは、インスタンスメソッドの複数のコピーを回避できます。

// in JS, functions can be used as OO classes
var Person = function(name) {
    this.name = null;
};

// use of prototypes improves performance and memory use
Person.prototype.getName = function() {
    return this.name;
}

Person.prototype.setName = function(name) {
    this.name = name;
}   

これは、従来のOOプログラマーにはあまり馴染みがないように見えますが、JavaScriptリソースを使用するための最適な方法です。継承にもよく合います。

var Manager = function() {}
Manager.prototype = new Person();

実際には、アプリケーションで頻繁に使用されているベース/フレームワーククラスに典型的なアプローチを使用します。時々または少数のインスタンスで使用されるクラスについては、前に説明したアプローチを使用します。

また、requirejsなどのAMDライブラリを使用し、物理ファイルごとに1つのクラスを定義することをお勧めします。次に、ビルドオプティマイザーを使用して、ファイルを1つのスクリプトに最適化します。

BoilerplateJSリファレンスアーキテクチャのユニットテストから上記の2つのアプローチをコピーしました。BoilerplateJSのコードを見てください。これにより、JSを使用して複雑なアプリケーション開発に取り組む方法についてより多くのアイデアが得られます。

免責事項:私はBoilerplateJSの主な著者です

于 2012-09-05T06:17:54.987 に答える