"随着我成为一个更有经验的程序员,我倾向于喜欢简单的解决方案。"或类似的话。就像许多与编程有关的名言一样,这在某种程度上是一个笼统的声明,因为谁不喜欢简单的解决方案?为了使它再次成为一个强有力的声明,你必须解释什么是简单的解决方案,以及你如何将它与不那么简单的解决方案区分开来。因此,这个价值百万的问题是 "什么是简单的解决方案?",我现在就回答这个问题。
只是开个玩笑。但我确实对此有一些想法。
简单性有几个方面我们必须考虑。例如,我们可以认为编程中的简单解决方案意味着几件事。
- 易于使用(例如,单一的方法调用,单一的依赖关系,单一的参数,等等。)
- 易于理解(例如,通过观察一个单一的函数定义就可以掌握其逻辑)
- 需要最少的代码(例如,5行代码而不是100行)。
- 需要最少的类、函数等(例如,1个类而不是10个)。
- 独立(例如,不需要安装额外的包)
- 易于改变(例如,由我们自己维护,不依赖太多)。
- 允许在某种不同的环境中重复使用解决方案(例如,可移植的,不一定是通用的)。
这些属性并不排斥。我们认为简单的解决方案往往同时暴露了其中的几个特性。可能还有一些我在这里漏掉的东西(当然)。不过,这个列表还是可以帮助我们判断一个特定的解决方案的简单性。我们甚至可以对这种简单性进行量化。例如,从一个父类中扩展会从简单性得分中减去5分,因为它导入了相当多的代码,给你的解决方案增加了一个类,使得它不太容易理解,因为你必须跳到父类中去,弄清楚它是如何将自己的行为与子类合并的,此外,还需要安装一个额外的库。考虑到所有的缺点,惩罚可能会高一点;)
在接下来的几篇文章中,我将介绍编程的几个领域,在这些领域中,人们对做某事的最佳方式存在争议。例如,对于一个模型,我们应该使用活动记录,还是数据映射器模式?对于依赖关系的解决,我们应该使用一个容器,还是一个定位器?如此等等。我们将从简单性的角度来看待每一个解决方案,并为竞争的解决方案计算出某种分数。如果我没有弄错的话,你应该能够根据这些简单性的分数来计算你的编程经验水平;)