配置对象时DataSource模式与设置属性

时间:2012-09-10 13:32:25

标签: objective-c ios oop

我经常对何时使用DataSource Pattern以及何时使用Properties为对象提供配置信息感到困惑。

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

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

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

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

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

任何人都可以更多地了解在哪种情况下首选哪种方式。

因为我经常想要使用设计模式并使代码看起来很时尚,但我想知道我们什么时候才真正需要它们。 我绝对清楚委托模式,必须定期使用它。 DataSource是我从未明确过的一件事。

2 个答案:

答案 0 :(得分:4)

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

例如,在UITableView中,行数是高度动态的。它可能会因为表视图控制之外的许多原因而发生变化。行甚至代表的是高度动态的。它们可能是数据;它们可能是菜单选项;他们可能是游戏中的碎片。 UITableView不会尝试猜测或控制任何内容。它将它移动到一个委托(数据源),在那里可能做出非常复杂的决定。

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

有许多案例处于中间位置,无论哪种方式都可以。我会鼓励开发人员首先考虑委托,然后如果没有意义就去考虑属性。这不是因为委托总是正确的答案,而是因为大多数C ++ - 或受过Java教育的开发人员不考虑授权,所以应该有意识地这样做。

其他一些想法:

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

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

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

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

答案 1 :(得分:2)

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

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