简单是否会始终提高可读性?
我会说,也许有一点争议,但绝对不会。
您可以在公共界面上给我一个具有200个成员函数的类,它可能是那里最容易理解的公共界面。随便阅读此类代码及其文档可能会很高兴。但是,我不会将其称为“简单”的,因为尽管可读性强,但我仍必须关注所有这些功能如何相互交互,并可能提防因滥用而导致的棘手情况。
我更喜欢一个类,它具有20个成员函数,而这些成员函数不那么容易阅读到200个,因为在防止人为错误和提高代码的可维护性方面,“可读性”并不是我的头等大事。我们可以更改它,即)。
但是,所有这些都取决于我们对“简单性”的个人定义。“可读性”通常不改变该似地在我们中间,除非有人已经获得了这么多的专业知识和流畅性,他们认为正则表达式是非常“可读性”,例如,忘记我们凡人的其余部分。
简单
很久以前,有一次我认为“简单”的意思是“尽可能容易阅读”。因此,我将编写具有许多便利功能的C代码,以尝试改善语法并使其更易于读写。
结果,我设计了非常庞大,丰富的高级库,试图为每一种自然人的思想建模一个函数:一个又一个又一个的助手,所有这些都使客户代码具有更易读的语法。那时我写的代码可能是最“易读的”,但也是最“不可维护的”和“复杂的”。
Lisp
然而,在90年代中期(后期),我对LISP产生了短暂的热情。它改变了我对“简单性”的整个想法。
LISP 不是最易读的语言。希望没有人认为在调用带有嵌套括号的递归函数时提取CDR和CAR是非常“可读的”。
但是,在努力使我的语言陷入奇怪的语法和完全递归的处理方式之后,它永久地改变了我的简单性观念。
我在LISP中编写的代码发现,我不再犯任何细微的错误,尽管以这种方式的棘手使我犯了更多公然的错误(但这些错误很容易发现和纠正)。我并没有误解函数的功能,而忽略了一个微妙的,无法预料的副作用。在进行更改和编写正确的程序方面,我只是度过了轻松的时间。
在LISP之后,对我来说,简单性变成了极简主义,对称性,灵活性,更少的副作用,更少但更灵活的功能,这些功能以无限多种方式结合在一起。
我开始欣赏这种心态,即最可靠的代码是不存在的代码。尽管这只是一个粗略的度量标准,但我倾向于根据其数量来查看代码不可靠的可能性。寻求最大的句法便利性和可读性往往会大大增加该数量。
极简主义
有了LISP的思维定式,我开始偏爱极简API。我更喜欢一个库,它比提供大量“便捷”助手的库更少,但更可靠,更灵活,功能更不方便且更难阅读,而这可能会使代码易于“阅读”,但有可能绊倒对这数千种功能之一的误解会导致更多的不可靠性和意外问题。
安全
关于LISP的另一件事是安全性。它促进了最小的副作用和纯净的功能,即使在10秒钟后我仍能发现更明显的错误,但我再也看不到自己犯了细微的错误。
只要我能负担得起,纯函数和不可变状态就对我来说更可取,即使以下语法:
sword = sharpen(sword)
...比以下方式更简单,与人类思维分离:
sharpen(sword)
可读性VS。简单
再一次,LISP不是最“易读”的语言。它可以将很多逻辑打包到一小段代码中(每行可能不止一个人的想法)。理想情况下,我倾向于为“可读性”选择每行一个人的思想,但不一定出于“简单性”。
使用“简单”的这种定义,有时“简单”实际上可能在某种程度上与“可读”竞争。这是从界面设计的角度考虑的更多方面。
一个简单的界面意味着您需要学习更少的东西来使用它,并且由于其极简主义而可能具有更高的可靠性和更少的陷阱。关于该主题的全面文档可能适合一本小册子,而不是大量的书籍。但是,这可能需要做更多的工作,并产生可读性较低的代码。
对我来说,“简单”可以提高我们广泛理解系统功能的能力。对我来说“可读”可提高我们将每一行代码与自然语言和思想联系起来的能力,并且可能会加快我们对一行代码的作用的理解,尤其是如果我们不熟练使用该语言时。
正则表达式就是我认为“极其简单”的一个例子。就我个人而言,它“太简单了,太难以理解了”。在这两个极端之间,我有一个平衡的举动,但是正则表达式确实具有我定义的LISP般的简单性:极简,对称,难以置信的灵活性,可靠性等。正则表达式对我而言的问题是它是如此简单以至于它变得如此难以理解,以至于我认为我永远不会流利(我的大脑不能那样工作,我羡慕可以熟练地编写正则表达式代码的人)。
因此,无论如何,这就是我对“简单性”的定义,它完全独立于“可读性”,有时甚至会相互干扰,导致在“语法上更方便”和可读性更大的库或“语法上”之间达到平衡。不便”,可读性差但库较小。我总是发现真正的“理解便利”和真正的“可维护性”优先事项与后者保持一致,强烈倾向于极简主义,即使是以牺牲可读性和更自然的人类语法为代价(但不涉及正则表达式) 。YMMV。