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

Function 编写小函数时避免使用意大利面代码,function,coding-style,refactoring,abstraction,Function,Coding Style,Refactoring,Abstraction,我对“意大利面代码”的理解是一个代码库,它从一个代码块跳到另一个代码块,没有逻辑和清晰的目的。最常见的罪犯似乎是GOTO陈述 我目前正在阅读/参考《清洁代码:敏捷软件工艺手册》的功能章节。作者虽然自己承认,但对函数的大小非常严格。我理解保持函数小的想法,但是,他建议它们应该在5行左右。虽然类肯定会变得更清晰,但我害怕通过编写更小的函数来创建意大利面代码。较小的函数似乎也在无意中创建了更高的抽象 什么时候代码会变成意大利面代码?怎么抽象就太抽象了?任何答案都会大有帮助 顺便说一句,我是Stack

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

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

什么时候代码会变成意大利面代码?怎么抽象就太抽象了?任何答案都会大有帮助

顺便说一句,我是Stack Overflow的长期追随者,虽然这是我第一次发布问题,所以任何关于我的帖子的建议都是欢迎的


非常感谢

正如评论中所说,没有绝对的规则。最后,您应该力求代码具有良好的可读性。但这并不是所有方法的长度。Robert Martin建议根据抽象程度对方法进行排序。Abstract方法应该位于类的顶部,方法越多,它应该位于越深的位置

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

if(isValidAge(value)) {
   ...
}
它的可读性比

if(value > 10 && value < 99) {
   ...
}
if(值>10&&value<99){
...
}
因为声明的意图变得更加清晰。当然,您可以在第二个示例中添加注释。但评论往往会过时(罗伯特·马丁的书中有一章是关于这一点的)。我认为,这种编程风格导致了许多简短的方法

很难选择正确的抽象级别。根据我的经验,从低层次的抽象开始比较容易。所以我可以先集中精力把问题解决好。当我以后需要更多抽象时,我仍然可以重构代码。TDD帮助很大


希望,这有助于…

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

在我看来,避免编写意大利面代码的最好方法是编写(小)类,并使用高优先级。缺点是你变成了一大堆的班级,这使得新员工加入项目有时有点困难

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

这听起来很理想:)

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

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

什么时候代码会变成意大利面代码


当代码迫使您(程序员)从一行到另一行进行思维跳跃(切换上下文)时,代码就是意大利面代码。无论您是否使用GOTOs,这都是正确的(但GOTOs会使问题变得更糟)。

这可能会更好地用于程序员交换,而不是堆栈。我会投你赞成票,尽管你马上就要被否决了。作者给了你一条经验法则。然而,没有硬性规定。您可能正在处理一个需要5行以上的算法。但是,当您看到自己在重复代码或无法重用现有功能时,是时候进行重构,并可能将一些功能拆分了。@AMR感谢您的支持投票。在看过程序员交换后,我必须同意你的看法。这绝对是一个概念性的问题。“我很抱歉没有事先弄清楚区别。”塔里克,谢谢你的回复。当我翻阅这类书籍时,“没有硬性规定”对我来说很快变得显而易见。谢谢你的建议,我会记住重用和重复。在生活中,你总是在权衡。您可以考虑重用来设计应用程序,并创建一个复杂的API,以确保无论发生什么情况,都可以轻松地插入下一种情况。这需要更多的时间来设计和实现。很难让你的经理相信你正在工作,但却不能快速交付简单的应用程序。在另一个极端,您编写了一段完整的代码,它完成了任务,但很难更改。你的经理很高兴,你很快就把那块软件拿出来了。然而,当需要修改它或添加功能时,它变得越来越难。强烈同意最后一段!霍普特曼,谢谢你的回答。我同意@Tarik的观点,你的最后一段确实阐述了如何使用不同层次的抽象。我目前的大多数项目只有低级抽象,你帮助我提高了我的抽象。特别是你提到的TDD。完全同意你的意见。你认为我如何在抽象时避免被诅咒的意大利面代码?首先,每个类应该只有一个责任。具有许多职责的类迫使读者经常切换上下文(看看@utnapistim的答案)。第二,尽量保持公共接口和依赖项的数量较小。这意味着,您应该使用私有方法。因此,从外部的角度来看,你的课程很容易理解。我觉得这就像是一堆柴火