在编写小函数时避免使用意大利面条代码

时间:2013-08-21 18:56:51

标签: function coding-style refactoring abstraction

我对“意大利面条代码”的理解是一个代码库,它从一个代码块跳转到另一个代码块,没有逻辑和清晰的目的。最常见的罪犯似乎是GOTO声明。

我目前正在阅读/参考清洁代码:敏捷软件工艺手册的功能章节。虽然自己承认,作者对功能的大小非常严格。我理解保持功能小的想法,然而,他建议它们应该在5行左右。虽然Classes肯定变得更易读,但我害怕通过编写较小的函数来创建意大利面条代码。较小的函数似乎也无意中创建了更高的抽象。

代码在什么时候成为意大利面条代码? 太抽象抽象的抽象程度如何?任何答案都会非常有用。

顺便说一句,我是Stack Overflow的长期追随者,虽然这是我第一次发帖提问,所以对我的帖子的任何建议也是受欢迎的。

非常感谢!

3 个答案:

答案 0 :(得分:5)

正如评论中所说,没有绝对的规则。最后,您应该以提高代码的可读性为目标。但这并不是关于你的方法的长度。罗伯特马丁建议根据抽象程度对方法进行排序。抽象方法应该是你班级的顶层,方法越多,它应该越深。

另一个重要方面是方法名称。应该选择它以便明确该方法的作用!如果您明智地选择方法名称,则几乎不需要注释。例如,考虑一个if语句:

if(isValidAge(value)) {
   ...
}

更具可读性
if(value > 10 && value < 99) {
   ...
}

因为声明的意图变得更加清晰。因为你可以在第二个例子中添加评论。但是评论经常变得过时(罗伯特·马丁的书中还有一章关于这一点)。我认为,这种编程方式导致了许多简短的方法。

很难选择合适的抽象级别。根据我的预测,从较低的抽象级别开始更容易。所以我可以先集中精力解决问题。当我以后需要更多抽象时,我仍然可以重构代码。 TDD很有帮助!

希望,这有助于......

答案 1 :(得分:2)

我同意这里的评论和答案。从实际的角度来看,罗伯特·马丁在他的书中所写的思想每次都是非常好的方向,我试图尽可能地接近这个“规则”,事实上,5行方法大多不是坏事。

在我看来,避免意大利面条代码的最佳方法是编写具有高Cohesion的(小)类。缺点是你成为了一大堆课程,这使得新员工有时候更难进入项目。

答案 2 :(得分:1)

  

我理解保持功能较小的想法,但是,他建议它们应该在5行左右。

这听起来很理想:)

  

虽然Classes肯定变得更清晰,但我害怕通过编写较小的函数来创建意大利面条代码。

Spaghetti代码是由代码从一个地方跳到另一个地方引起的(在同一个函数中具有不同的抽象级别 - 低级IO代码和高级应用程序逻辑)。如果您提取小函数,您的结果将远离意大利面条代码,而不是更接近)。

  

代码在什么时候成为意大利面条代码?

当代码强迫你(程序员)从一行到另一行进行心理跳跃(切换上下文)时,代码是意大利面条代码。无论您是否使用GOTO都是如此(但GOTO可能会使问题更严重)。