3

我经常对何时使用数据源模式以及何时使用属性为对象提供配置信息感到困惑。

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

通常,我在对象的类中保留了许多必须配置的属性,以及重置对象并继续使用新属性的方法。

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

这是我在 MPMoviePlayerController 中看到的,我们必须设置属性。

其他方式是 tableView 的工作方式,所有配置信息都来自数据源方法。

任何人都可以更清楚地说明在哪种情况下首选哪种方式。

因为我经常很想使用设计模式并使代码看起来很时尚,但我想知道我们什么时候真正需要这些。我对委托模式非常清楚,并且必须定期使用它。DataSource 是我一直不清楚的一件事。

4

2 回答 2

4

在设计类时,在决定使用委托或属性时应考虑的关键因素是值的更改频率。如果您将设置一次值并且它们不应再次更改,则属性将发挥最佳作用。如果值可能随时间变化或因条件而变化,则委托(其中数据源只是一个示例)效果最好。

例如,在 中UITableView,行数是高度动态的。它可能由于表格视图控制之外的许多原因而改变。行甚至代表的是高度动态的。它们可能是数据;它们可能是菜单选项;它们可能是游戏中的一部分。UITableView不会试图猜测或控制任何这些。它将其移动到可以做出可能非常复杂的决策的委托(数据源)。

MPMoviePlayerController有一些控件意味着非常具体的事情,几乎永远不会改变(特别是一旦电影开始播放)。基本上你把东西设置好,打到play然后走开。在这种情况下,代表可能会矫枉过正。

中间有很多情况,任何一种方式都可能没问题。我会鼓励开发人员首先考虑委托,然后如果没有意义就使用属性。这并不是因为委托总是正确的答案,而是因为大多数受过 C++ 或 Java 教育的开发人员不考虑委托,因此应该有意识地这样做。

沿着这些思路的其他一些想法:

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

  • 如果您发现自己需要很多属性,委托可能会更好,而且通常更简单。

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

  • “委托”和“数据源”之间的区别在于委托管理行为,而数据源提供数据。它们通常以相同的方式实现。

于 2012-09-10T14:03:48.817 回答
2

这主要取决于班级的动态。UITableView 是一个非常动态的界面元素。它的数据来来去去。您可以添加/删除/编辑/排序。你可以和它互动。如果您将属性分配给 tableView,它会丢失一些使其像它一样健壮的属性。另一方面,MPMoviePlayerController 有不同的用途。我从来没有使用过这个类,但从它的外观来看,它读取一个视频文件并提供播放。它没有太多变化,所以属性很有意义。

如果您正在编写一个类,并且您需要该类尽可能灵活(UIPickerView、UITableView),那么拥有委托可以让您这样做。如果您的类在初始化后仅适用于有限的配置,那么采用属性方法可能会更好。

于 2012-09-10T13:45:39.410 回答