2012-09-10 149 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),让代表允许您这样做。如果你的类只在初始化之后以有限配置工作,那么采用属性方法可能会更好。