2012-06-11 80 views
6

使用塊在方法中定義私有方法而不是使用真正的私有方法有什麼缺點?除了無法從其他地方調用方法之外,還有什麼區別嗎?塊vs私人方法?

例子:

-(NSDictionary*)serialize 
{ 
    NSMutableDictionary* serialization = [NSMutableDictionary dictionary]; 

    TwoArgumentsBlockType serializeItemBlock = ^void(MyItemClass* item, NSString* identifier) 
    {  
     if (item) 
     { 
      // serialization code 
     } 
    }; 

    serializeItemBlock(self.someItem1, kSomeIdentifier1); 
    serializeItemBlock(self.someItem2, kSomeIdentifier2); 
    serializeItemBlock(self.someItem3, kSomeIdentifier3); 
    serializeItemBlock(self.someItem4, kSomeIdentifier4); 
    serializeItemBlock(self.someItem5, kSomeIdentifier5); 
    serializeItemBlock(self.someItem6, kSomeIdentifier6); 
    serializeItemBlock(self.someItem7, kSomeIdentifier7); 
    serializeItemBlock(self.someItem8, kSomeIdentifier8); 
    serializeItemBlock(self.someItem9, kSomeIdentifier9); 
    serializeItemBlock(self.someItem10, kSomeIdentifier10); 
    serializeItemBlock(self.someItem11, kSomeIdentifier11); 

    return serialization; 
} 
+0

這是一個很好的問題,它讓我用我的eXpeRience與blocKs思考不同的LY。此評論區分大小寫;)P – Lio

回答

1

代碼的清晰度很重要。

方法允許你從彼此分開封裝的整段代碼,並且可以更容易閱讀..

另一個原因選擇了塊私有方法是內存管理。這在這裏討論的主題非常重要,但足以說在內存管理中塊是奇怪的,並且不像其他代碼結構那樣起作用。

+0

我仍然不確定可讀性。上面的代碼的缺點是比單獨聲明方法的時間更長,但另一方面,在我看來,這是一種給方法一個範圍的好方法 - 因爲當時它並不意味着要被使用來自代碼中的其他位置。 – diegoreymendez

+0

在任何情況下,我明白這可能是人們決定避免這種做法的最重要原因。感謝你的回答。 – diegoreymendez

1

可以說,它很難導航代碼 - 你往往有入口點埋在一些函數中相當含糊,而且也沒有,你可以在調試器或搜索看到函數名因爲它可以使調試和跟蹤更加困難。

6

我覺得3個最大的缺點是:

  1. 塊是不可重用的,因爲你提到。
  2. 該塊不可測試 - 您無法編寫單元測試來驗證塊是否執行了您認爲的功能。
  3. 該代碼可讀性較差。當你閱讀這個方法時,重要的是一系列的東西是序列化的,而不是序列化如何實現的細節。

將此塊移入方法將解決所有這些問題。如果該塊被某個以回調塊作爲參數的API使用,則始終可以使用return the block from a method

+0

我相信部分問題與我最初的問題是,它的答案是:「這取決於你需要什麼」。例如:使塊變得如此有趣的部分原因是,它們允許開發人員在真正有意義的地方編寫內聯方法 - 例如在需要執行真正不屬於其他任何地方的代碼的地方,以及可讀性如果您使用外部方法,則會受到影響 – diegoreymendez