sherrylso

C++博客 首页 新随笔 联系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks

        作为程序员,一直困扰我的一个问题是:一名优秀的程序员,应该是注重面向对象分析能力的培养,还是注重算法分析能力的培养。我相信,这也是一个很多人面临的问题。我的感觉是:很多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公共的行为和属性。这就形成了面向对象软件服用的基础。
    很多人说:算法是程序设计的灵魂,但是我们也不能忘记;面向对象,帮助我们能够更加容易理解问题复杂性的本质。或许算法与面向对象的最佳的结合点在于: 使用面向对象的方法分解问题,而使用精良的算法解决问题。

posted on 2007-06-24 22:31 爱上龙卷风 阅读(1859) 评论(7)  编辑 收藏 引用

Feedback

# re: 面向对象分析方法与算法 2007-06-24 23:11 eXile
算法分析和面向过程的分析好象还不太一样吧?
  回复  更多评论
  

# re: 面向对象分析方法与算法 2007-06-25 12:48 clichengui
不太对吧  回复  更多评论
  

# re: 面向对象分析方法与算法 2007-06-25 23:13 爱上龙卷风
算法本身的定义是:一种循序渐进解决问题的过程,一种为在有限步骤内解决问题而建立的可重复应用的计算过程。
如果我们用算法的思维方式来分解问题,会使我们拘泥于细节。
而面向过程,那是方法论上的定义,不是这里所讨论的。
更确切地讲,这里是讨论的是:
面向对象的分解方法 vs algorithmic 分解方法



  回复  更多评论
  

# re: 面向对象分析方法与算法 2007-06-26 09:33 子寒
“非常遗憾的是,这两类分析方法是互斥的,排他的,你是不可能同时使用这两种方法的分析解决问题” 不是这样的吧 不同层次的问题 用不同的方法  回复  更多评论
  

# re: 面向对象分析方法与算法 2007-06-26 22:40 爱上龙卷风
不过在"分解问题"这个层次上,从思维方式的角度考虑,我们可以用面向对象的思维方式,或者算法式的思维方式  回复  更多评论
  

# re: 面向对象分析方法与算法 2007-06-28 09:41 SuperPlayeR
建议阅读一下《Unix编程艺术》
  回复  更多评论
  

# re: 面向对象分析方法与算法 2008-01-07 23:36 abettor.org
我的感觉是:很多system level的程序员更加侧重于算法,而application level的程序员,更多的倾向于讨论面向对象。

——同意这句。
有时候感觉那些所谓“GOOGLE面试题”太矫情了,而有些人的对象设计的又太牵强了。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理