2011-12-30 68 views
0

有一個強大的argument使對象不可變。所以我們應該在可能的情況下永遠堅持不變,或者在決定某件事是不可變的時候看待現實世界?當我們決定不變時,我們應該看看現實世界嗎?

示例:紙牌遊戲。 「卡牌」是不可改變的嗎?我們有兩種選擇:

  1. 甲板是不可變的。所有方法(shuffle,deal-one)都會返回一個對新的deck對象的引用。
  2. 甲板是可變的。所有方法都會改變當前的牌組。

這將是很好的使甲板不可變。我們將從上面的鏈接中獲得好處。但在現實世界中,套牌並非一成不變 - 我們洗牌並獲得「相同」牌組,但順序不同。

回答

2

您應該始終努力爲您的場景做出最佳折中。對某種風格來說,「束縛」沒有任何意義,僅僅是因爲它很流行,或者是酷炫的孩子或者做什麼。如果您聽說了贊成和反對的論點,您應該能夠權衡這兩種選擇並作出適合您,您的代碼庫和團隊的決策。

請謹慎對待盲目遵循最佳做法。


在用撲克牌這種特定情況而言,我會傾向於默認一成不變的,而是問自己,我前幾個問題着手:

  • 是否有足夠的一個之間的複雜性洗牌/交易的發生和下一個? (如果是的話,+1是不可變的,因爲它可以'佔據你的頭腦',可以這麼說,就潛在的錯誤而言,如果你分享參考可以引入)
  • 是對甲板共享的參考線程? (如果是的話,+ 100爲不可變的,因爲如果可以同時修改,複雜度可以大大增加)
  • 是否有內存和/或速度限制? (如果是的話,一爲一個可變甲板,如果你是真正的資源制約,在地方修改的甲板是最有可能的 - 但不能保證 - 爲客戶提供更好的性能,和往常一樣,由一個分析器來引導)
  • 是需要的內存卡組合才能緊密映射到真實世界的套牌?例如。你的用戶是在他們自己的程序/ DSL中訪問/查詢它的嗎? (如果是,+1的可變性,因爲它可能更接近用戶的心理模型。但是,這仍然是你選擇了一個定義,一個不變的甲板仍然是有意義的)

這是一隻黃鼠狼答案我害怕,但你總是要根據自己的情況來判斷。有時候設計與域匹配比讓對象不可變更重要。其他時候,它不是,雖然你犯了一個編程選擇,這是值得不忘域 - 記住你的域名很少有照顧或模型進行了大量的東西,我們程序員應對在某一天到一天的基礎上。在其他情況下,您可能不得不放棄這兩種情況!

相關問題