在Clean Code一书中,作者建议将大的方法分解成小的函数,这些小的函数做一件特定的事情。在像Java这样的语言中,这可以转换成漂亮的、可读的代码。
public static String renderPage(PageData pageData)
{
includeHeader(pageData);
includeContent(pageData);
includeFooter(pageData);
return pageData.getHtml();
}然而,在Objective-C中,据我所知,实现这样的函数的唯一方法是创建私有方法,并通过消息self调用它们
- (NSString *)renderPageWithData:(PageData *)pageData {
[self includeHeader:pageData];
[self includeContent:pageData];
[self includeFooter:pageData];
return [pageData HTML];
}我觉得消息传递self暗示了对象对自身所做的某种操作。C函数实际上不是一个选项,因为它们不属于类的作用域。这意味着我不能访问任何实例变量或类对象,除非做额外的跑腿工作,并增加复杂性。
我正在寻找一种在Objective-C中创建关于函数或方法的干净代码的好方法
发布于 2010-08-04 02:26:57
我明白您关于函数调用的观点:同一“句子”中的self和include使其看起来像是包含在类本身中。我会用更明确的方法名来解决这个问题:
- (NSString *)renderPageWithData:(PageData *)pageData {
[self renderHeaderWithData:pageData];
[self renderContentWithData:pageData];
[self renderFooterWithData:pageData];
return [pageData HTML];
}发布于 2010-08-04 02:15:45
您发布的两个代码块之间没有区别。它看起来不同的唯一原因是在java中,当你在没有指定对象的情况下进行函数调用时,this.是隐式的。
编辑:我刚刚注意到你的java方法是静态的。如果你想让它们保持静态方法,那么你只需要使用[MyCLass ...]而不是[self ...]。
发布于 2010-08-04 02:08:24
我不确定您所说的“它们不属于类的作用域”是什么意思;在我看来,不需要获取对象成员属性的本地C函数似乎是一个很好的解决方案。但我也不认为私有方法有什么特别的问题。
就我个人而言,我会在这里使用C函数。
编辑:如果重构后的函数需要访问对象状态--这意味着你会将self作为参数传递--那么我就把它作为一个方法来传递。它们之间的差别很小
[self includeHeader:pageData];和
includeHeader(self, pageData);即使从美观的角度来看,这两种选择都有点令人反感,但与具有执行多个不同工作的长函数相比,它们在可读性及其近亲可维护性方面都有巨大的改进。
https://stackoverflow.com/questions/3399332
复制相似问题