随着软件所具有的功能越来越强大,程序也随之变得越来越复杂,整个编程过程的管理也越来越困难。越来越多的组件需要协调,越来越多的程序员需要协同工作。面向对象编程具有处理这种复杂关系的优势,这不仅表现在代码的设计上也表现在对整个工作的组织方面。
本部分包含如下内容:
协作
面向对象的项目的组织结构
协作
一个复杂的软件需要一个出色的合作团队,每个成员不仅必须要具有个人创造力,而且能够与其它团队成员完美配合。
同一项目同一时间同一地点,努力的程度,人员的多寡,都会影响团队能否达到预期的目标。此外,团队的协作能力还受到时间,空间以及组织结构等方面的约束。
代码完成后,很长时间内都会被使用,维护以及改进。程序员在项目上工作的时间可能有先后,不一定都是同一时间工作的,所以他们很难互相讨论或者知道所有的实现细节。
即使在该项目中所有的程序员都是同时工作的,他们也可能分处不同的地点,这也限制了他们合作的密切程度。
不同团队的程序员各有各的工作侧重点,时间上有各自的安排,却经常要在项目上彼此合作。类似这种跨团队的交流不是一件很容易的事情。
解决问题的办法就是改进设计和编写程序的方式。这种改进不是以层次化的管理,严格的授权为基础,这只会阻碍人们的创造力,而是将协作融入编程本身。
这就是面向对象编程的优势所在。例如,面向对象的代码的良好的复用性,使得即使程序员身处不同的项目,不同的时间,甚至不同的团队都可以高效的合作,他们所需要做的只是在类库种共享他们的代码。这种合作具有广阔的应用前景,因为它不仅能够减轻任务的困难程度,同时也能使那些看上去不可能完成的项目得以完成。
面向对象的工程的组织结构
面向对象降低了在底层的实现细节上协作的需要,并从结构上提高了上层的协作能力,从而使得编程任务可以按照有利于协作的方式重新组织。面向对象的每个特性,从大规模设计的能力到更好的代码复用性,都有助于协作的进行。
本节包含如下内容:
高抽象层级的设计
接口和实现分离
任务模块化
接口简单化
运行时决定
继承通用的代码
重用已经测试过的代码
高抽象层级的设计
当对问题的抽象层次比较高的时候,分工也变得比较容易。项目可以直接按照程序的设计逻辑来组织和管理。
面向对象可以保证实现不会偏离设计目标,团队的成员也对自己工作的部分在整个项目的位置有一个比较清晰的认识,从而有助于目标的实现。
接口和实现分离
在面向对象的程序中,各组件之间的联系细节在设计过程的早期,开始实现之前,就已经得到了很好的定义。
在开发过程中,只有这些组件间的接口而不是实现细节需要考虑协作的问题,因为每个类都封装了类的实现并且处于独立的名字空间。需要协作的部分越少,事情就会越简单。
工作模块化
面向对象编程中的模块化意味着一个大型程序的各个逻辑组件可以被单独地实现,不同的人完成不同的类。各自的编程任务都是独立的。
这样做不仅是为了组织和管理开发工作,也是为了更好的修正代码中错误。因为实现都是被封装在类中,所以代码出了问题可以很容易的定位。
这种按类来划分责任范围意味着类的实现可以独立的更新,例如性能的优化,采用新的技术等。只要类的接口没有变化,程序员可以随时改进类的实现。
接口简单化
类的多态性使得程序的接口更加简单,因为类之间可以重用同样的方法名字。这样导致的结果是整个程序的工作机制更易于被学习,被理解,并且更容易在开发过程中分工协作。
运行时决定
面向对象的程序更多的是在运行时做出决定,因此在编译期(源代码中)只需要做很少的工作就可以让两部分的代码很好的一块工作。相应地,分工合作变得更加容易,出错的可能性也更小。
代码继承
继承是代码复用的一种方式。如果您仅需要继承并特化一些公有类,您的设计和编程过程无疑变得非常简单,因为不同层次的实现之间的关系可以由类的继承体系确定,并且非常容易理解。
继承同样增加了代码的可复用性和可靠性。父类中的代码在子类中也会被测试到,所以类库中那些通用类将会在它们的子类中经过多次测试,这些子类可能是由不同的程序员所写,甚至是在不同的应用程序中。
重用测试过代码
如果您重用别的程序中的部分越多,您自身的工作也越简单。在面向对象中,重用的过程更为容易一些,因为代码本身的可复用性更高。如果项目的任务不重,程序员之间的协作也更容易。
面向对象的类库中的类和框架能够帮助减轻您的编程任务。例如,如果您使用了苹果公司提供的软件框架,您就可以和苹果公司的程序员合作。这些框架通常构成了您的程序中比较基础的部分,而您可以把精力放在您最擅长的方面,其它的事情让类库的开发人员去做。因此,您的项目可以更快的做出原型系统,更快的完成,协作方面的问题也更少。
面向对象中代码良好的可复用性也提高了其自身的可靠性。类库中的类可能被广泛的用于各种应用程序和应用情景。类被使用得越多,潜在的问题就越可能被发现和修正。在您的程序中看起来很奇怪或者很难发现的问题很可能已经被别的程序员发现并排除了。