神奇的7+/-2法则:在没有充分理由的情况下不要让程序员的大脑超载 - javiercasas


心理学中有一篇很古老但非常重要的论文:乔治·米勒的著作《神奇的数字 7 +/- 2;我们信息加工能力的局限》,它测量了大脑处理信息的极限,并给出一个数字:人脑中可以同时晃动5到9个概念。在不得重复练习的情形下(如看电视字幕),在短时记忆内,一般人平均只能记下 7 个项目(如 7 位数字、7 个地名),是故从电话簿上查到电话号码后,待要拨号时往往会不复记忆;短时记忆的量虽不能增加,但此 7 个事项的性质则可经由心理运作使之扩大。
他的主要观点之一就是信息编码的概念。他认为编码最简单的方式是将输入信息归类,然后加以命名,最后储存的是这个命名而非输入信息本身。编码是一个主动的转换过程,对经验并非严格地匹配,因此编码以及之后的解码往往会导致错误发生。

对于我们这些软件开发人员来说,有两个对我们来说非常重要的含义:

  • 简单的构造(模型,实现,设计,模式......)更好,因为它们需要较少的概念来描述它们。
  • 构造良好的抽象具有非常少的特殊规则并且没有惊喜地构成更好,因为它们需要较少的概念来描述它们。

反面例子:Abstract Factory pattern抽象工厂的定义:
A Factory that is Abstractwhich implements a createProductAmethod that uses new to <<construct>>a ProductA1 that has a ProductA<<interface>>.
一个工厂是一个抽象, 它实现了一个createProductA方法,这个方法使用使用ProductA接口构造new一个的ProductA。

这个定义中涉及概念:

  • AbstractFactory接口
  • <<creates>>动作
  • Factory1(or ConcreteFactory)
  • ProductA 和ProductB接口
  • ProductA1和ProductB1类
  • new关键字
  • 抽象工厂图
  • 工厂序列图

简单的构造
正如霍尔所说:
构建软件设计有两种方法:一种方法是使其变得如此简单以至于显然没有缺陷,另一种方法是使其变得如此复杂以至于没有明显的缺陷。

不幸的是,他还补充道:
第一种方法要困难得多。

在软件开发中,添加另一个模块,另一个类,越来越多的代码非常容易。另一方面,制作尽可能简单的东西实际上非常困难。它需要寻找潜在的模式和行为,并要求消除不适合的东西。但是,最终,它会更好,因为它允许您使用较少的概念和较少的智力来描述它,这意味着您可以专注于更大的整体而不是细节。

对于抽象工厂只需要两句描述:
两个操作:

  • 首先从接口ProductA获取对象
  • 然后从接口ProductB获取对象

代码如下:
AbstractFactory myFactory = new Factory1();
ProductA myProduct = myFactory.createProductA();
AbstractFactory somethingDifferent = new SomethingDifferentFactory();
SomethingDifferent result = somethingDifferent.fabricate(myProduct);
return result

良好的组合性
当你具有良好的组合性时,你只需将这些部分连接起来构建一个整体,而不必担心这些部分会以意想不到的方式在它们之间相互作用。(banq注参考构造定律)
整体是各部分的精确总和,仅此而已。

不幸的是,很难检测到良好组合性的语义,因为我们的开发人员习惯于那些不构成的东西,我们只是不知道组合良好的东西的“形状”。(banq注:这个形状是整体与部分的组合性)

我们已经看到了AbstractFactory如何通过破坏冒犯“神秘的7法则”。这就是为什么编程很难的原因之一:因为我们自己认为编程很难(简单事情复杂化)。