1

この質問はCoffeeScriptを扱っていますが、同じ問題がJavaScriptにも当てはまります。この例を考えてみましょう。

class Parent    
    func: ->
        alert @member

class Child extends Parent    
    constructor: ->
        @greet()

    greet: ->
        @member = 'hello!'
        @func()

Parentそれだけでは役に立たない。(new Parent).func()を返しますundefined

私の質問は次のとおりです。

  • Parent子クラスに共通の関数と属性を提供するようなクラスを定義することに何か問題がありますか?Parent独自のファイル内の複雑なクラスである可能性があり、プロトタイプチェーンのはるか下のクラスに機能を提供します。ドキュメントがないと、これは混乱を招く可能性があります。

  • では、 ChildオブジェクトChild.greetに動的に追加します。memberコンストラクターで最初に初期化せずにオブジェクトに新しいメンバーを追加することに何か問題がありますか?やったほうがいいconstructor: -> @member = null; @greet()ですか?そうすることで、次のプログラマーはオブジェクトが持つメンバーを把握し、未定義の変数に関する問題を回避します。反対に、コードにはJavaScriptが必要としないノイズが多く含まれます。

  • 最後に、CoffeeScriptの慣用的なOOPの良い例であるソースコードはありますか?

4

2 に答える 2

2

あなたの最初の質問に関しては、いいえ、私はそれをすることに本質的に何も悪いことはないと思います。テンプレートメソッドパターンの場合だと思います(メソッドの代わりにプロパティアクセスを使用しますが、基本的には同じです)。私はあなたのコード構造にいくらかの複雑さを加えます、それで、それがより簡単な方法で解決されることができる場合には、私はより簡単な解決策で行くことを勧めます。

コンストラクターでメンバー変数を初期化しないことについては、理想的には、コンストラクターはオブジェクトを使用可能な状態のままにしておく必要があります。これは、必ずしもすべての可能なメンバー変数を初期化することを意味するわけではありません。その特定のコードスニペットについては、追加@member = nullしても私の意見では何も追加されません。悪いコンストラクターの例は、ユーザーがオブジェクトを使用する前にインスタンス化するよりも多くのことを行う必要があるものです。

c = new Circle
c.radius = 5 # Need to set the radius to get the area.
console.log c.area() # If i hadn't set the radius this would break.

慣用的なOOCoffeeScriptの優れたソースについてはわかりません。Smooth CoffeeScriptは言語を学ぶのに良い本だと思います。それは、OOについての章を持っていますが、それが十分に徹底的であるならば、私はそうではありません。

于 2012-08-03T18:37:11.583 に答える
1

はい、これは絶対にテンプレートメソッドパターンの場合です。Coffeescriptの慣用的なガイドについては、 http: //coffeescriptcookbook.com/を調べます。

しかし、慣用的なRubyに関するRubyの本/リファレンスも確かに役立ちます。

于 2012-08-09T15:14:38.470 に答える