陈军审稿人|梁策孙淑娟众所周知,干净的代码不仅能让读者更容易理解程序的意图,也便于维护和迭代。一般来说,它可以给软件开发和升级带来以下好处:花在维护上的时间更少。干净的代码更容易阅读和理解,你可以花更少的时间弄清楚实际问题的来龙去脉,留出更多时间来修复、修改和扩展。更清楚地传达想法。程序开发需要协作。干净的代码往往会减少项目成员之间可能产生的误解。从长远来看,这也意味着更少的错误和更快的问题解决。然而,俗话说“说起来容易做起来难”,在某种程度上,编写干净的代码就像学习绘画、烹饪或摄影——看起来容易,但实践起来却更难。下面,我将与您讨论编写良好且干净的代码的10大技巧。1.使用描述性名称程序中的变量、类和函数经常被其他程序员调用,是应用程序底层逻辑之间的接口。因此,当您为变量、类和函数使用模棱两可和非描述性的名称时,实际上是在扰乱阅读代码的任何人(包括开发人员本人)对应用程序逻辑的理解。例如:您能一眼看出名为dxy的变量的实际含义吗?据推测,您必须阅读整个代码块才能“逆向工程”其含义。但是,对于distanceBetweenXY这个变量,你我马上就能明白它代表什么。类和函数也是如此。尽可能避免使用CalcTan(),并根据需要使用CalculateTangent()或CalcTangentAngle()。总之,使代码看起来干净的基本技术之一是使用描述性名称。2.让每个类/函数都有实际意义你一定见过那些几百行甚至几千行的函数吧?想必你在浏览、理解、甚至编辑时都会感到无比痛苦。即使字里行间有相应的评论,实际效果往往也是“九牛一毛”。干净的代码不是。它们被分解成具有不同目的的代码块。其中,每个子功能被设置为完成一个特定的任务,每个类也代表一个特定的概念。由此产生的简单性更适合局部调整,也更适合问题定位和故障排除。例如,在实践中,必须将GetCreditScore()等复杂函数分解为GetCreditReports()、ApplyCreditHistoryAge()和FilterOutstandingMarks()等多个辅助函数。可以参考文章《??每个程序员都应该知道的基本编程原则??》了解更多相关实践。3.删除不需要的代码。不知道大家有没有过这样的经历:在修复或者优化某段代码的过程中,故意把它注释掉,然后开始在它下面重写新的代码。而且,您这样做的目的纯粹是为了保留旧代码以备不时之需。但是,随着时间的推移,您可能会不知不觉地积累大量不再需要的注释掉的代码块。这些代码块无疑会使您的源代码变得混乱。而且实际情况多半是因为周围的相关代码及其环境都已经迭代了,所以这些被注释掉的代码其实是不可能恢复的。当然,这种注释掉旧代码的做法完全可以被当今流行的源代码控制系统所取代。您可以使用Git或Mercurial等工具及时、准确和自动化地自动化源代码管理。同时,为了让应用服务变得可移植和敏捷,也可以有意识地使用现成的Web框架,避免“重新发明轮子”,然后利用框架提供的类库来简化自己的代码。这个可以参考文章《??一些值得开发人员学习的Web框架??》。4.可读性大多数程序员会将“干净的代码”与“聪明的代码”混淆,简单地认为“将十行代码压缩成一行以减少对屏幕空间的占用”,那就是干净的代码。其实很多时候,这样的代码并不一定真的很容易看懂。在我看来,这种解决一些专业问题的代码属于“聪明代码”的范畴。程序员可以把它当作自己的绝招。它们经常被用来证明一个人的编程能力,甚至被用来炫耀。至于编写干净的代码,你应该保持开放的心态:代码量并不是衡量代码是否干净的唯一标准。除了实现代码的功能之外,您的代码还需要保持一定程度的可读性。毕竟,下次您阅读该代码片段时很可能就是您自己。毕竟,没有人愿意为自己的未来挖坑。5.保持一致的编程风格每个程序员都有自己的编程风格。在这里,我不想推荐或强迫大家遵循一种所谓的最佳编程风格。如果您习惯于在行之间使用大括号,如果您希望在方法调用之前有空格,如果您更喜欢制表符而不是空格,那很好。只要保持这种用法一致即可。此外,如果您要使用camelCaseNaming作为变量,请不要将它与underscore_naming混淆;如果您在某处使用GetThisObject(),请不要在其他地方使用FetchThatObject()。另外,Python、C#等编程语言有各种样式规范需要遵循,包括:绝不允许混用制表符和空格。6.选择合适的架构你可以使用各种现成的范例和架构来创建不同的项目。当然,前提是请选择最合适的,而不是所谓的最好的。例如,模型-视图-控制器(MVC)模式一直是Web开发中最流行的架构。毕竟,它不仅可以帮助您保持代码结构清晰合理,还可以最大程度地减少后期维护工作量。同样,实体-组件-系统(ECS)模式在游戏开发领域非常流行。毕竟,它有助于模块化游戏数据和逻辑,使维护更容易并生成更具可读性的代码。7、掌握语言中的习语我们所熟悉的Python、Java、JavaScript等不同的语言,其编程思想和习惯是不同的。它们之间的差异可以是巨大的,也可以是细微的。例如:Python代码将完全依赖compactcode和ducktyping(ducktyping,基于“Abirdcanbecalledaduckwhenitwalkslikeaduck,swimlikeaduck,andquackinglikeaduck”的逻辑。对象,我们不必关心对象是什么类型,只要关心它的动态行为即可。);而Java更倾向于冗长清晰的代码。同时,每种语言都鼓励使用自己的习惯用法,例如Python中的列表推导式。同时,我们也要警惕所谓的“反模式”。尽管前人为解决某些软件开发特定问题而积累的那些模型将造福后代;但如果它们是仅对特定需求有效的狭窄模型,则应避免并继续使用。8、学高手写的代码俗话说“向榜样学习”,要想写出干净的代码,那么首先要知道干净的代码应该是什么样子。一些大师级别的前辈的编程作品可以起到很好的示范作用,学习背后的编程思想、逻辑和编码习惯。显然,你不能随便走进微软总部去“窃取”他们的项目,而是可以通过Github文件代码上的各种演示项目,随时浏览典型的行业应用和各种开源项目的源码。毕竟这也是开源项目的初衷之一:让更多的人从中学习编程。通过这种社区互助,你的代码质量会得到快速提升。9.写好评论“附加评论”是编程世界中最古老的建议之一。但在实际编程中,一旦建议新手程序员尽量留下注释,他们就会百听不厌。当然,那些不必要的描述,甚至过多的泄露敏感信息的注释,也可能会适得其反。我们如何正确地停在那里?我的经验法则之一是注释用于解释为什么需要代码,而不是解释代码实际做什么。如果您的代码足够干净,这是不言自明的。例如:虽然我们可以使用注释来解释警告“删除它会破坏A、B和C”,但在大多数情况下,我们应该使用注释来揭示诸如:“使用此参数是因为X、Y和Z”和之类的,读者无法从代码中立即掌握。10.重构正如编辑是写作过程的一部分一样,重构也应该是编程过程的一部分。事实上,重构可以帮助优化代码而不影响其实际行为。同时,重构也有利于提高代码维护的效率。我对此的经验是:“不要只是注释掉让你觉得它很乱或不够好的代码,重写它。”毕竟随着时间和经验的积累,你在review或者维护整个软件项目的过程中,总能发现一些第一次不尽如人意,值得重构的代码。总结正如我们学习如何编写简洁的解释一样,干净的代码本身并没有绝对正确的参考标准。我希望上面讨论的十个技巧能为您提供有用的参考,避免编写冗长而臃肿的代码。译者介绍51CTO社区编辑JulianChen。他在实施IT项目方面拥有超过十年的经验。善于控制内外部资源和风险。专注传播网络与信息安全知识与经验;翻译等形式分享前沿技术和新知识;经常在线上和线下开展信息安全培训和讲座。原标题:10TipsforWritingCleaner&BetterCode,作者:JOELLEE
