10

コードをスリムでセクシーに (パフォーマンスとメモリの面で) 書くのが好きです。Mootools を使用していますが、正しい方法で使用しているかどうか疑問に思っていました。また、コードをテストして答え 私は自分自身を探しています。

//First we create a class like so:

var FirstClass = new Class {(
   'someFunc': function() { /* do stuff */ }
})

//Now this class uses first class with "Implements"

var SecondClass = new Class ({
   'Implements': [FirstClass, SomeOtherClass, SomeOtherOtherClass],
   'iAlsoDoStuff': function() {/*do stuff */}
})

// finally the class that Extends second class
var ThirdClass = new Class ({
   'Extends': SecondClass,
   'takeOverTheWorld': function() {/*code to win lottery */}
})

secondclass が拡張されるたびに、実装されたクラスの新しいコピーが作成されないかどうかを確認するにはどうすればよいですか? 私が上記のことを行っている理由は、それを必要とするすべてのクラスに対して SecondClass を拡張することです。これは静的に行いますが、2 番目のクラスは複数のクラスを拡張できないため、Implements を使用しています。

4

3 に答える 3

12

Extends と Implements の主な違いは、Implement がクラスのプロトタイプを変更するのに対し、Extend はコピーを作成することです。つまり、変更をクラスに実装すると、そのクラスのすべてのインスタンスがその変更を即座に継承しますが、Extend を使用すると、既存のすべてのインスタンスは同じままになります。

これはモートリアルからの引用です。チェックしてください。http://mootorial.com/wiki/mootorial/02-class/#implement-vs.-extend

テストに関しては、忍者クラスでいくつかのサンプルケースを作成し、それらをhttp://www.jsfiddle.netに配置することを強くお勧めします。その後、分析に関するアドバイスや、Google または IRC の mootools メーリングリストを求めてください ( irc.freenode.net#mootools)、SO は mootools コア チームから多くのヒットを得ていないようです。理想的には、アーロン・ニュートン、アリアン、cpojer、rpflo のような人と話したいです :)


更新:私もこれについてブログに書きましたが、私は間違っていました。単純にミューテーターが likeExtendsと導入される順序に違いがありImplementsます。実装と拡張はできますが、それを機能させるには、最初に Extends を宣言する必要があります。

詳細はこちら: http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html


update結局のところ、これが役立つ場合がいくつかあります。問題は次のとおりです。

var ninja = new Class({
    kill: function() {
        alert("kill!");
    }
});

var human = new Class({
    initialize: function(){
        alert("i r human!");
    }
});

var badass = new Class({
    Implements: [ninja],
    Extends: human,
    initialize: function() {
        alert("i r badass and.. ");
        this.parent();
        this.kill();
    }
});

new badass(); // i r badass, i r human, this.kill is not a function exception.

...単に機能しません。代わりにninjaを実装するにはクラスhumanが必要で、単純にhumanを拡張するにはクラスbadassが必要です。人間が新しい kill メソッドを取得することによる副作用 (彼らが知っているかどうかはわかりません) は別として、これは、ワルが .kill を使用して直接の親である人間を呼び出すことができるようになることを意味します。

複雑なことをせずに、好きなように書き直してみませんか? Request.JSONP のようなネイティブ クラスを拡張してから、新しいストレージ クラスを拡張されたクラスにミックスインすることを決定する可能性があるためです。実話... いずれにせよ、利用可能な特定のクラスをリファクタリングする余裕はないかもしれません。

これを克服するための興味深いパターン (別の場所で定義されている request.jsonp というヒューマン クラスを考えてください) - 拡張しているクラスにメソッドとプロパティを追加したいだけで、mixin クラスを再利用する予定がない場合 (忍者):

human.implement(new new Class({
    kill: function() {
        alert("kill!");
    }
}));

var badass = new Class({
    Extends: human,
    initialize: function() {
        alert("i r badass and.. ");
        this.parent();
        this.kill();
    }
});

new badass(); // // i r badass, i r human, kill!

おそらく、あなたはただできるかもしれませんhuman.implement({ method: function });が、クラスはそれ以上のものになる可能性があります.

他の用途のために忍者クラスへの参照を保存したい場合、上記はこれと同じになります (ミックスインを再利用する場合):

var ninja new Class({
    kill: function() {
        alert("kill!");
    }
});

human.implement(new ninja); 
// this is what differs from say - instantiation + shared inherited properties.
// also, a constructor will work.
// the alternative would just do:
// human.prototype.kill = function() { alert("kill"); }

var badass = new Class({
    Extends: human,
    initialize: function() {
        alert("i r badass and.. ");
        this.parent();
        this.kill();
    }
});

new badass(); // // i r badass, i r human, kill!

これが誰かに役立つことを願っています。これは、ミックスインとして追加のストレージ クラスを使用して Request.JSONP を拡張している実際の例です: http://jsfiddle.net/dimitar/YacZe/

于 2009-11-16T03:47:08.250 に答える
1

Mootools google グループでようやく回答を得ました。誰かが興味を持った場合に備えて、ここで更新すると思いました。

http://groups.google.com/group/mootools-users/browse_thread/thread/5aec78813fa51cc1

楽しみ!ローマン

于 2009-11-22T22:26:25.473 に答える
0

Extends と Implements は、Mootools の開発者自身によって非常によくテストされています。実際、彼らが使用するテスト スイート全体はanutron/mootools-unittesterで入手できます。フレームワークのコア機能をテストする必要はありません。

Mootools のドキュメント、clientcide の Web サイト、mootorial などで、Extend と Implement が何をするかをよく読んでおくことをお勧めします。

ところで、いくつのオブジェクトを作成していますか? 巨大な数ではない場合、メモリを大量に使用してオブジェクトを作成していたとしても、メモリなどは大きな問題にはなりません。これは時期尚早の最適化でしょうか?

于 2009-11-12T14:04:33.843 に答える