如果从一个抽象模型中剔除足够多的细节,则它将变得足够通用,足以适应于多种情况或场合。这样的通用抽象常常相当有用。例如,如图2-1展现了一个人体普通细胞,图中可能只包括真实细胞的一小部分结构特征。

图2-1 细胞的通用抽象模型
这幅极度简化的示意图看起来不像真的神经细胞,不像真的肌肉细胞,也不像真的血细胞;但它仍可用于教学,能描述所有这些细胞的结构和功能——即各类细胞都具有的公共特点。
抽象模型越简单——即展示的特点越少——它就越通用,也越具普适性。抽象模型越复杂,就越具限制性,只能用于描述较少的情况。
2.2.1 将抽象模型组织为层级结构
即便我们的大脑擅长于抽象类似游览图和地块这样的概念,但人的一生中还是有数以十万甚至百万计的抽象过程需要处理。为了对付由此带来的复杂性,人类根据既定标准将信息系统地进行分类处理;这一过程叫做级类区分(classification)。
例如,科学领域将所有自然物区分为动物、植物或矿物。要将一个自然物识别为动物,该物体必须满足以下规则:
l 它必须有生命。
l 它必须能够自行运动。
l 它必须对外界刺激能产生迅速反应。
鉴别植物的规则与此不同:
l 它必须有生命(和动物一样)。
l 它必须没有明显的神经系统。
l 它必须有纤维质的细胞壁。
有了这些清晰的规则,将一个物体归入适当类别就相当简单了。跟着我们还可以继续“往下钻”,定义用来区分各种不同动物的规则,直至构造出一个自顶向下渐趋复杂的抽象层级结构为止。图2-2是抽象层级结构的一个简单例子。

图2-2 自然物的简单抽象层级结构
在考察类似图2-2那样的抽象层级图时,我们会神游于各个层级,自然而然地将思绪定位于在当时对我们较为重要的层级(或称子树)上。例如,或许我们仅对哺乳动物感兴趣,就会集中注意力于哺乳动物的分支,如图2-3所示,而暂时忽略其他部分。

图2-3 聚焦于层级结构中的分支较为省力
这样,我们就能减轻大脑负荷,在单一时刻只关注整个抽象层级结构中的一个分支;在上面的简单例子中,只需要处理4个概念,而不是原来的全部13个概念。无论抽象层级结构发展到多复杂,只要它组织得足够好,我们就不会耗神过多。
在抽象层级结构中确定用来给物体分类的规则可不是容易的事。例如,要定义“鸟”:它应该
l 有羽毛
l 有翅膀
l 产卵
l 会飞
根据以上规则,鸵鸟和企鹅都无法被归属到鸟类,因为它们都不会飞(见图2-4)。

图2-4 制订正确的分类规则实为不易
尝试排除“会飞”规则,让规则集更简单,得到
l 有羽毛
l 有翅膀
l 产卵
根据以上规则集,现在可以正确地将鸵鸟和企鹅归属到鸟类,如图2-5所示。

图2-5 创建了适当的分类规则
这个规则集还是过于复杂,“产卵”规则纯属多余:无论采用该规则与否,都不会影响对是鸟或非鸟的判断。所以,再次对规则集进行简化:
l 有羽毛
l 有翅膀
恶从胆边生,再试试多简化一点,把“有羽毛”规则去掉,符合下面规则的就是鸟类
l 有翅膀
如图2-6所示,这回我们逾越了雷池:对鸟类的抽象过于普遍,导致把飞机、昆虫和许多其他非鸟类都包括了进来!

图2-6 过于宽松的规则集导致的后果
定义分类规则,就是定义合适的规则集——不过于普遍,也不过于严格,而且没有冗余。
2.2.2 作为软件开发基础的抽象
在分析信息系统开发项目的需求时,通常会从搜集系统所有的真实情况的细节开始。这些细节往往包括
l 用户明示的,和
l 我们发现的
我们需要判断这些细节中哪些是与系统最终目标相关的。这是根本大计,因为我们不能对付所有细节!容纳太多细节的结果,就是让系统变得过于复杂,使之难以被设计、编码、测试、调试、撰写文档和维护,以后也难以扩展。
在构建一个软件系统时,所有对抽象过程的“容纳”或“排除”动作,都必须基于该系统总体目标、应用域和关注点进行考虑。例如,当在软件系统中表述一个人时,其眼睛颜色重要否?还有遗传因素、薪水、嗜好等等又如何?答案是,其中每一项可能有用也可能没用,取决于软件是否设计为一套
l 薪资系统
l 营销统计图系统
l 眼科病患数据库
l FBI通缉犯追踪系统
l 公共图书馆系统
一旦确定某种情况的要素——本书第二部分将告诉你怎么做——就能为该情况准备模型了。建模是为创造某种物体而打造式样的过程。房屋蓝图、印刷电路板示意图和曲奇饼模刀等等都是式样的范例。如我们将在第二和第三部分看到的那样,软件系统的对象模型也是一种式样。建模与抽象联袂工作,因为模型基本上是抽象的物理或图形的肖像;在高效地建模之前,需要决定建模对象的细节要点。





