面向对象是复杂性的一种解决方案

我们常说:知其然,还要知其所以然。

学会一种方法,并在实践中解决了一个问题,这只能说掌握了这个方法的What和How。

因此,我们需要从相对本源的角度谈论面向对象分析与设计方法,即复杂性这个基本事实。这才触及到面向对象方法的Why的问题。

复杂系统抽象层次化特征

面向对象是一种与真实世界和自然相关的设计方法,因此我们首先需要对自己所处的世界和自然有足够的关注。

从解剖学到核物理,从植物到动物,你会发现复杂系统总有层次化的特征。

下面我们可以总结复杂系统抽象层次化特征的几个表现:

1. 复杂系统是层次化的,层次结构中的每一层都有着各自的复杂性。

例如,植物包含根、茎、叶这三种主要的结构。根的复杂结构可以拆分为支根、根毛、根尖和根冠,类似地,叶的很切面表明它有表皮、叶肉和根管束这些复杂结构。

2. 复杂系统的不同层次代表了不同的抽象级别,同一层抽象中的所有部分以某种定义良好的方式进行交互。

例如,在最高的抽象层,根负责从泥土中吸收水分和矿物质;根与茎交互,茎将这些原料送到叶子;叶子利用茎输送的水分和矿物质,通过光合作用制造养料。

3. 复杂系统的抽象层之间有着清晰的边界,在抽象层的不同部分之间,存在着清晰的分离关注。

例如,叶子的各部分作为一个整体提供叶子的功能(如进行光合作用),但叶子与根之间很少有或没有直接的交互。

4. 复杂系统的抽象层次的这些特征具有跨领域的共性。

例如,多细胞动物具有与植物相类似的层次结构,一些细胞组成了组织,几种组织协作构成了器官,一组器官构成了系统(如消化系统、呼吸系统、内分泌系统、神经系统),等等。

5. 复杂系统的各个低层次部分的活动并没有集中的部分直接协调,往往是一些独立的部分各自为政,每一部分都展现出相当复杂的行为,进而为许多高层次的功能做出贡献。

例如,植物的各个部分各自发挥功能并相互协作,我们才能看到植物较高层的功能,即整体的行为大于部分之和。

复杂系统的5个属性

从复杂性科学出发,我们发现所有的复杂系统都有5个共同的属性。

1. 层次结构

复杂性常常以层次结构的形式存在,复杂系统由一些相关的子系统组成。这些子系统又有自己的系统,如此下去,一直到某种最低层次的基本组件。

复杂系统的架构是它所有的组件以及这些组件之间的层次结构的函数。

2.相对本源

选择哪些组为系统的基础组件,这很大程度上取决于系统观察者的判断,对于一个观察者来说很基础的东西,对另一个观察者可能有很高的抽象层次。

例如,对于博物学家观察一朵花的花粉来说,花粉是最基础的一个组件,而对于细胞学家来说,花粉是很高的抽象层次,细胞的不同细胞器才是其观察的基础组件。

3. 分离关注

组件内的联系通常比组件间的联系更强,让我们能够以隔离的方式来研究每个部分。

4. 共同模式

层次结构通常只是由少数不同类型的子系统按照不同的组合和安排方式构成的。复杂系统具有共同的模式,这些模式涉及小组件的复用。

例如,植物的细胞有脉管,而由细胞组成的也片也有脉管,并且脉管系统在动物中也存在。

5. 稳定的中间形式

复杂系统毫无例外都是从能工作的简单系统演变而来的。随着系统的演变,曾经认为是复杂的对象变成了基础对象,从这些基础对象的基础上构建更复杂的系统。

软件系统的固有复杂性

我们确实可以看到有些软件系统并不复杂,它们可以由一个人设计、开发、维护和使用。这些系统可能很优雅,但这些系统的作用和生命周期往往是很有限的。

与之相反,工业级的应用往往表现出非常丰富的行为,它们存在于反馈式的系统中,由真实世界的事件驱动或发出驱动事件。对于这些应用来说,时间和空间都是稀缺资源。

对于工业级软件,其复杂性远远超出了人类的智能范围,单个开发者要理解其全部设计非常困难。

软件的复杂性是其基本特征,而非偶然事件。

软件系统的固有复杂性体现在如下4个方面。

1. 问题域的复杂性

我们软件中试图解决的问题常常不可避免地涉及复杂性,其中包含数不清的竞争性需求,当出现了高优先级的需求以后,就会出现超高优先级、超超高优先级的需求,甚至包含一些相反的需求,比如一方面要增加投入,同时又要降低成本。这是软件开发内部的复杂性。

软件开发外部的复杂性常源于系统用户和系统开发者之间的沟通困难。用户很难以开发这理解的形式表述自己的需求,甚至只是有一些迷糊的想法,而开发者往往很难理解用户的真实意图,这导致双方经常鸡同鸭讲。这既不是开发者的错,也不是用户的错,这种现象的本质原因经常是双方的领域知识不同。

更为麻烦的是,在开发过程中经常遭遇需求改变。

2. 管理开发过程的困难性

软件开发团队最基本的任务就是制造 简单的假象,让用户与大量的外部复杂性隔离开来。对开发团队来说,最主要的挑战总是维持设计的一致性和完整性。

3. 随处可能出现的灵活性

建筑行业使用的原材料总是有统一的标准和编码,但软件行业却很少有这种标准。软件的提供了非常大的灵活性,这导针对同一个问题,不同的开发者很可能产生各种形式的抽象。

4. 描述离散系统行为的问题

离散系统的本质是具有有限数量可能状态,在大的系统中,由于组合的缘故,导致可能状态的数目非常大。

复杂性的解决方法

1. 结构化设计

结构化的设计不考虑数据抽象和信息隐藏,它也没有足够的手段处理并发。因此结构化设计只适合处理简单问题,对于特别复杂的系统来说,结构化设计的可伸缩性不好。

2. 数据驱动设计

在数据驱动的设计中,系统的输入和输出之间的映射关系驱动着软件系统的结构。

3. 面向对象设计

面向对象分析的底层概念是设计者应该将系统建模为一组协作的对象,将单个对象作为类的实例,而类之间具有层次关系。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享