数据源模式与设置对象时的属性

我经常对什么时候使用DataSource模式以及何时使用Properties来为对象提供configuration信息感到困惑。

我有两种方法来做到这一点,

通常我在Object类中保留了很多必须configuration的属性和一个重置对象并继续使用新属性的方法。

而对于configuration另一个对象的Object,我保留一个名为configureXYZ:WithValues:的方法,它重置属性并调用要configuration的对象的重置方法。

我已经看到用MPMoviePlayerController,我们必须设置属性。

其他方式是如何工作的,所有的configuration信息来自数据源方法。

任何人都可以抛出更多的灯光,在哪种情况下首选哪种方式。

因为我经常想使用devise模式并使代码看起来很时尚,但是我想知道我们什么时候需要这些。 我完全清楚委托模式,必须定期使用它。 DataSource是我从来不清楚的一件事情。

在devise一个类时,决定使用委托或属性之间的关键因素是值的变化频率。 属性效果最好,如果你设置一次值,他们不应该再次改变。 如果数值可能随时间变化或由于条件而变化,那么代表(数据源仅仅是一个例子)的效果最好。

例如,在UITableView ,行数是高度dynamic的。 在表视图的控制之外,它可能会有许多原因的变化。 这些行甚至代表的是高度dynamic的。 他们可能是数据; 他们可能是菜单选项; 他们可能是游戏中的一部分。 UITableView不会猜测或控制任何。 它把它移动到一个委托(数据源),在那里可能做出非常复杂的决定。

MPMoviePlayerController有几个控件意味着非常具体的东西,应该几乎不会改变(尤其是一旦电影开始播放)。 基本上,你设置的东西,打play ,走开。 在这种情况下,代表可能是矫枉过正的。

中间有很多案例,不pipe哪种方式都可以。 我会鼓励开发人员首先考虑授权,然后如果没有意义去与属性。 这不是因为委托总是正确的答案,而更多的是因为大多数C ++或者Java教育的开发者都不会考虑授权,所以应该有意识地去做。

还有一些其他的想法:

  • 当使用属性时,如果它们在初始化时被configuration并且之后是不可变的,那么它是理想的。 这解决了很多问题。

  • 如果你发现自己需要很多的财产,委托可能会更好,而且往往更简单。

  • 委托通知方法( somethingDidHappen: :)通常更好地实现为块。 (ObjC中的块相对较新,许多基于代表的苹果界面正在转移到块,但由于历史原因,您会看到真正的混合。

  • “委托”和“数据源”的不同之处在于委托pipe理行为,数据源提供数据。 它们通常以相同的方式实现。

它主要取决于class级的dynamic。 UITableView是一个非常dynamic的界面元素。 它的数据来来去去。 你可以添加/删除/编辑/sorting。 你可以与它进行交互。 如果将属性分配给tableView,则会丢失一些使其像健壮一样的属性。 另一方面,MPMoviePlayerController具有不同的目的。 我从来没有使用这个类,但从它的样子,它读取一个video文件,并提供播放。 它没有太多的变化,所以属性很有意义。

如果您正在编写一个类,并且您需要该类尽可能灵活(UIPickerView,UITableView),让代表允许您这样做。 如果你的类在初始化后只能在有限的configuration下工作,那么采用属性方法可能会更好。