從年初開始,斷斷續續的讀了幾個月,終於按照計劃把《深入淺出面向對象分析與設計》這本書讀完了,本書的寫作方式比較新穎,可以說是圖文並茂,詼諧的文字配上幽默的圖片,通過視覺化的方式,加深讀者的記憶力,條理清晰、主旨明確,使我能夠循序漸進一點點的深入的讀下去。當然本書也有一些缺點,比如陳述內容過於細緻冗餘,有些翻譯的文字也比較晦澀,理論性的東西比較多,實例代碼相對來說比較少,但瑕不掩瑜,這並不妨礙它成為一本面向對象分析與設計的經典入門書籍。
書中結合幾個具體的例子(吉他庫存管理系統、狗門、遊戲系統開發框架)循序漸進地講解了OOA&D即面向對象設計與分析涉及的關鍵概念、設計原則以及分析流程。其核心思想我認為就是書中所說的偉大軟體開發的三個步驟:
客戶要他做的事情即需求,需要我們通過需求分析確認,通過與客戶反覆溝通、交流收集用戶需求,利用UML建模工具繪製出系統的用例圖,考驗的是我們的業務分析以及領域建模的能力,這一點往往是我們在開發系統過程容易忽視的方面或者薄弱的地方,通常我們會從開發人員的角度而非用戶的角度去分析問題,想問題,這樣設計出來的系統往往用戶體驗較差,使用起來很不方便。另一方面,作為開發人員,通常對其所使用的開發語言比較精通,而對像UML這種建模語言或者工具並不是很熟悉。最後,需求不是一成不變的都,需求是經常變更的,如何使你的軟體從容應對需求變更就顯得及其重要,書中提到了測試驅動開發,設計優良的系統必定少不了測試,測試驅動開發的基本思想就是在開發功能代碼之前,先編寫測試代碼。測試對系統來說特別重要,作為開發人員可以利用一些成熟的測試框架來提升自己編寫測試代碼的效率。
2、運用基本的OO即面向對象設計原則來增加軟體的靈活性
告訴我們要用面向對象而非面向過程的思想去實現我們的系統,在軟體設計的過程中儘量的使用像封裝、繼承、多態等面向對象的技術,使我們的程序更加靈活,良好的設計等於靈活的軟體。為了使軟體靈活可擴展,要學會利用面向對象的設計原則降低應用程式的耦合度。一些基本的面向對象的設計原則比如單一職責原則、開閉原則(即對擴展開放,對修改關閉),裡式替換原則等是需要我們始終牢記的,這些面向對象的基本原則都很簡單,但真正能在程序設計中靈活使用卻不簡單,就拿最簡單的單一職責原則來說,我們可以回頭想想我們曾經設計和實現的類,有哪些類真正的做到了單一職責,我們是不是為了圖省事將一個類變成了一個萬能類。
這是真正考驗我們開發人員內功的時候,你需要對你要設計的系統進行整體的架構設計,並不斷的進行架構優化,甚至有些時候還需要重構你的系統,在架構設計的過程中需要運用一些高級的面向對象分析技術,例如運用一些設計模式去使我們的系統更加容易擴展。架構設計的目的就是讓你的軟體容易改變,反之,你的軟體越難改變,就越難響應用戶需求的變更。在架構設計以及開發的過程中需要經過反覆的迭代,最終實現一個真正可維護的系統。良好的軟體是通過迭代造就的,分析、設計再次迭代,一次次完成程序更小的部分。書中提到了兩種編程模式:契約編程和防禦編程。二者各有優劣,我個人比較傾向於使用防禦編程去實現你的系統。關於防禦式編程我想多說幾點,防禦編程其核心思想是要承認程序都會有問題,都需要被修改,應該根據這一點來編程序,這種思想是將可能出現的錯誤造成的影響控制在有限的範圍內;在編寫代碼的時候要養成檢查變量合法性的習慣;在多線程、異步環境下,你不能保證你的變量不會被其他線程,或者被其他異步操作改變狀態;不要盲目自信,代碼最終還是人寫的,是人寫的就會出錯,你能夠做的就是在出錯之前儘可能的思考出所有出錯的可能,把異常情況規避掉;別認為添加錯誤處理或者異常檢測會降低你的代碼運行效率,實際情況是為此犧牲的效率微乎其微,而換來的卻是程序的高度健壯性,你不再擔心你的程序會無緣無故的崩潰,應保持懷疑一切的態度去編寫和維護你的代碼。通常,通過防禦編程編寫出來的程序更加穩定且容易維護,養成良好的防禦編程習慣將使你的程序無懈可擊。
當然,書中所講述的遠遠不止這些,UML建模、用例設計,功能分析、軟體設計原則、設計模式、軟體開發方式、領域分析、架構設計、OOA&D的生命周期等等任何一項拿出來都值得我們去學習研究並細細品味。在之後的工作中還需要結合實際開發深化學習,轉變軟體開發的思想,培養良好的面向對象設計的習慣,運用面向對象的設計原則、設計模式以及領域分析的方法使開發的軟體更加健壯、靈活以及可維護。