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];
}