【发布时间】:2011-09-15 14:13:33
【问题描述】:
我想知道与其他实现双向类通信的技术相比,使用自定义协议和委托的相对优势是什么?
例如,另一种解决方案是:
A 关联到 B B 关联到 A
这样 A 和 B 都可以访问彼此的信息...
我有点理解协议允许增加系统设计的模块化,但我不完全确定为什么或如何?
【问题讨论】:
标签: iphone objective-c delegates protocols
我想知道与其他实现双向类通信的技术相比,使用自定义协议和委托的相对优势是什么?
例如,另一种解决方案是:
A 关联到 B B 关联到 A
这样 A 和 B 都可以访问彼此的信息...
我有点理解协议允许增加系统设计的模块化,但我不完全确定为什么或如何?
【问题讨论】:
标签: iphone objective-c delegates protocols
自定义委托协议是一件很棒的事情,它允许您的对象不依赖于特定的类。任何符合给定协议的对象都可以是委托。例如,任何实现 NSTableViewDelegate 协议的对象都可以成为表视图的委托。
否则,如果使用直接关联,则必须使用某个类的对象。
【讨论】:
使用委托模式(特别是使用协议),类保持松散耦合。这在考虑 MVC 模式时很重要。委托模式允许视图与控制器保持分离。
此外,“A 关联到 B B 关联到 A”会创建一个保留周期。委托模式编码了内存管理问题(即一个类不应该保留它的委托)。
【讨论】:
这种双向依赖是要避免的,因为在编译级别这意味着您每个包含都包含其他的。
当 OO 编程的目标之一是减少组件耦合时,您将类捆绑得太多了。
即使你能做到并不意味着它是好的做法。
最好的做法是指定 2 种协议,一种用于服务器/对象/生产者/...,另一种用于客户端/委托/消费者/...
然后 A 将实现一个协议,将与实现第二个协议的对象对话。 B 将实现第二个协议。
这意味着您可以在将来替换 B 实现以匹配新的 API/编程模型/测试存根等。
减少耦合是提高代码模块化和可测试性的一种手段。
您不必这样做,但从现在起 6 个月后重新使用您的代码时,您会很高兴 :)
【讨论】:
通常不需要 2 个对象进行完全双向通信。
通常在 iPhone 中,您从 A 启动 B(例如,来自列表视图控制器的详细视图控制器)并将 A 设置为 B 的委托,以便它会收到相关事件的直接通知。
就面向对象的设计/编程而言,以完全双向连接方式连接 2 个对象是不正确的。
在这种情况下,您松开了封装。
一旦您使用委托设计模式,您的对象就不会真正了解彼此,但仍然可以通信。
此外,这样任何实现了某种协议的对象都可以被设置为委托。
这样对象也不必相互保留...
【讨论】: