经常有朋友推荐RobertC.Martin的《代码整洁之道(Clean Code)》。今天我们就来看看这本书吧。值得一读吗?关于本书《代码整洁之道》出版于2008年,近年被列为“亚马逊畅销书前五名”之一。这本书的作者被亲切地称为“鲍勃大叔”,同时也是《敏捷宣言》的原作者之一,资历非常丰富。这本书在Goodreads上的平均评分为4.4(超过13,000人评分)。可以说这是一本程序员必读的书。本文将本书浓缩为五个要点。1.尊重抽象图片:abstraction(抽象)图片来源:AbstruseGoose《代码整洁之道》写道:如果要保证函数只做一件事,需要保证每个函数的语句都在同一层次抽象。为了说明这一点,Martin使用以下示例(来自FitNesse):publicStringrender()throwsExceptionStringBufferhtml=newStringBuffer("
0)html.append("size="").append(size+1).append("\"");html.append(">");returnhtml.toString();查看GitHub上的no_abstraction.java源代码这里至少混合了两个抽象级别。第一个是固定大小的hr标签的高级概念,第二个是处理实际标签构造的低级句法细节。为了说明这一点,请更清楚地重构代码,如下所示:);}privateStringhrSize(intheight){inthrSize=height+1;returnString.format("%d",hrSize);}查看GitHub上的abstraction.java源码注意:Render()函数现在只负责构建hrtag构建标签底层细节的任务被卸载到HtmlTag模块中,SizeFormat被抽象成一个单独的函数。”当然,在以后的代码中,我会有更多的考虑。2.干净的代码是关于规则的,它需要付出很多努力。我不希望这篇文章只是列出编写干净代码的要点和规则。这对本书也没有多大帮助——因为教条式的教学方法是远远不够的。相反,在本书中,马丁呼吁培养强烈的个人原则意识,并不断阐明使“脏代码”变得干净所需的努力和责任。本书称之为“编码意识”,它要求“严格使用大量难以实现干净代码的小技巧”。“干净的代码不是按照一套规则写的。你不能通过学习一套黄金法则成为软件大师。专业精神和工匠精神来自驱动规则的价值观。”—RobertC.Martin就我个人而言,我并没有太多的自信,所以我很喜欢这句话。就连Bob大叔也坚信写代码是一项严肃而有纪律的工作,需要付出很多精力,这是一种莫大的安慰.为了真正擅长干净的代码,我们需要迭代我们作为程序员的个人开发以及代码的开发。3.保持你的代码尽可能小“函数的第一条规则是小。第二条规则是让它尽可能小。"-RobertC.Martin这里有两个意思:函数本身应该很短——几乎不超过20行,大多数情况下少于10行函数应该采用尽可能少的参数简洁的函数可以增加代码的易读性code。这也让我们倾向于写功能单一且高效的函数。对于类,他也有类似的看法。他建议用“责任”而不是“代码行数”来衡量一个类的大小。即,一个类应该只有一个职责。这就是所谓的“单一职责原则”(SRP)。保持代码简短是“分工”策略。如果一个大文件包含很多冗长复杂的代码,你可以把文件分成多个模块,把模块分成多个模块,一个函数,再把函数分成多个子函数,直到看到代码逻辑和任务。4.编程是一门手艺,我常常认为它不是适合比较编程到建筑和施工。因为程序员不会做一个完整的设计,从头开始打基础,然后一步步搭建,直到完成。编程的步骤是:先画草图,然后反复添加细节。程序员要做的就是修改、改进和扩展——这是在各个抽象层次上进行的,直到软件满足要求为止。而且软件永远不会真正完成。这就是《代码整洁之道》的中心思想。贯穿全书的主旨是:软件是一门艺术,制作软件就像“画画”。笔者认为,编程的本质是一门手艺。图片:《GoodCode(好代码)》网址:xkcd但是如何让编程从单纯的写代码走向“手艺”呢?Martin认为程序员的主要工具是持续重构和测试驱动开发(TDD)。两者像硬币的两面一样协同工作。让我们看一些概念:重构是在不改变输出的情况下调整现有计算机代码结构的过程。测试驱动开发是将需求转化为具体的测试用例,然后添加代码使测试通过的过程。所以制作软件的过程可能看起来像这样:编写测试代码来验证需要但未实现的功能。编写工作代码(可能不整洁),并通过测试。增量重构代码(保证每次都通过测试),让代码在每一次开发迭代中都更加清晰。“不要以为编写一次系统就可以正确漂亮地运行,今天的任务只是让程序跑起来,明天的任务是重构和扩展系统,这就是迭代增量敏捷的精髓。-RobertC.Martin因此,本书的中心思想是干净的代码是在开发和实践中实现的,而不是简单地一次性创建。资料来源:Pexels5。代码本身清晰易读。注释很少,但清晰、富有表现力的代码比有很多注释的凌乱、复杂的代码要好。”——罗伯特·C·马丁在“注释、有意义的命名和格式”一章中,马丁强烈主张代码本身应该清晰并且易于阅读。示例://Checktoseeiftheemployeeiseligibleforfullbenefitsif((employee.flags&HOURLY_FLAG)&&(employee.age>65))将其重构为:if(employee.isEligibleForFullBenefits())注:去掉注释,条件逻辑封装到一个方法中因为使用了方法而不是独立的函数,所以可以使用实例变量,从而创建调用零参数的方法给方法起一个描述性的名字,使其职责更加明确《代码整洁之道》写了一整章命名,本质上是对Tim的致敬Ottinger规则的详细描述。包括:设置人类可读的名称-例如intelapsedTimeInDays而不是天数使用可读的名称-例如Customers而不是DtaRcrd102避免编码-d不要在“成员”前加上m_,也不要使用匈牙利符号每个概念一个词——不要获取、检索、获取多个概念到一个词承认它。相反,这正是本书如此成功的原因之一——它是编程智慧的集合,并附有示例。如果说有一个小缺陷的话,那就是与介绍高级概念的章节相比,介绍低级细节的章节要少一些。“系统”一章只有13页,只有“注释”一章的一半。但是,我怀疑减少对系统的强调是为了保留他后来的书中的讨论《架构整洁之道(CleanArchitecture)》。考虑到所有因素,这确实是目前最好的编程书籍之一,我将把这本书列入我的2021年清单。