作為程序員,一直困擾我的一個問題是:一名優秀的程序員,應該是注重面向對象分析能力的培養,還是注重算法分析能力的培養。我相信,這也是一個很多人面臨的問題。我的感覺是:很多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公共的行為和屬性。這就形成了面向對象軟件服用的基礎。
很多人說:算法是程序設計的靈魂,但是我們也不能忘記;面向對象,幫助我們能夠更加容易理解問題復雜性的本質。或許算法與面向對象的最佳的結合點在于:
使用面向對象的方法分解問題,而使用精良的算法解決問題。