作为程序员,一直困扰我的一个问题是:一名优秀的程序员,应该是注重面向对象分析能力的培养,还是注重算法分析能力的培养。我相信,这也是一个很多人面临的问题。我的感觉是:很多system
level的程序员更加侧重于算法,而application
level的程序员,更多的倾向于讨论面向对象。大家也可以看到,很多知名IT公司的面试,比如google,比如微软,很喜欢考察程序员的算法方面的能力。而自从设计模式理论风靡IT界以来,好像这些状况有些改变,他们开始考察设计模式相关的问题,考察程序员面向对象的分析能力。不可否认的是,设计模式理论,其基于面向对象的理论技术,提供了开发者非常实效,有用的解决问题的模式。依赖于问题的上下文,应用设计模式,开发者可以开发出更加"面向对象"的系统。
设计一个复杂的系统的本质,就是:将复杂的问题分解成小的,为我们所理解的问题,然后分而治之。人类的智力是有限的,当我们在面对一个复杂问题的时候,总会习惯于首先将他分解,分解到问题足够的简单,足够为我们所理解,解决。事实上,无论是面向对象,还是算法,它们都是分解复杂问题的方法与手段。是采用面向对象的方法去分析,还是使用算法的分析方法,完全是由客观的主体决定的。非常遗憾的是,这两类分析方法是互斥的,排他的,你是不可能同时使用这两种方法的分析解决问题。我们先看一个简单的例子:
问题的定义:client和server使用TCP/IP进行一个简单的交互。
算法的分解方法如下:
问题空间被分解成为几个执行步骤,accept,connet,send,recieve。
面向对象的分解方法如下:
问题空间被分解成为几个对象:c_connector,
主要负责建立TCP连接,在连接成功后,会得到一个c_socket_stream对象,该对象负责主要负责发送和接收网路数据。c_acceptor,负责监听网络连接请求,在一个TCP连接成功建立后,返回给调用者一个c_socket_stream。
两者的区别在于:两者分解方法的着重点是不同的,算法的分析方法强调的是事物内部各类事件之间的顺序,依赖,耦合关系。算法所关心的是事件本身,例如上例中:它关心的是send,recv这样发生在事物内部的事件,以及它们之间的调度关系。面向对象的分析方法在于强调的是事物内部各类客观的主体,以及它们之间的相互协助。
从这点上可以看到:在分解一个问题的时候,算法偏重于微观,面向对象侧重于宏观;算法偏重于细节,面向对象侧重于整体。可以看到,我们很容易得出这样的结论:当面对一个复杂的问题的时候,我们的直觉会告诉我们,我们会更加倾向于使用面向对象方法理论来分析问题。这也是几十年来面向对象的软件实践经验告诉我们的真理。在计算机应用开发领域,面向领域问题本身的复杂性(这包括许多方面:比如你的需求在不断变化,你的应用方式在不断变化等等),决定了其更适合使用面向对象的方法来分析问题。面向对象的软件系统会更加的富有弹性,更加的能适应这种快速的变化。
如何做面向对象的设计分析?关键在于:
1)
对复杂问题的抽象,将复杂的问题抽象成为一组对象,就是我们熟知的objects。object是面向对象软件系统的行为主体。抽象也意味着我们应该忽略细节的东西,注重整体的东西。
2)组织这些objects,使他们形成具有一定结构的整体。比如:通过继承,使它们成为父子关系,通过组合,使它们具有合作依赖关系。通过组织这些objects,我们更加能清楚地看到这些这些objects公共的行为和属性。这就形成了面向对象软件服用的基础。
很多人说:算法是程序设计的灵魂,但是我们也不能忘记;面向对象,帮助我们能够更加容易理解问题复杂性的本质。或许算法与面向对象的最佳的结合点在于:
使用面向对象的方法分解问题,而使用精良的算法解决问题。