块与私有方法之间的区别?

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

这是一个很好的问题,它让我运用我的块编程经验以不同的方式思考。这条评论是大小写敏感的 ;) - Lio
3个回答

6
我认为三个最大的缺点是:
  1. 块不可重用,正如您所提到的。
  2. 块无法测试--您无法编写单元测试来验证该块执行的操作。
  3. 代码可读性差。当您阅读此方法时,重要的是一系列事物被序列化,而不是序列化是如何实现的细节。
将此块移入一个方法中将解决所有这些问题。如果某些API使用块回调作为参数,则可以始终从一个方法中返回块。 (点击此处查看例子)

我认为我最初提出的问题的部分问题在于它的答案是:“这取决于你的需求”。例如:块的一部分有趣之处在于它们允许开发人员编写内联方法,这在真正有意义的地方非常重要-例如在需要执行不属于任何其他地方的代码以及在使用外部方法会影响可读性的地方。 - diegoreymendez

1

可以说,在代码中导航更加困难 - 你往往会发现入口点深藏在某个函数的中间,而且在调试器中看不到函数名或搜索函数名也无法找到,这可能会使得调试和跟踪变得更加困难。


1

代码的清晰度很重要。

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

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


我仍然不确定可读性。上面的代码有一个缺点,就是比起将方法单独声明,它更长。但另一方面,它似乎是为了给方法一个范围而采取的一个好方法——因为在此时,它并不打算从代码中的其他位置使用。 - diegoreymendez
无论如何,我理解这可能是人们决定避免采用这种方法的最重要原因。谢谢回答。 - diegoreymendez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接