我经常对何时使用DataSource Pattern以及何时使用Properties为对象提供配置信息感到困惑。
我有两种方法可以做到这一点,
通常,我在Object的类中保留了许多必须配置的属性,以及一个重置对象并继续使用新属性的方法。
对于配置另一个对象的Object,我保留一个名为configureXYZ:WithValues:的方法,它重置属性并调用要配置的对象的reset方法。
我在MPMoviePlayerController中看到,我们必须设置属性。
和其他方式是tableView如何工作,所有配置信息都来自数据源方法。
任何人都可以更多地了解在哪种情况下首选哪种方式。
因为我经常想要使用设计模式并使代码看起来很时尚,但我想知道我们什么时候才真正需要它们。 我绝对清楚委托模式,必须定期使用它。 DataSource是我从未明确过的一件事。
答案 0 :(得分:4)
在设计类时,在决定使用委托或属性时应考虑的关键因素是值的变化频率。如果您将值设置一次并且它们永远不会再次更改,则属性最有效。代表(其中数据源只是一个示例)如果值可能随时间变化或因条件而发生变化,则效果最佳。
例如,在UITableView
中,行数是高度动态的。它可能会因为表视图控制之外的许多原因而发生变化。行甚至代表的是高度动态的。它们可能是数据;它们可能是菜单选项;他们可能是游戏中的碎片。 UITableView
不会尝试猜测或控制任何内容。它将它移动到一个委托(数据源),在那里可能做出非常复杂的决定。
MPMoviePlayerController
有几个控件意味着非常具体的事情,几乎不会改变(特别是一旦电影开始播放)。基本上你设置了东西,点击play
并走开。在这种情况下,代表可能会有点矫枉过正。
有许多案例处于中间位置,无论哪种方式都可以。我会鼓励开发人员首先考虑委托,然后如果没有意义就去考虑属性。这不是因为委托总是正确的答案,而是因为大多数C ++ - 或受过Java教育的开发人员不考虑授权,所以应该有意识地这样做。
其他一些想法:
使用属性时,如果在初始化时配置它们并且此后不可变,则它们是理想的。这解决了很多问题。
如果你发现自己需要很多属性,委托可能会更好,而且往往更简单。
委托通知方法(somethingDidHappen:
)通常更好地实现为块。 (块在ObjC中相对较新。许多基于委托的Apple接口正在转向块,但出于历史原因,你会看到真正的混合。)
“委托”和“数据源”之间的区别在于委托管理行为,而数据源则提供数据。它们通常以相同的方式实现。
答案 1 :(得分:2)
这主要取决于班级的动态。 UITableView是一个非常动态的界面元素。它的数据来来去去。您可以添加/删除/编辑/排序。你可以与它互动。如果将属性分配给tableView,它会丢失一些使其具有健壮性的属性。另一方面,MPMoviePlayerController有不同的用途。我从来没有使用过这个类,但从它的外观来看,它会读取一个视频文件并提供播放。它没有太多变化,所以属性很有意义。
如果你正在编写一个类,并且你需要该类尽可能灵活(UIPickerView,UITableView),那么让代表允许你这样做。如果您的类仅在初始化后使用有限的配置,那么采用属性方法可能会更好。