书写清晰代码的10个要点

原文链接:Tips for Writing Cleaner & Better Code

毫无疑问,编程是一个辛苦的工作。编程是一件关于学习语言和算法的工作,但它更是一个怪兽,试图编写一个复杂的能够工作的应用程序,这项工作让你目不转睛,不想离开。
书写清晰的代码就像绘画、烹饪和摄影,他们好像看起来比实际更容易。为什么我们要在乎书写清晰的代码呢?那是因为它的好处让我们值得去做。

  • 更容易解决问题。一旦开始思考书写清晰的代码,你解决问题的方法也在改变。相比于粗鲁地暴力解决,你的算法和软件设计会变得更加优雅和意图明确。
  • 在维护上花费更少的时间。清晰的代码更加容易阅读和理解,因此你可以花费更少的时间在弄清楚每一个部分实际在做什么,而花费更多的时间在修复、改进和扩展代码上。
  • 更清晰的沟通想法。如果你和其他程序员协同工作,清晰的代码可以减少你们之间的误解,同时保证长期运行中出现更少的漏洞。

以下是关于如何写出清晰代码的10点提示。

1.使用描述性的名称
什么是变量,类和函数?有很多种方式回答这个问题,但是当你真正思考这个问题时,它们无非是程序员和应用背后逻辑之间的交互和连接。因此当你使用不清楚的、不可描述的变量、类和函数名称时,你实际上是在模糊阅读代码的程序员(包括你自己)的逻辑。

我不是一个伟大的程序员,我只是一个具有伟大习惯的好程序员。-Kent Beck

如果一个变量名是dxy,这是什么意思?没人知道。你也许需要阅读整段的代码来反推变量的含义。相反,如果一个变量是disanceBetweenXY,那么它的意义就非常容易知晓了。同样的道理适用于类和函数。当你想要用CalculateTangent()时,就请不要用CalcTan()或者CalcTangentAngle()。

2.让每个类/方法具有唯一目的
你曾经遇到过一个函数有成百上千行吗?如果有,你就会知道浏览、理解和编辑它是一件多么痛苦的事情。实际上,一个复杂的计算,例如GetCreditScore(),可能需要分解成几个辅助的函数,例如GetCreditReports(), ApplyCreditHistoryAge(), and FilterOutstandingMarks().

3.删除不必要的代码
我有一个一直与之斗争的坏习惯。一般是这样的:我想要修复和优化一段代码,所以我会注释掉它,然后在其下边重写。即便新的代码可以工作,我还是会保留旧的代码以防万一。随着时间的流逝,我累积了相当多这样的注释掉的代码,这些代码不在需要,但是会扰乱我的源代码。很讽刺的是:注释掉代码上下的代码已经发生了很大变化,注释掉的代码即便恢复也不可能再发挥作用了。这种注释掉备份代码的方法可以被“源控制”取代。如果你还没有开始使用Git或者Mercurial,你现在就需要开始使用“源控制”了,清晰的代码在等待着你。

4.可读性>小聪明
很多程序员把“清晰的代码”和“聪明的代码”混为一谈,好像把10行代码压缩成一行就是更简洁了。确实,在屏幕上它占用了更少的空间,但是实际上它更容易理解了吗?也许有时候是,但是大多都不是这样。程序员热爱“聪明的代码”是因为这就好像是一个解开的谜题。他们发现了特别又唯一的方法去完成一些事情,就好像快捷键一般,这似乎是程序员技术水平的象征。但是书写清晰的代码,需要把你的自负留在门外了。一定要保持优化你的代码让下一个人能够读懂,因为一般情况下下一个人实际上就是你自己。没有比无法懂得自己写的代码更加让人羞愧的事情了。

5.保持一致的编程风格
新手总是习得各种矛盾的习惯,尤其是编程风格。我不是说一种风格比另一种好。如果你偏好tabs胜于space,很好;如果你在方法声明前加空格,没问题。但是不管你做什么,请保持一致。如果你要用camelCaseNaming命名一个变量,就不要用underscore_naming,如果你在一个地方用GetThisObject(),就不要在别的地方用FetchThatObject()。如果你混用tabs和spaces,你就活该失去工作。当你决定了将使用哪种风格,一致保持下去。一些语言,例如Python和C#都具有通用的风格指导可以学习。

