【问题标题】:In objective C should i group 10 different protocols in a single header file or every protocol should be placed in it's class header file在目标 C 中,我应该将 10 个不同的协议组合在一个头文件中,还是每个协议都应该放在它的类头文件中
【发布时间】:2013-07-02 10:53:58
【问题描述】:

哪个是最佳实践-

我有 10 种不同类型的协议,由 10 种不同的类对象 () 遵守,

classA 符合protocolA classB 符合协议 B ...

... 您可以将它们视为一对一的关系,而不是由 2 个不同的类共享协议。

现在我应该将所有这 10 个协议分组到一个名为 Protocol.h 的头文件中,然后当任何类想要符合他的协议时导入该头文件。就像在 A 班一样 -

#import Protocol.h

或者我应该将每个协议放在包含符合特定协议的对象的类的头文件中,例如-object_name<protocol>。像 X 类一样包含符合 ProtocolA 的 ClassA 对象。

  @protocol ProtocolaA <NSObject>

    @interface ClassX:
    {
       id <ProtocolA> objectA;
    }

感谢您的回复。

【问题讨论】:

  • 我从来没有这样做过。如果它的工作,那么罚款。使用它。
  • 我听不懂你的意思。
  • Declaring a delegate protocol 的可能重复项

标签: ios objective-c cocoa-touch cocoa design-patterns


【解决方案1】:

对此没有正确或错误的答案。我的个人偏好通常是每个标头一个协议。但是,如果有两个或多个协议在逻辑上组合在一起并且通常会一起导入,则可以将它们放在同一个头文件中。

如果您的协议构成了框架的 API,这是将它们放在一起的另一个原因,这样使用框架 API 的类就可以只进行一次导入。

但我建议不要使用像 protocol.h 这样的通用名称,试着想出一些更能描述协议实际用途的东西,例如Cocoa 的所有协议和类接口都逻辑导入(使用嵌套导入)在一个名为 Cocoa.h 的标头中。

在第二部分,我发现将协议和类接口放在单独的标头中通常更好。

【讨论】:

  • 感谢您的回答。事实上,我正在为 iOS 编写广告 SDK。所以sdk中有很多协议(有不同类型的回调,如音频/视频/动画等)(大约20个),所以我不确定我是将它们分组在一个标题中还是将它们分开放在它们的容器中(类包含它们的conformer)头文件。如果这些协议由多个类共享,那么将它们分组到一个头文件中将是一个不错的选择,但不幸的是,90% 的协议仅由一个类符合。所以你能告诉我在这种情况下你会怎么做。
  • @russell 您可以两全其美。为每个协议提供自己的标头,然后将它们全部导入“伞形”标头中。以 Foundation.h 为例。
【解决方案2】:

我不会将所有协议放在一个标头中,因为每个协议只有一个类需要。导入协议标头将为您提供所有协议。

Apple 在这些情况下所做的是:

1) 在使用协议的类的头部包含协议(例如UITableView.hUITextView.h):

@class ClassX;

@protocol ProtocolX<NSObject>

// Use ClassX here

@end

@interface ClassX

@property (nonatomic) id <ProtocolX> myProtocol;

@end

2) 在 Apple 的标头中看到的另一个解决方案是为标头和实现都有一个自己的文件(例如 CLLocationManager.hCLLocationManagerDelegate.h)。

底线:与将所有协议放在一个标头中相比,我更喜欢这两种解决方案。

【讨论】:

  • 您好 Tammo,感谢您的回答。您和 JeremyP 的回答都很好。但正如杰里米首先回答的那样,我必须接受他的回答。我赞成你的回答。
【解决方案3】:

您可以将协议放在包含符合特定协议的对象的类的头文件中,或者将协议添加为新文件。

Working with Protocols

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多