2012-08-03 44 views
1

此問題涉及CoffeeScript,但同樣的問題仍然適用於JavaScript。考慮下面這個例子:初始化父類中的變量(JavaScript/CoffeeScript成語)

class Parent  
    func: -> 
     alert @member 

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

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

Parent是對自己沒用。 (new Parent).func()返回undefined

我的問題是:

  • 這有什麼錯定義諸如Parent剛剛提供常用的功能和屬性的子類類? Parent在其自己的文件中可能是一個複雜的類,它爲原型鏈中的類提供了功能。沒有文件,這可能會令人困惑。

  • Child.greet中,我們動態地將member添加到一個Child對象。沒有首先在構造函數中初始化它們,向對象中添加新成員是否有任何問題? constructor: -> @member = null; @greet()是否更好?這樣,下一位程序員就知道該對象將具有什麼成員,並且將避免未定義變量的問題。另一方面是代碼將會有更多的噪聲,而JavaScript並不是必需的。

  • 最後,有沒有一個源代碼,這是一個在CoffeeScript中慣用的OOP的好例子?

回答

2

關於你的第一個問題,不,我不認爲這樣做有任何天生的錯誤。我會說這是template method pattern(使用屬性訪問而不是方法,但基本相同)的情況。我確實爲代碼結構添加了一些複雜性,所以,如果能夠以更簡單的方式解決問題,我建議使用更簡單的解決方案。

關於不在構造函數中初始化成員變量,理想情況下,構造函數應該使對象處於可用狀態,這並不一定意味着初始化每個可能的成員變量。對於這個特定的代碼片段,添加@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. 

我不知道有關慣用OO CoffeeScript的良好來源。我認爲Smooth CoffeeScript是一本學習語言的好書,它有一個chapter about OO,但如果它足夠徹底,我不會。

1

是的,這絕對是一種模板方法模式。 對於一些Coffeescript慣用指南,我會研究http://coffeescriptcookbook.com/

但任何有關慣用Ruby的Ruby書籍/參考資料肯定也會有所幫助。