毫无疑问,编程是很难的。学习语言和研究算法是一回事,但是尝试编写一个复杂的工作应用程序却又是另一回事,这并不需要您费劲。
在某种程度上,编写简洁的代码就像绘画,烹饪或摄影一样,看起来比实际要容易。那为什么要打扰呢?好吧,因为这样做的好处是值得的:
这是您可以开始编写简洁代码的方式。
1。使用描述性名称
什么是变量,类和函数?有很多方法可以解决这个问题,但是当您真正考虑它时,这些事情只不过是程序员和应用程序的基础逻辑之间的接口。
因此,当您使用不清楚和不明确的内容时,变量,类和函数的描述性名称,从本质上来说,您是在混淆任何读取代码的程序员的应用程序逻辑,包括您自己在内。
“我不是一个好人程序员;我只是一个有良好习惯的优秀程序员。"
-肯特·贝克
名为 dxy
的变量的实际含义是什么?谁知道。您可能必须阅读完整的代码块才能对其含义进行逆向工程。另一方面,像 distanceBetweenXY
这样的变量的含义可以立即识别。
类和函数也是如此。当您可以选择 CalculateTangent()
或 CalcTangentAngle()
时,请不要满足于 CalcTan()
。
2。给每个类/函数一个目的
您是否曾经窥过一个长达数百甚至数千行的函数?如果有的话,那么您就会知道浏览,理解和编辑会带来多大的痛苦。注释只能提供有限的帮助。
“编程将一个不可能完成的大任务分解为几个可能完成的小任务。"
— Jazzwant
干净的代码是分解成原子块。每个功能都应旨在做一件事情,每个类都应代表一个特定的概念。当然,这是一种简化,但是当有疑问时,更简单更干净。
在实践中,可能需要将诸如 GetCreditScore()
之类的复杂计算分解为多个辅助函数,例如 GetCreditReports()
, ApplyCreditHistoryAge()
和 FilterOutstandingMarks()
。
3。删除不必要的代码
这种不良习惯是我仍然不时遇到的一个习惯。通常情况是这样的:我想修复或优化一大段代码,所以我将其注释掉并在其下面进行重写-即使它可以工作,我还是保留旧代码以防万一。
“软件是否有可能与其他任何东西都不一样,应该被丢弃:整个目的就是始终将其视为肥皂泡沫?"
-Alan J. Perlis
随着时间的推移,我积累了很多不再需要的注释掉的代码块,但这些代码块却使我的源文件变得混乱。有趣的是,在很多情况下,周围的环境代码已经发展,因此注释掉的代码即使恢复也无法正常工作。
问题是,源代码控制已使注释掉“备份代码"的这种作法过时了。如果您不使用Git或Mercurial之类的软件,则需要立即开始使用源代码管理。清洁代码正等着您。
4。可读性>聪明
太多的程序员将“干净的代码"与“聪明的代码"混为一谈,好像将十行压缩成一条比较干净。当然,它占用的屏幕空间更少,但是实际上更容易理解吗?有时,也许。但是大多数时候?
“每个人都知道调试的难度是一开始编写程序的两倍。因此,如果您在编写代码时尽可能聪明,将如何调试它?"
-Brian W. Kernighan
我认为程序员喜欢聪明的代码,因为它感觉像是一个解决难题或谜语。他们找到了一种特殊而独特的方式来实现某些东西-如果可能的话,这是“捷径"-几乎可以看作是对程序员技能的验证。
但是要编写简洁的代码,您需要离开自我
总是为下一个要阅读的人优化代码,因为很有可能下一个人实际上就是你,没有什么比无法阅读或理解你的人更可耻的了自己的聪明。
5。保持一致的编码风格
我对优秀的编程教程一无所知,但缺点之一是,新手最终会养成各种各样的冲突习惯,尤其是与编码风格有关的冲突习惯。
我不是在这里声明一种风格比另一种更好。如果您想在自己的支架上放括号,那就去做吧。如果要在方法调用之前加空格,则可以。如果您喜欢制表符而不是空格,请不要让我说服您。
但是无论您做什么,都要保持一致!
美丽比丑陋好。
显式优于隐式。
简单优于复杂。
复杂胜于复杂。
平坦优于嵌套。
稀疏胜于稠密。
可读性计数。
— Tim Peters, Python的禅宗
如果您要对变量使用 camelCaseNaming
,请不要掺假使用 underscore_naming
。如果您在一处使用 GetThisObject()
,请不要在其他地方使用 FetchThatObject()
。而且,如果您混合使用制表符和空格,则应该将键盘取下。
从一开始就决定要做什么,并始终坚持下去。某些语言(例如Python和C#)具有您可能要遵循的全语言样式指南。
6。选择合适的体系结构
可以使用许多不同的范例和体系结构来创建项目。请注意,此技巧是关于为您的需求选择右键,而不是从中选择最佳。这里没有“最好的"。
“没有要求和设计,编程就是将错误添加到空文本文件的艺术。"
— Louis Srygley
例如,模型-视图-控制器(MVC)模式在Web开发中非常流行,因为它有助于以最小化维护工作的方式来组织和设计代码。
同样,实体组件-System(ECS)模式目前在游戏开发中非常流行,因为它有助于以一种易于维护的方式模块化游戏数据和逻辑,同时还能产生易于阅读的代码。
7。掌握语言的习语
掌握一种新的编程语言的困难之一是学习将其与所有其他语言区分开的细微差别。这些细微差别可能是丑陋,令人费解的代码与美观,易于维护的代码之间的区别。
请考虑使用Python,Java和JavaScript。它们彼此之间都极为不同,在某种程度上需要根据您选择使用的语言不同的思维方式。
“一种不“
— Alan J. Perlis
Python既涉及紧凑代码和鸭子类型,而Java更倾向于冗长和明确。每种语言都有鼓励使用某种编码方式的习惯用法(例如Python中的列表理解)。您会学得很好。
还有一些“反模式"值得担心,它们本质上是次优的设计模式,会导致效率低下,不可靠或其他不良代码。学习并取消学习与您选择的语言相关的所有常见反模式。
8。学习《大师密码》
如果您想编写简洁的代码,最好的办法就是查看简洁的代码的样子,并尝试理解为什么它是这样的-而且没有什么比这更好的了
很显然,您不能只是跳入Microsoft总部并浏览他们的项目,而是总是可以浏览著名的开源项目。 不知道从哪里开始?在Github上尝试展示的项目。
“任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员写出人类可以理解的代码。"
-Martin Fowler,重构:改进现有代码的设计
毕竟,这就是开源的原因之一项目存在。
我个人第一次看到真正干净的代码是偶然发现某个业余爱好者的开源Python项目。代码是如此的压倒性的优雅,以至于我几乎退出了编程,但是最终却教会了我很多东西。
9。写好的评论
“写好的评论"是编程领域中最古老的建议。实际上,一旦向新手介绍评论,就会非常鼓励他们尽可能多地发表评论。
但是,几乎感觉像我们朝相反的方向走得太远了。尤其是新手,往往会过分评论-描述不需要描述的东西,而忽略了“好评论"实际上是什么。
“总是像那些最终维护您的代码将是一个暴力的精神病患者,他知道您的住所。"
—约翰·伍兹(John Woods)
这里有一个很好的经验法则:存在注释可以解释为什么存在一段代码而不是代码的实际作用。如果代码编写得足够干净,那么它的作用应该是不言自明的-注释应阐明其编写原因。
注释可能对警告很有用(例如,“删除它会破坏A,B和C"),但在大多数情况下,应发现无法从代码中立即收集的内容(即“使用此参数,因为X ,Y和Z")。
10。重构,重构,重构
就像编辑是写过程的一部分,重构是编码过程的一部分一样。厌恶重构是结束无法维护的代码的最快方法,因此在许多方面,这实际上是要考虑的最重要技巧。
简而言之,重构只是清理的一个花哨术语。
“每当我不得不考虑理解代码在做什么时,我都会问自己是否可以重构代码以使这种理解更加明显。 "。
-Martin Fowler,重构:改进现有代码的设计
我常说的一句话是:“不要评论不好码。正如Fowler在上面的引文中解释的那样,如果代码让人感到混乱以至于需要对其进行注释,也许您实际上需要对其进行重构。
此外,在此处编辑一些代码时,在整个项目中,始终使代码处于比首次发现时更好的状态。暂时看起来似乎很麻烦,但从长远来看会有所收获(甚至可以避免精神倦怠)。
总有一些东西要学习
A学习如何编写干净的代码的程序员类似于小说家,学习如何编写干净的散文:本身没有正确的方法,但是有很多错误的方法,这需要几年的时间。
有些人没有所需的东西,最终最终放弃了编程。
但是对于其他所有人来说,干净的代码是绝对值得努力的,即使您一生都要到达那里。
标签: