在过去的几个月里,我研发了一种编写代码的方法。每当我写一个新函数、类或方法时,我就问自己:「这段代码足够傻瓜式吗?」如果不够傻瓜式,就说明没完事,我尽量使其傻瓜式一些。
但是,傻瓜式的代码不代表「无法运行的代码」。傻瓜式的代码应该完全按照预期的方式运行,不过,是以尽可能简单、直接、「傻瓜式的」方式。
任何人能编写它,阅读它的任何人都应该能够理解它。它不应该使阅读代码的人思考代码本身,而是思考手头的问题。不应该花太长时间,不应该太复杂,最重要的是,不应该尝试更聪明的方式。它应该能够搞定工作,仅此而已。
傻瓜式的代码是什么样子呢?这取决于它正试图解决的问题。拿元编程注1做例子,哪种语言经常被视作复杂和「具有妖术」。问自己「这段代码足够傻瓜式吗」就意味着「不允许元编程吗」吗?不一定,真的。在一些特定情况下,通过元编程就可以用最简单的方式解决某个问题。但是,也有很多情况是不需要元编程的,解决方案之上的额外包袱,有碍于理解代码本来的样子。
目标是甩掉包袱,削弱它,直到诞生出最傻瓜式、但可运行、测试通过的代码。
记住这里说的「傻瓜式」:「it works」还不够好。过于复杂、「看看这个更聪明的技巧」、过度抽象、难以阅读的代码,也能运行且通过了测试。这不是我想要的。它必须是傻瓜式的:不聪明、不复杂、不难于理解。
除了称为「傻瓜式」,最终的代码也被称为「优雅」、「干净」和「简洁」。但是「编写傻瓜式的代码」不像「编写优雅的代码」那样不可捉摸,前者貌似更容易达到,使得这种方式对我更有价值。除此之外,我发现从「编写傻瓜式的代码」入手较为容易,最终得到优于其它方式的、优雅的解决方案。
不是每一个优雅的解决方案都是直接的,但是,每个定义的「傻瓜式」的解决方案都是、且都应该是优雅的。
注释
元编程是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。多数情况下,与手工编写全部代码相比,程序员可以获得更高的工作效率, 或者给与程序更大的灵活度去处理新的情形而无需重新编译