6

使用块在方法中定义私有方法而不是使用真正的私有方法有什么缺点?除了不能从其他地方调用该方法之外,还有什么?

例子:

-(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;
}
4

3 回答 3

6

我认为最大的3个缺点是:

  1. 正如您所提到的,该块不可重复使用。
  2. 该块是不可测试的——您不能编写一个单元测试来验证该块是否按照您的想法执行。
  3. 代码可读性较差。在阅读这个方法的时候,重要的是序列化了一系列的东西,而不是序列化是如何实现的细节。

将此块移动到方法中将解决所有这些问题。如果某个将块回调作为参数的 API 使用了该块,则您始终可以从方法返回该块

于 2012-06-12T16:34:24.960 回答
1

可以说,导航代码更难 - 您往往会将入口点隐藏在某些函数的中间,而且在调试器中看不到或搜索函数名称,这会使调试和跟踪变得更加困难。

于 2012-06-11T18:35:42.830 回答
1

代码的清晰性很重要。

方法允许您将整个代码段彼此分开封装,并使其更易于阅读。

选择私有方法而不是块的另一个原因是内存管理。这是一个在这里讨论的话题,但足以说明块在内存管理中很奇怪,并且在这方面不像任何其他代码结构。

于 2012-06-11T18:36:43.320 回答