2012-09-10 155 views
3

我經常對何時使用DataSource模式以及何時使用Properties向對象提供配置信息感到困惑。DataSource模式與設置對象時的屬性配置對象

我有兩種方法可以做到這一點,

一般來說,我保持了很多對象的類必須配置性能和重置對象,並使用新屬性繼續的方法。

而對於正在配置另一個對象的Object,我保留一個名爲configureXYZ:WithValues:的方法,它重置屬性並調用要配置的對象的重置方法。

這是我用MPMoviePlayerController看到的,我們必須設置屬性。

和其他方式是如何工作的,所有的配置信息來自數據源方法。

任何人都可以拋出更多的光線,在哪種情況下首選哪種方式。

因爲它經常讓我感覺很想使用設計模式,並使代碼看起來很時尚,但我想知道我們什麼時候需要這些。 我完全清楚委託模式,必須定期使用它。 DataSource是我從來不清楚的一件事。

回答

4

設計類時,決定使用委託或屬性時應考慮的關鍵因素是值的更改頻率。如果您將一次設置值並且它們不應再次更改,則屬性效果最佳。如果數值可能隨時間變化或由於條件而變化,那麼代表(數據源只是一個示例)的工作效果最佳。

例如,在UITableView中,行數是高度動態的。除了表視圖的控制之外,它可能會有很多原因發生變化。這些行甚至代表的是高度動態的。它們可能是數據;他們可能是菜單選項;他們可能是遊戲中的一部分。 UITableView不會試圖猜測或控制任何。它將它移動到一個代表(數據源),在那裏做出可能非常複雜的決定。

MPMoviePlayerController有幾個控件意味着非常具體的東西,應該幾乎不會改變(特別是一旦電影開始播放)。基本上,你設置的東西,擊中play並走開。在這種情況下,代表可能會過度殺傷。

有很多情況是在中間,任何一種方式都可以。我會鼓勵開發人員首先考慮授權,然後如果它與財產無關。這不是因爲委派總是正確的答案,更多的是因爲大多數C++或者Java教育的開發人員都不會考慮委派,所以應該有意識地去做。

沿着這些路線的一些其他的想法:

  • 當使用性能,這是理想的,如果它們在初始化時被配置,並且此後不可改變的。這解決了很多問題。

  • 如果你發現自己需要很多屬性,委派可能會更好,而且通常更簡單。

  • 委託通知方法(somethingDidHappen:)通常更好地實現爲塊。 (ObjC中的塊相對較新,許多基於代理的Apple界面正在移動到塊,但由於歷史原因,您會看到真正的混合。)

  • 「委託」和「數據源」之間的區別是委託人管理行爲,而數據源提供數據。它們通常以相同的方式實現。

+2

非常感謝! StackExchange是一個很好的學習社區。 –

2

它主要取決於班級的動態。 UITableView是一個非常動態的界面元素。其數據來來去去。您可以添加/刪除/編輯/排序。你可以與它進行交互。如果您將屬性分配給tableView,則會丟失一些使其像健壯一樣的屬性。另一方面,MPMoviePlayerController具有不同的目的。我從來沒有使用這個類,但從外觀上看,它讀取一個視頻文件並提供播放。它沒有多少變化,所以屬性很有意義。

如果您正在編寫一個類,並且您需要該類儘可能靈活(UIPickerView,UITableView),讓代表允許您這樣做。如果你的類只在初始化之後以有限配置工作,那麼採用屬性方法可能會更好。