7

每一件意义重大的小事——读《代码整洁之道》

 3 years ago
source link: https://yuguo.us/weblog/clean-code/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近在读《代码整洁之道》,先说一些自己的心得,我觉得无论什么语言的程序员,无论什么开发方向——移动也好,web也好,桌面也好——学会如何编写整洁的代码(clean code)都是至关重要的一堂课。

这门课的名字也许一点都不酷,但它会完全改变我们的生活。它会让我们从一个日日夜夜加班、陷入代码泥沼中的苦逼开发仔变成开心工作效率工作的型男。

这本书讲了特别多关于代码整洁的细节,多到让人觉得没必要,但是如果有曾经陷入代码泥沼的经验,一定会点头称是。本文仅举两例,说明代码整洁的重要性,和改良代码整洁对我的生活产生了怎样的改变。

DRY(不要重复你自己)

DRY原则是软件开发中毫无疑问最重要的原则,重复是所有邪恶的来源,许多原则与实践规则都是为了控制和消除重复而创建。例如,全部Codd数据库范式都是为了消灭数据重复而服务,面向对象编程将代码集中到基类,从而避免了冗余。

我刚进入Qzone做页面重构的时候,Qzone v5的代码一团糟。页面重构只负责HTML静态模板(可以认为是demo)和CSS的实现,在组织架构上被归类为设计类。熟悉CSS的人都知道这种语言非常“简单”,它不是编程语言,而是描述语言,描述页面应该是什么样子。

但这种简单的语言也可以乱得一团糟,1份CSS代码可能被10个页面调用,而且20个同样样式的页面调用的CSS代码可能不是同一份。CSS和HTML的对应关系既不是完全无重复1对N,也不是最小化请求的1对1,而是各种不科学的N对N。

所以当时很郁闷,写了《郁闷的开发环境》,也进行了一些思考,比如《为什么需要架构》《请求、缓存、图片利用率和人力成本》。后来我们整理自己遇到的问题重新开发了Qzone v6,在CSS代码方面基本上我们只做了一件事,并把这件事做的不错,就是DRY。

我们把复用的模块放在单独的CSS文件中让其他页面CSS @import进来(发布会压缩合并成一个),我们用cssGaga自动合并雪碧图,,我们把所有的样式文件放在同一级目录,我们禁止2级以上的 @import 嵌套,我们分析必现模块和可选模块,从而判断是ajax载入还是雪碧图分离。

在新的代码框架里工作,保守估计我们的工作效率应该提高了3倍,乐观估计是10倍。因为清晰和一致,我们的页面表现不再各种不一致,我们修改代码不用担心在不该影响的时候影响其他代码,也不用担心在应该统一修改的时候没有统一修改到其他页面。

第三章“函数”关于编写函数的一个重要原则是“短小”,之前写CP工具的时候需要大量页面交互的JS,于是写了各种大段大段的JS,代码中各种流程打断,各种switch。

读完这一章之后才知道编写函数的最佳实践是每个函数都3到4行长,函数的缩进曾经不该多余两层,每个函数只做一件事,避免switch,函数参数尽量少(0优于1,1优于2,3需严重斟酌),函数应该按函数名的表达只做一件事而且没有副作用。

破窗和童子军军规

好的代码需要打磨。 破窗说的是,一个小区,本来干净整洁,没有犯罪事件,大家安居乐业。然而,忽然有一天,一个窗子被打破了,但是没有人管。接下来,不好的事情接连发生,显示有人乱扔垃圾,接下来是随地大小便,整个环境变得脏乱差,随之而来的就是打架斗殴事件的出现,最终导致出现犯罪的事件。也就是说,一件很小坏事儿,如果不加控制的话,也会演变成严重的事件。童子军军规我是从Bob大叔(Robert C Martin)那里知道的,童子军军规中有条规定,当你离开一个地方的时候,要让它比你来的时候更整洁干净。这样的话,童子军扎营的地方会越来越干净。

大家应该看出二者之间的关系了,其实很简单,前者意味着恶性循环,而后者意味着良性循环所以,想要做一个优秀的程序员,应该遵守童子军军规,而不是将破窗情况越变越严重。我们维护版本的时候(无论SVN还是Git),都要让自己签入的代码比签出时候更好。。

我写字的地方迁移到公众号啦~欢迎关注我的公众号:余果专栏


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK