2014-07-23 37 views
1

跨類使用同名命名方法(尤其是涉及繼承和/或協議的方法)是一種好的做法還是不好的做法?最佳實踐風格 - 包含代理和所有權的方法名稱

例如,我有某種形式的協議:

@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

既然OwnerOfAllThings只是調用孩子中的方法,我可能會傾向於保留相同的方法名稱,甚至有可能符合相同的協議。如果你使用「使用唯一名稱」模式,我只能想象如果你有三到四級的課程或者你的協議中有很多方法會變得很笨拙,被迫拿出任意唯一的名字爲每個。

舉例來說,我有NSURLSessionNSOperation基礎框架,會話管理對象(NSURLSession的包裝),和一堆個人NSOperation類(一個用於下載任務,一個是數據的任務,等) 。在這種情況下,NSURLSession不僅符合NSURLSessionDelegate,而且符合NSURLSessionTaskDelegateNSURLSessionDataDelegate等(因爲NSURLSession的工作原理是這樣的)。但是,當這個會話管理器收到這些任務相關的委託調用之一時,它只是將該事件路由到適當的操作對象。爲了清楚起見,我使各種操作對象符合適當的協議(例如,下載操作符合NSURLSessionDownloadDelegate,數據操作符合NSURLSessionDataDelegate等)。最終的結果是,儘管類和協議的集合令人眼花繚亂,但意圖是毫不含糊的。因此,底線,如果家長只是簡單地將事件路由到合適的孩子,並且沒有提供任何材料,那麼我傾向於使用相同的方法(也可能是相同的協議)。但是,如果父母課程提供了實質性更豐富/不同功能的東西,那麼孩子正在表現什麼,那麼一個獨特的名字可能是合適的。


順便說一句,你的方法名上來的時候,我可能會建議區分「我收到了一下數據,更可能是未來的」(即didReceive...)與「我收到的所有方法名的數據「(即didComplete...)。這是蘋果公司在NSURLConnectionNSURLSession中使用的非正式會議,下面的內容可能有助於明確您的意圖。

+0

感謝您的注意。所有的好點。我不能讓'SomeOwnedModel'符合相同的協議,因爲協議中實際上有其他方法不適用於它 - 但是您怎麼看待創建某種協議 - 繼承樹來抽象掉共享方法?即'@protocol DataHandler ',然後'@protocol DataReceiver '和'@protocol DataResponder '(或者更不明確但含義相同的東西) – Quintana

+0

當然。或者你可以有一個用於子事件的協議,一個用於父親特有的事件,然後讓父對象同時符合(比如'NSURLSession'),但是子只符合特定於兒童的協議。使用任何你認爲對你的情況最不明確的方法。 – Rob

0

來命名的方法,最好的辦法就是始終設法準確地描述(提防過度冗長的)什麼方法確實。如果你的兩個方法完全一樣,那麼將這個功能提取到一個獨立的類可能是一個好主意。

通常的慣例是遵循iOS的命名委託方法就像你在下面的表格所示:

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

哪裏dataSource是調用委託方法的對象。

在我看來,你遇到了這個問題,因爲你沒有通過使用「句柄」數據準確地描述該方法實際做了什麼。

也許標準的好來源是Apple's documentation

+0

好點,準確的描述是有幫助的。在這種情況下,處理的實現在「SomeOwnedModel」的子類之間有所不同,所以方向的選項有限,但應該記住。 – Quintana