6.选择正确的架构
有许多不同的范式和架构用来创建你自己的项目。这个提示的要点是针对你自己的需求,选择正确的框架,不是选择最好的那个,因为没有做好的。

如果没有需求和设计,编程就是给一个空文档添加bugs的艺术。-Louis Srygley

比如说Model-View-Controller (MVC)模式是web开发中是非常流行的框架,因为它可以帮助让你的代码有组织性,让维护成本最小化。相似的,Entity-Component-System (ECS)模式在游戏开发中也非常流行,那是因为它可以帮助让游戏数据模块化,代码逻辑清晰,可读性强。

7.掌握语言的独有风格
掌握一门新语言的一个难点就是学习它与其他语言的区别开的细微差异。这种差异可以是丑陋、复杂和优美,易维护间的差异。想想Python、Java和JavaScript。他们彼此之间非常不同,在一定程度上根据你选择的语言,需要你有不同的思维方式。

如果一个语言无法影响你编程的思维,那么这个语言就不值得知晓。-Alan J. Perlis

Python是紧凑编程和鸭子类型,Java更多是冗长和直接。每种语言都有自己的风格(例如Python中的列表解析),鼓励一种特定的编程方式,你要努力去学习它们。也有一些“反模式”值得担忧,那是一些非最优的设计模式,结果会产生无效的,不可靠的坏代码。了解和摒弃所有常见的与你语言相关的“反模式”。

8.学习专家的代码
如果你想书写清晰的代码,你最应该做的是去看清晰的代码长成什么样,同时去理解为什么是这样。最好的方法就是去研究学习工业专家的源代码。很显然,你不可能直接跑去微软总部去偷看他们的项目,但是你可以浏览名声在外的开源项目。不知道从哪里开始,可以试试GitHub上的一些项目。

傻瓜也可以写出让计算机理解的代码,但是好的程序员可以写出让人类理解的代码。—Matin Fowler

这就是开源项目存在的意义之一:让别人可以学习他们。如果你决定向一个项目贡献代码,这可以加速你学习编程的进度。我第一次真正看到清晰的代码是在我磕磕绊绊的学习一个业余爱好者的开源项目时。那些代码是那么的优雅以至于我都想放弃编程了,但是最终我从中学到了很多。

9.写出好的注释
“写好注释”是在编程世界中最古老的建议之一了。事实上,只要新手知道了写注释,他们就被鼓励尽可能的写注释。但是好像我们事与愿违了。新手通常是过度注释-描述不需要描述的东西,错过了什么才是好的注释。这里介绍一个好的注释标准:注释存在是为了解释为什么这段代码存在而不是这段代码做了什么。如果代码被写的足够清晰,它做了什么的是不言自明的。注释应该为代码的意图提供启示。注释可以作为警告,例如:移除这个会影响A,B,C,但是大多时候注释应该阐明不能直接从代码中读出的内容,例如:因为X,Y,Z所以才使用这个参数。

10.重构!重构!重构!
就像编辑是写作的一部分,重构就是编程的一部分。简而言之,重构就是清理代码,但是不影响其实际的行为。
一个编程技巧一直伴随我:不要给坏代码做注释,直接重写。当一段代码让你很困惑需要注释的时候,实际上你需要重写它了。
而且,当你在项目中这里那里修改时,一定要让你的代码比你第一次看到它时更好。在短时间内也许你觉得没什么影响,但是长远考虑,它值得你付出努力。

总有新东西要学习
一个程序员学习如何书写清晰的代码,就好比, 一个小说家学习如何写出清晰的散文。没有一个正确的方法去做这件事,有许多方式去做,需要花费几年的时间去成为专家。 一些人没有意识到它的重要性,最终放弃了编程。那没关系,因为有许多其他的技术工作不需要编程技能。但是对于其他人,清晰的代码绝对是你值得努力的方向,即使它要花费你的一生去获得。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 10,981评论 6 244
  • 我喜欢一切空旷,看似简单而不复杂的东西。 当我在时,我会把眼睛能够看得见的地方收拾得简简单单的,所有不需要的东西一...
    多则惑少则得阅读 108评论 0 0
  • 第一次看咪蒙的文章是在朋友圈,写的是关于处女座的。因为我也是处女座,出于好奇就点开来看看。那段时间,会有一些黑处女...
    希希暖情阅读 1,175评论 3 6