软件的复杂性是一个基本性质,而不是一个偶然性质。这种固有的复杂性是由4个因素造成的:问题领域的复杂性,管理开发过程的困难、软件可能的灵活性以及表征离散系统行为的困难。
不限制复杂性将导致项目的推迟提交、走出预算以及无法满足所有需求等,这种情况通常称为软件危机。
所有的复杂系统都具有5个属性:
1)复杂性经常是以层次的形式表现出来,复杂系统是由相互关联的子系统组成,而这些子系统又是由它们各自的子系统构成,并由此类推到最低层的基本构件。--分层结构
2)对系统中最基本的构件的选择是相对任意的,而且在很大程度上取决于系统观察者的判断力。--相对本元
3)一般而言,各构件内的连接总要强于构件间的连接。在从构件的低频动态中分离出高频动态时,这一属性很有用。这是因为高频动态涉及到各构件的内部结构,而低频动态涉及到各构件的交互。--分离变化
4)层次系统通常都是由仅仅少数不同的子系统通过不同的排列组合方式组成。--复用
5)我们发现正运行的复杂系统总是由以前运行的简单系统演化而来……任何胡乱凑合设计出来的复杂系统都不可能正常运转,也不可能被修补好。我们必须由运行中的简单系统开始。--稳定中间
发现共同的抽象和机制,将非常有利于我们理解复杂系统。一个复杂系统中有多个不同的层次。从两个方面来观察系统,即将它看作“是一个层次”(类结构)及层次的“一部分”(对象结构)。系统的类结构和对象结构可总称为系统的体系结构。
掌握复杂性的基本方法是在设计一个复杂的软件系统时,将它分解成更小的部分,再将它们单独精化。
算法分解把系统中的每个模块表示某个总体进程中的主要一步,面向对象分解根据问题领域中的关键抽象来分解系统。算法分解方法突出事件的排序,而面向对象方法则强调主体。最早期科学计算,并没有抽象概念,而后对算法封装慢慢演化为对过程、模块级的抽象(出现了结构化程序设计方法),这时模块也是简单过程分组。它们基本物理单元是过程、模块。但是并没有对数据的抽象。
基于对象编程与面向对象编程区别,前者仅仅是针对抽象数据类型编程。
编程风格--一种组织程序的方式,基于某种编程概念模型和一种适合的语言,其目的是使得用这种风格编写的程序很清晰。
每一种编程风格都是基于它自己的概念框架。对于所有面向对象的东西,概念框架就是对象模型。它包括4个主要基本因素与3个次要因素
(1)抽象(2)封装(3)模块化(4)层次结构
(1)类型(2)并发(3)持久