[1]動機、原則與模式——OO設計之我見

2014年8月,我應內訓經理的要求,做一次技術分享。我認為在公司的IT開發中,對面向對象的設計和實現沒有得到足夠的重視,宣貫做的不夠,大部分軟件工程師在這方面的素養也有待提高。另外由于我的專業和長時間的實踐,始終想對面向對象設計做一個自己的闡述。我覺得這是特別好的一次機會,所以就這個問題做了題為《動機、原則與模式——OO設計之我見》的講座,反響較好。這篇文章就是脫胎于這次分享,并在文字上更規范了一些。

編程是什么?
說到面向對象的設計和開發,我就想到上學的時候Pascal老師問過的問題:編程是什么?經過這么多年的實踐,我覺得當時老師給出的答案是本質上的。編程就是數據結構加算法。這里先談談我對算法的理解。

算法就是解決問題的步驟,我認為是一種對軟件工程的動態表述。關于算法,我有一個好消息和一個壞消息。好消息是,作為社會科學的范疇,大到國家強盛,民族復興,小到家庭和諧,自我實現。往往都很難用1234的步驟來描述;而作為自然科學的計算機技術,大多數的問題都可以用某種算法的表述十分精確的定義。這就是為什么讓我們覺得科學家比社會學家更靠譜;壞消息是即使有明確的步驟,很多算法還是很難。探其緣由,算法的難度來源于與數學的不解之緣。因為很多算法問題都是可以通過數學來進行建模,進而變成一個數學問題來求解。

討論完算法,再說數據結構,數據結構是數據的組織方式,是軟件工程的靜態表述,數據結構是一種靜態的美。作為一個普通的程序員,你可能不會設計很高深的算法,但你會經常遇到設計數據結構的問題,OO設計,本質上就是設計數據結構。從現在業界的技術人員構成,你會發現,真正研究狹義的算法的程序員是金字塔的塔尖,他們在大型科研單位和BAT這種巨型互聯網企業中。而大量的軟件工程師和高級軟件工程師其實都在做數據結構,只是在解決數據結構問題的過程中,涉及解決問題的步驟,即廣義的算法。而且好的數據結構設計,會從根本上簡化解決問題的步驟。

程序員的境界
我在這里提到了兩個典型的員工,他們可能不是具體的兩個人,但絕對代表了兩類人。老李,10年以上工齡的老程序員,習慣了開發過程中不費腦子的Ctrl+c,v大法,鮮有拿得出手的OO設計方案;小王,科班出身但經驗缺乏,遇到問題善于思考和總結,即使很小的設計,也能看出OO設計的影子。我對他們的看法是,老李是典型的“一年進步,N年循環”的程序員,而小王終將“從優秀到卓越”。為什么造成了這種不同?境界的不同!

這時我又想起了《大腕》這部電影,其中一個橋段就是葛優給Lucy講解境界的含義。它是一種眼光,境界越高的人,看的就越遠。我給出了這樣一張slide和一個結論。就OO設計而言,普通的程序員,優秀的程序員,偉大的程序員和佛,境界就是這么大的區別,而在我們修煉內功的道路上,提升OO設計能力,就是提升境界。

ood.jpg

動機、原則與模式
我認為,軟件設計可以分為三個重要的層次,面向對象的思想和軟件(構件)復用的動機是最高層次的,面向對象的設計原則是對以上內容的具體化和銜接,而設計模式才是更具體到實際問題的解決方案,即接”地氣“的部分。所以一個好的軟件系統設計師,首先應該有面向對象的思想,然后掌握面向對象的設計原則,最后才是具體問題具體分析,應用模式來解決實際問題。這樣才會設計出比較合理的系統,以及降低濫用和錯用設計模式的幾率。

動機是指一個人想要干某件事情而在心里上形成的思維途徑。同時也是一個人在做某種決定所產生的念頭。說到動機,可以比較兩種程序員,分別是懶程序員和“懶”程序員。前者,不深入思考系統的結構,不會用面向對象的方法設計整個系統,停留在面向過程的思維模式,簡單的復制粘貼;后者,不是真的懶,而是不愿意在后期維護更多的代碼,愿意在設計階段投入更多的精力,專注于解耦和封裝,磨刀不誤砍柴工。

我把真正的OO設計的動機總結為三點,首先是真實的反應客觀世界,也就是建立模型;其次是把正確的算法,即解決問題的步驟放到正確的結構中;最后是擁抱變化,為產品,也為自己的未來考慮。

有些人認為,學習OO設計就是學習設計模式。但我更認為,OO設計的原則重于設計模式。《Java與模式》是一部描述設計模式的出了名的大部頭,一共1024頁(好有計算機科學的感覺)。盡管你可以想象他用超過90%的篇幅描述各種設計模式,但是你可能不會想到,他在第二部分就寫了這么一段話:

在目前的軟件界,學習和應用設計模式正在形成風氣。的確,通過學習和應用設計模式,可以更加深入地理解面向對象的設計理念,從而幫助設計師改善自己的系統設計。但是,設計模式并不能提供具有普遍性的設計指導原則。在讀者經過一段時間的對設計模式的學習和使用之后,就會覺得這些孤立的設計模式的背后應當還有一些更為深層的、更具有普遍性的、共同的思想原則。

可見本書的作者,希望讀者在進入設計模式這個絢麗世界前,先要掌握OO設計原則這個指南針,才不會在隨后的學習中迷失方向,才能掌握“大巧若拙,大辯若訥”的OO設計精髓。那么OO設計原則都有哪些呢?我又怎樣對它們進行解讀呢?請看本文章的第二部分

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • OO設計的三寶在講具體的原則之前,我想先明確一下面向對象語言的三個特性。所有的面向對象語言都首先必須支持這三個特性...
    扁圓柱體閱讀 533評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • 本文把程序員所需掌握的關鍵知識總結為三大類19個關鍵概念,然后給出了掌握每個關鍵概念所需的入門書籍,必讀書籍,以及...
    dle_oxio閱讀 11,205評論 6 244
  • 人生不過四季:春、夏、秋、冬 四季隨能輪回 但生命不會重來 只有春種一粒粟 才能秋收萬顆子 其實,生命不過三天 昨...
    TWE閱讀 1,602評論 0 0
  • 情商的表現之一就是自己能控制自己的情緒,那么在日常生活中,作為我們避免不了喜怒哀樂。這幾種情緒當中,我們最難控制的...
    酥小栗閱讀 338評論 0 0