什么是整洁代码(What Is Clean Code)

当你拿这个问题问不同的人,或采用不同的语气,你可能会得到不同的答案。但通常无外乎这些评判标准:

  • 自解释的命名
  • 一致的代码风格
  • 合适的抽象
  • 可读性良好
  • 清晰的代码流程
  • 良好的架构
  • 复杂任务使用库实现
  • 使用工业级的解决方案
  • 没有安全漏洞
  • 函数短小
  • 函数复杂度小

不一而足,当然你也有自己评判整洁代码的标尺…

如何写出整洁的代码(How To Write Clean Code)

这是经久不衰的热议话题。我认为下面这幅画可以精辟地诠释如何写出整洁的代码:

image

当然这有一点无厘头,但这是真的。大部分程序员没有写出整洁代码的时间。就此我们无可奈何!

切换视角(Change The Premise)

我打算在这说点可能稍具争议、离经叛道的想法:

这里只有两种代码。一种具有商业价值,另一种没有!

在工业界,我们看中的是“漂亮”的代码,我们看好的是可读性好、行为正确的代码。但因为某些原因,我们从来没有谈论过代码必须要有商用价值。再整洁的代码没有商业价值也是“贱货”。

所以,我们把“具有商业价值”整合进整洁代码的评判标尺,我们得到四种代码:

良好的商业价值贫乏的商业价值
整洁代码出色的代码坏代码
丑陋代码良好的代码垃圾代码

很明显使代码具有商业价值比使其“整洁”更划算。专注于“整洁”最多可以得到“坏代码”,而专注于"商业价值",则最差得到“良好的代码”..

所以,怎样才能专注于商业价值呢?

DIRTI方法(The DIRTI Method)

我靠写DIRTI1的代码来使代码专注于商业价值:

  1. Develop - 为解决某个(商业)问题而快速开发(Develop)出哪怕很烂的代码。不要担心代码格式、抽象及其他任何问题。就是要完成它。
  2. Isolate - 分离(Isolate)上一步实现的功能,整理出抽象模块。这些将成为重构的点。
  3. Refactor - 重构(Refactor)这些模块,开始整理代码。
  4. Test - 当这些模块整理合理后,开始写测试(Test)用例(单元测试)。
  5. Integrate - 一旦这些模块通过测试就可以把它们集成(Integrate)进你的程序(要有集成测试)。

妙的是,这一系列步骤假定你开始的时候并不知你的代码抽象的样子。但你一旦你开始写代码,它会逐渐帮助你明白你要解决的问题(方案)。

与TDD(测试驱动开发)截然不同的是,TDD期望你在你开始动手写代码前明白你要写的代码。

这确实会把我们带到一个美妙的境地。使用DIRTI方法会有两个主要的阶段:不停的DIR和不停的RTI。

当你最终明白方案之前,你将一遍遍的开发,分离,重构。而一旦顿悟以后,你将花费更多的时间到下一阶段(重构,测试,集成)。

为什么这有效(Why This Works)

为什么我坐在这里给你讲DIRTI方法?因为它行之有效。DIRTI方法确实会帮助你知道你要写的代码。它会帮助你指出要解决的问题。

更重要的是,它为你能做出英明决断提供力量和武器。你一定记得,具有商业价值的代码是好的代码。所以当你离开开发阶段,你的代码已经具有了商业价值,因为它已经可以解决最初要解决的问题。

整个进程是迭代的。你可以不停的分离、重构、分离、重构,直到你对代码满意。但这个过程中,你是在可以工作的代码上进行的。这非常酷!这样允许你责问自己,”是否代码已经足够好了“。一旦你对代码满意了,就进入下一阶段。

这会让你关注于最重要的东西:商业价值,而代码质量上的关注度是可以动态选择的。

不是方案,仅仅是工具(Not A Solution, A Tool)

必须要澄清的是:不是要你替换掉TDD、结对编程或其它你已经采用了的方法。DIRTI只会是你工具箱里的又一件工具。针对不同的问题要采用不同的工具:

如果你明白你要写的东西,那就用TDD。如果你仅仅知道问题,而不知解决方案(最佳),那就用DIRTI吧。

===================================================================================

翻译自:Beyond Clean Code

图片来自:如何写出好代码


  1. 发音同Dirty ↩︎