2013-09-28 51 views
1

這是一個純粹的設計/良好實踐問題,我不能提供實際的代碼示例,但只能提供僞代碼。在方法中動態聲明新的「類字段」 - 良好的做​​法與否?

我正在使用專有的JavaScript框架,它給了我一個類的概念(類似於TypeScript),並允許我動態創建「類成員/字段」。例如,使用僞代碼:

Class Human { 

    firstName; 
    secondName; 

    HumanConstructor() { 

    } 

    void method1 { 
     this.title = "Mr";  // dynamically created new Class field 
    } 

    void method2 { 
     this.addressedByName = this.title + this.firstName; 
    } 
} 

問題1:這是個好/壞的設計推出新的「類域」裏面的方法呢? 問題2:對於一種方法(方法2)而言,它是一種好的/壞的設計,取決於其他方法(method1)首先是caleld的事實。

上述兩個主題有哪些優缺點?

+0

Q1:我想如果你在方法中引入新的字段,你可能會打破Chrome的基於類的優化。 Chrome建議您在初始化類的一開始就定義所有類字段。 –

+0

Q2:通常,您有一個專用字段來保存method1已經(或尚未)被調用的事實,然後在method2中進行檢查。如果method1沒有被調用,那麼拋出一個異常。 –

+0

@JonAdams這個問題不適合軟件工程 - 它會很快被拒絕並在那裏關閉,請參閱[優點和缺點]的問題(http://meta.softwareengineering.stackexchange.com)/q/6758/31260)推薦閱讀:** [軟件工程(以前稱爲程序員)的含義是什麼?一個堆棧溢出指南](http://meta.softwareengineering.stackexchange.com/q/7182/31260)** – gnat

回答

3

在方法中引入新的「類字段」是好的還是壞的設計?

這是相當普遍認爲不好的設計。有很多原因。最流行的

  • 缺乏直接的代碼的可理解性
  • 性能問題。由於每次你這樣做,js運行時(v8等)需要創建一個新的內部類來表示模型。

它是一個方法(方法2)要依賴於一個事實,即另一種方法(方法1)首先叫一個好/壞DESGIN。

不。這是可變面向對象編程的本質。指導是使用你的直覺。

+0

謝謝,那正是我正在尋找的答案。也許你也可以評論我早些時候在Rouges上做出的**單元測試**評論。 –

+1

在另一個函數之前調用一個函數是排列步驟(排列,行爲,斷言)的有效部分。想想它,你甚至可以使用方法之前需要調用構造函數。 – basarat

+0

測試方法的隔離性如何?例如。可能會出現這樣一種情況,即方法1可能會意外行爲(尤其是在方法1接收到更改時),但仍然通過自己的測試,但可能導致方法2測試失敗(在方法2上報告錯誤的否定結果)。不會有一個模擬的地方更可靠嗎? –

0

它的一個缺點主要是如果第一個方法被調用,你會得到一個NPE,因爲標題沒有被初始化。根據我自己的經驗,如果你知道將有一個領域用於在類中聲明它,並在構造器中定義它,那更好。

+0

嗯,是的,你的理由是顯而易見的...我可以插入一個檢查null或簡單處理方法2中的NPE。我正在尋找的是一個**真實世界的例子,表明這種做法會使開發變得糟糕/困難。** 例如:我甚至找到這個的全部原因,是由於單元測試有點尷尬...在測試方法2時,我很想先調用method1,而不是模擬所需的類字段(現實世界中的字段比簡單的字符串複雜得多,而且很難模擬)。 –

+0

如果我可能會問相反的話,你問的方法會更好一個真實世界的例子是什麼? – Rogue

+0

我不是主張在這個主題中展示的設計,想不到它有什麼好處。我只是在尋找可能的缺點,例如:顯示由於這種類型的設計而導致開發,維護或應用程序質量如何受損的情況。你的觀點是有效的,但顯而易見的,所以我一直在尋找其他我們可能沒有想到的東西。 –