Objective-C的方法开销是否不建议采用“许多小方法”设计方法?


15

我通常喜欢使用小方法,这是Bob Martin在Clean Code中所建议的。我对Objective-C的内部知识也已经读够了,至少对它的消息分发如何工作有一些了解(bbums系列对此特别有用)。

尽管有过早的优化问题,但我想知道,Objective-c使用objc_msgSend所做的所有工作,实际上是否足够重要,以至于“许多小方法”方法对于Objective-C项目而言是不可取的。

经验发现尤其值得欢迎(也许我有时会自己进行测试)。任何编写过大型Objective-C项目的人的经验也将很棒。

澄清度

这个问题的总体语气是故意的。我不是在问特定应用程序的性能调优(这就是为什么我在这里而不是在SO上问的原因),而是更多关于Objective-C的语言特性是否会阻碍某种设计方法。我观察到我从Apple和其他各方(在github等上)看到的许多代码都倾向于大型方法(和类),并且我想知道这是否由于语言而逐渐消失了本身。当然,我可能读错了代码,或者可能是文化因素而不是技术因素导致了这种趋势(如果存在)。

(对于它的价值,我目前正在编写Objective-C,并且正在使用小的方法)

进一步要求

我同意已经给出的两个答案。我想做的另一件事是让某人指向我(希望是实质性的)开源(或其他可见的)Objective-C代码库,该代码库使用了不错的简短方法(和小型类)。我尚未在Objective-C中看到任何东西可与(例如)fitnesse来源进行比较。


1
Mike Ash有一些不错的帖子,显示了LeopardiOS的编号。我还没有完全消化这些内容,但是对于缓存的IMP来说,开销可以忽略不计,即使在需要搜索的分派中,其开销也很小。如果这种快速印象是正确的,则似乎小的方法可能与其他语言一样在ObjC中立足或落在相同的设计基础上。
Cris

1
如果要避免这种开销,请使用C函数。
2011年

从技术上讲是可行的,但功能上有很多遗失。我只会用针对目标,对性能敏感的代码部分的函数替换方法。我在这里问有关开销是否足以重新考虑首选的编码/设计风格的问题。
克里斯,

有关一些好的答案,请参见SO上的Objective-C中的消息分发成本
Caleb,

为什么不简单地在Xcode中分析代码?我知道您是在抽象地询问,而不是在询问特定的代码,但是既然您显然拥有一些带有许多小方法的代码,为什么不运行它并自己看看呢?
Caleb

Answers:


4

我真的不知道开销是否可以忽略不计。但是,我宁愿设计一个系统是易于理解和维护的 第一,这通常意味着小,专注的方法和类。这甚至也将有助于后续的代码调整(只是因为代码更易于维护)。同样,对代码进行概要分析以找到真正的瓶颈也很重要,这甚至可能与方法调用开销无关。如果您执行任何进程外操作(例如,对数据库,网络,文件系统的调用),则无论如何,这些操作往往会主导程序的运行时。

但是,像往常一样,您的里程可能会有所不同...


我当然同意所有这一切(请参阅问题中的“鲍勃叔叔”参考文献)。但是,如果一种语言通常不适合某种最佳情况的设计方法,那么程序员可能会做出其他选择。我没有看到真正遵循小型方法(和类,就此而言的方法)的很多Objective-C代码,并且想知道为什么。我将在问题中添加注释。
Cris

@Cris:“我没有看到很多真正遵循小型方法的Objective-C代码”->很好奇:您从哪个代码体得出了这样的结论?我相信这一点,但我也相信,这并不是因为对微优化的意识,而是更多的程序员没有将重点放在良好设计和可维护性的宗旨上。换句话说,他们的Java,C#,Ruby或任何代码都必须遵循相同的惯例……
–Jordão

是的,这很有可能。我没有任何特定的代码库。这就是我过去一年左右的工作经验,因此我一直在使用Objective-C。我看过的最大的代码集是Omni组的开放源代码,而IIRC具有很多大方法。苹果公司的示例代码也经常这样做。但是当然(a)示例代码就是这样,并且(b)我的示例可能偏重于UI代码(尤其是视图控制器),并且这些代码的编码方式可能与更深层不同。
Cris

2

绝大多数代码在任何应用程序中都不会对性能至关重要,因此,即使与其他语言相比,该方法的开销很大,最佳方法仍然是在大多数地方使用许多小型方法,并且仅内联那些进行概要分析的方法。已证明对性能至关重要。

当然,有许多人不知道如何正确地进行优化,其中有些人可能知道方法的开销并参与了全局过早的优化,但是我不认为该小组足够大而不会产生重大影响在Objective-C生态系统上。

大方法和类更有可能成为大集团的,谁知道或约廓线仪,方法开销护理什么人的工作适当的设计,谁往往会产生大泥球任何语言。是的,其中一些人确实在大型软件公司中使用高级代码库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.