最佳实践样式 - 具有委托和所有权的方法名称

时间:2014-07-23 15:39:05

标签: objective-c coding-style

跨类使用同名方法是一种好习惯还是坏习惯,特别是在涉及继承和/或协议的情况下?

例如,我有某种协议:

@protocol DataReceiver <NSObject>

- (void)handleNewData:(id)data;

@end

我有一个控制器类,拥有一些东西,比如

@interface OwnerOfAllThings <DataReceiver>

//this child does NOT conform to DataReceiver
@property (nonatomic, strong) SomeOwnedModel myChild;

@end

但是孩子是不透明的,所以我对-handleNewData:的实现基本上只是一个传递,并调用一个负责实际处理的子方法。所以我的问题是,尽管它在功能上并没有那么不同,但在SomeOwnedModel中放置一个同名的方法是不是一个坏主意,因为它可能与协议中的声明混淆了?或者它实际上应该完全相同,为了保持一致性?

即,哪个更好(假设SomeOwnedModel.h声明了适当的方法):

@implementation OwnerOfAllThings

- (void)handleNewData:(id)data {

    //Option 1:
    [self.myChild handleNewData:data]; //OR...

    //Option 2:
    [self.myChild ownerReceivedNewData:data]; //or whatever else

}

@end

2 个答案:

答案 0 :(得分:2)

由于OwnerOfAllThings只是调用子进程中的方法,我可能倾向于保留相同的方法名称,甚至可能SomeOwnedModel符合相同的协议。如果你使用“使用唯一名称”模式,我只能想象如果你有三个或四个级别的类,或者如果你的协议中有大量方法,被迫提出任意唯一的名称,它会变得多么笨拙为每个人。

举例来说,我基于NSOperation的{​​{1}}框架,带有会话管理器对象(NSURLSession的包装器),以及一堆个人NSURLSession类(一个用于下载任务,一个用于数据任务等)。在这种情况下,虽然NSOperation不仅符合NSURLSession,但它也符合NSURLSessionDelegateNSURLSessionTaskDelegate等等(因为这就是NSURLSessionDataDelegate的工作方式)。但是当此会话管理器收到这些与任务相关的委托调用之一时,它只是将事件路由到适当的操作对象。因此,为了清楚起见,我使各种操作对象符合适当的协议(例如,下载操作符合NSURLSession,数据操作符合NSURLSessionDownloadDelegate等)。最终的结果是,尽管有令人眼花缭乱的类和协议集合,但意图是明确的。

所以,最重要的是,如果父母只是简单地将事件路由到适当的孩子并且除此之外没有提供任何物质贡献,我倾向于使用相同的方法(可能是相同的协议)。但是,如果父类提供的东西在功能上比孩子的表现更丰富/不同,那么一个独特的名称可能是合适的。


顺便说一句,在提出你的方法名称时,我可能会建议一个方法名称来区分“我收到了一些数据,而且可能会有更多数据”(即NSURLSessionDataDelegate)与“我收到所有数据”数据“(didReceive...)。这是Apple在didComplete...NSURLConnection中使用的非正式惯例,遵循它可能有助于明确您的意图。

答案 1 :(得分:0)

命名方法的最佳方法是始终尝试准确描述(谨防过度冗长)方法的作用。如果您的方法完全相同,那么将该功能提取到自包含类可能是个好主意。

通常在iOS中遵循惯例来命名委托方法,例如您在以下表单中显示的方法:

-(void)dataSource:(DataSource*)dataSource didReceiveNewData:(id)data {
   //Call your "child" object here
   [self.myChild doAWithData:data];
}

其中dataSource是调用委托方法的对象。

在我看来,你遇到了这个问题,因为你没有通过使用“句柄”数据准确地描述方法的实际作用。

标准的良好来源可能是Apple's documentation