心理学研究认为人同时只能处理7±2件事,也就是说人通常只能同时处理5到9件事。超过这个范围,就容易出现混乱或差错。据说,在某些古代文明中,“七”有很多的意思。
7±2原理表明了人类认知能力的局限性。为了克服这个局限,我们的祖先很早就发明了分而治之(Divide and Conquer)的方法。在研究一个复杂事物时,将其划分成若干小部分,并逐渐细化,直到能把握为止。然后再反过来研究各部分之间的联系,最终达到理解整个事物的目的。
以人体为例,人体可看成是一个四层结构:系统、器官、组织、和细胞。人体由若干系统组成,如呼吸系统、消化系统、循环系统、神经系统等,系统若干器官组成,器官由若干组织组成,组织由细胞组成。这样我们在研究每一部分时,同时需要考虑的问题就不会太多。这样既容易描述,也便于理解。如果在划分时没有加入系统这一层,而把人体看成是心脏、大脑、脾、肝、胃、肠、肺、手、脚、腿、臂、眼、耳、鼻、喉等,就不利于我们理解各器官之间的关系以及人体的运作机理。就本质而言,人体是由细胞组成的,但这对我们理解人体有多大帮助呢?所以合理的分层是我们描述问题、理解问题的有力武器。
人体是一个复杂系统,但我们用一个四层结构就能描述得相当清楚。巧的是,相当多的软件系统都能用四层结构描述。以把每一部分都分成七个小部分计算,一个四层结构能描述2800(7+7*7+7*7*7+7*7*7*7)个子系统或类。有多少软件系统能超出这个范围呢?
软件设计的一个重要任务是分块、分层,使每一块、每一层都自成一体,完成某一功能,但又不过于复杂。并使各块、各层之间的耦合度要尽量小。这样的软件系统既易于开发,又易于维护。不幸的是,一个软件可能有很多划分方法。怎样使划分更合理,那就要看经验与感觉了。但如果一种划分违背了7±2原理,就很可能表示该划分不合理。大的原则是:不是完成同一功能的子部分不要放在一起,不是同一抽象层的子部分不要放在同一层。把心脏归到呼吸系统显然不对,把上皮组织与消化系统的各器官并列起来也不妥当。当然,也不要指望一次就能划分好,要随时调整。
在软件开发中,要自觉运用7±2原理,
l 每一张UML图都尽量不要超过7±2个实体。
l 每个接口(interface)或抽象类的公共函数(public functions)都尽量不要超过7±2个。
l 每个函数都不要过长。函数内,紧密相关的表达式之间不留空行,形成一个表达式组,与其它表达式组用空行隔开。每个表达式组最好有注释,解释整个表达式组的行为。每个表达式组的行数也不要过多。
l 软件的物理结构与逻辑结构要尽量匹配。这样,如果逻辑结构遵从7±2原理,物理结构就能自动符合要求。
l 每个开发小组的人数以七人以下为佳。
l 等等。
不管我们喜欢与否,7±2原理是大自然赋予人类的限制。也许这个原理是美得一种表现呢,不是说简单就是美吗?那就让每一个模块、每一个类、每一个函数都美起来吧。