首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Objective-C中进行函数提取以创建干净代码的好策略是什么?

在Objective-C中进行函数提取以创建干净代码的好策略是什么?
EN

Stack Overflow用户
提问于 2010-08-04 02:02:40
回答 4查看 192关注 0票数 2

Clean Code一书中,作者建议将大的方法分解成小的函数,这些小的函数做一件特定的事情。在像Java这样的语言中,这可以转换成漂亮的、可读的代码。

代码语言:javascript
复制
public static String renderPage(PageData pageData)
{
    includeHeader(pageData);
    includeContent(pageData);
    includeFooter(pageData);
    return pageData.getHtml();
}

然而,在Objective-C中,据我所知,实现这样的函数的唯一方法是创建私有方法,并通过消息self调用它们

代码语言:javascript
复制
- (NSString *)renderPageWithData:(PageData *)pageData {
    [self includeHeader:pageData];
    [self includeContent:pageData];
    [self includeFooter:pageData];
    return [pageData HTML];
}

我觉得消息传递self暗示了对象对自身所做的某种操作。C函数实际上不是一个选项,因为它们不属于类的作用域。这意味着我不能访问任何实例变量或类对象,除非做额外的跑腿工作,并增加复杂性。

我正在寻找一种在Objective-C中创建关于函数或方法的干净代码的好方法

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-04 02:26:57

我明白您关于函数调用的观点:同一“句子”中的selfinclude使其看起来像是包含在类本身中。我会用更明确的方法名来解决这个问题:

代码语言:javascript
复制
- (NSString *)renderPageWithData:(PageData *)pageData {
    [self renderHeaderWithData:pageData];
    [self renderContentWithData:pageData];
    [self renderFooterWithData:pageData];
    return [pageData HTML];
}
票数 2
EN

Stack Overflow用户

发布于 2010-08-04 02:15:45

您发布的两个代码块之间没有区别。它看起来不同的唯一原因是在java中,当你在没有指定对象的情况下进行函数调用时,this.是隐式的。

编辑:我刚刚注意到你的java方法是静态的。如果你想让它们保持静态方法,那么你只需要使用[MyCLass ...]而不是[self ...]

票数 3
EN

Stack Overflow用户

发布于 2010-08-04 02:08:24

我不确定您所说的“它们不属于类的作用域”是什么意思;在我看来,不需要获取对象成员属性的本地C函数似乎是一个很好的解决方案。但我也不认为私有方法有什么特别的问题。

就我个人而言,我会在这里使用C函数。

编辑:如果重构后的函数需要访问对象状态--这意味着你会将self作为参数传递--那么我就把它作为一个方法来传递。它们之间的差别很小

代码语言:javascript
复制
[self includeHeader:pageData];

代码语言:javascript
复制
includeHeader(self, pageData);

即使从美观的角度来看,这两种选择都有点令人反感,但与具有执行多个不同工作的长函数相比,它们在可读性及其近亲可维护性方面都有巨大的改进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3399332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档