Objective c 最佳实践样式--具有委托和所有权的方法名称
跨类使用相同的命名方法是好的做法还是坏的做法,特别是在涉及继承和/或协议的情况下 例如,我有某种协议:Objective c 最佳实践样式--具有委托和所有权的方法名称,objective-c,coding-style,Objective C,Coding Style,跨类使用相同的命名方法是好的做法还是坏的做法,特别是在涉及继承和/或协议的情况下 例如,我有某种协议: @protocol DataReceiver <NSObject> - (void)handleNewData:(id)data; @end 命名一个方法的最好方法总是试图准确地描述(小心过于冗长)该方法的功能。如果两个方法的功能完全相同,那么最好将该功能提取到一个自包含类中 在iOS中,通常会遵循约定来命名委托方法,如您以以下形式显示的方法: -(void)dataSour
@protocol DataReceiver <NSObject>
- (void)handleNewData:(id)data;
@end
命名一个方法的最好方法总是试图准确地描述(小心过于冗长)该方法的功能。如果两个方法的功能完全相同,那么最好将该功能提取到一个自包含类中 在iOS中,通常会遵循约定来命名委托方法,如您以以下形式显示的方法:
-(void)dataSource:(DataSource*)dataSource didReceiveNewData:(id)data {
//Call your "child" object here
[self.myChild doAWithData:data];
}
其中,dataSource
是调用委托方法的对象
在我看来,您遇到这个问题是因为您没有通过使用“handle”数据准确地描述方法的实际功能
也许标准的一个好来源是。因为
OwnerOfAllThings
只是在子级中调用方法,我可能倾向于保留相同的方法名称,甚至可能让SomeOwnedModel
符合相同的协议。如果您使用“使用唯一名称”模式,我只能想象如果您有三到四个级别的类,或者如果您的协议中有大量的方法,被迫为每个类提供任意唯一的名称,那么它会变得多么笨拙
例如,我有一个基于nsursession
的框架,用于nsursession
,它有一个会话管理器对象(一个用于nsursession
的包装器)和一组单独的NSOperation
类(一个用于下载任务,一个用于数据任务等)。在这种情况下,NSURLSession
不仅符合NSURLSessionDelegate
,还符合NSURLSessionTaskDelegate
,NSURLSessionDataDelegate
等(因为这就是NSURLSession
的工作原理)。但是,当此会话管理器接收到其中一个与任务相关的委托调用时,它只是将事件路由到适当的操作对象。因此,为了明确这一点,我让各种操作对象符合适当的协议(例如,下载操作符合nsurlsessiondownloaddedelegate
,数据操作符合NSURLSessionDataDelegate
,等等)。最终的结果是,尽管有令人眼花缭乱的类和协议集合,但其意图是明确的
所以,归根结底,如果家长只是简单地将事件路由到适当的孩子,并且除此之外不提供任何实质性贡献,我倾向于使用相同的方法(可能是相同的协议)。但是如果父类在功能上提供了比子类更丰富/不同的内容,那么一个唯一的名称可能是合适的
另一方面,在提出方法名称时,我可能建议使用一个方法名称来区分“我收到了一些数据,可能会有更多数据”(即
didceive…
)和“我收到了所有数据”(即didComplete…
)。这是Apple在NSURLConnection
和NSURLSession
中使用的非正式约定,遵循此约定可能有助于明确您的意图。感谢您的提示。都是好的。我不能使SomeOwnedModel
符合相同的协议,因为协议中实际上还有其他方法不适用于它——但是你认为创建某种协议继承树来抽象出共享方法怎么样?i、 例如,@protocol-DataHandler
,然后是@protocol-DataReceiver
和@protocol-DataResponder
(或一些不太含糊但类似含蓄的东西)确定。或者,您可以为子事件使用一个协议,为父唯一事件使用一个协议,然后让父级同时遵守这两个协议(如NSURLSession
does),但子级只遵守子特定的协议。使用任何你认为对你的情况最不含糊的方法。好的观点,精确的描述是有帮助的。在这种情况下,处理的实现在SomeOwnedModel
的子类之间有所不同,因此方向的选项有限,但最好记住这一点。
@implementation OwnerOfAllThings
- (void)handleNewData:(id)data {
//Option 1:
[self.myChild handleNewData:data]; //OR...
//Option 2:
[self.myChild ownerReceivedNewData:data]; //or whatever else
}
@end
-(void)dataSource:(DataSource*)dataSource didReceiveNewData:(id)data {
//Call your "child" object here
[self.myChild doAWithData:data];
}