原文出自於:http://www.cnblogs.com/chenlong/archive/2009/10/20/1586952.html
什麼是物件導向
剛接觸編程的時候,多數人本能的反映可能是面向過程(OP)的,而不是物件導向(OO)的。這種現象其實是很正常的,改變思維方式是需要一個過程的,我大體歸納了一下其形成的原因:
1、直接原因
你還沒有養成物件導向分析問題和解決問題的習慣。建立物件導向的思維方式需要一定時間的訓練和揣摩才能形成,所以你可以在學習或具體項目中刻意地強化這種意識。一般情況下,經過一段時間之後,你會覺得這是自然而然的事情,只有心中OO,眼中自然OO了。
2、曆史原因
我們從小接受的培訓都是採用面向過程(OP)的方式分析問題和解決問題,尤其是數學,多數是強調按部就班的解決問題,電腦軟體的發展一直就與數學是很有淵源,所以,順理成章的,把面向過程(OP)的方式帶入到軟體開發也是很自然的事情。
什麼是物件導向,或者談談你對物件導向的理解,這恐怕是軟體開發人員,尤其是程式員和設計師應聘的時候,面試官常最掛在嘴邊的問題吧。物件導向對應的英文是Object-Oriented,把Object-Oriented翻譯成“物件導向”,我一直覺得這個譯法不太確切,因為多數人第一次看到“物件導向”這四個字,都很難從字面上理解它到底是什麼意思。後來,我又查閱了一些有關的資料,發現港澳台的電腦書籍中是把它翻譯成了“物件導向”,這個譯法,我感覺不錯,於我心頗有些戚戚焉。“物件導向”比較準確地反映了物件導向認識和解決問題都是要圍繞對象展開的。
所以,物件導向的思維方式認為:軟體系統是一組互動的對象的集合。一組相關的對象組合為一個子系統,一組子系統繼續組合為更複雜的子系統,直至組合成整個系統。
物件導向方式的出發點是儘可能類比人類習慣的思維方式,將“問題域”中涉及的內容抽象為“對象”,使軟體開發的方法與過程儘可能接近人類認識世界解決問題的方法與過程。面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。物件導向是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
面向過程認識和解決問題的思維,可以稱為“流程論”,重點放在處理過程的步驟,流程是整個系統的核心。
物件導向認識和解決問題的思維,可以稱為“組裝論”,重心放在對象的抽象和提取上,然後將對象組裝為整體。
所以OO和OP從思維方式來講,出發點還是完全不同的。
OO認為:軟體系統是一組互動的對象的集合。因為人類對現實世界是非常熟悉的,所以OO就是通過抽象的方式,把問題域映射到現實世界,盡量類比現實世界的萬事萬物。通過這種方式,就可以運用現實世界中解決問題的方法與過程,來解決軟體領域內的問題。有人說:OO眼裡一切皆對象,這句話還是很有道理的。
樣本請參考原文:http://www.cnblogs.com/chenlong/archive/2009/10/20/1586952.html
軟體工程思想的出現是為瞭解決軟體危機,而軟體危機出現的原因並不是寫不出程式了,而是寫出來的程式無法修改、無法穩定運行!因為社會在進步,軟體的需求也在不斷的發展,這就要求我們的程式也能夠隨著需求的變化而變化,而傳統的方法是無法解決這些問題的。物件導向技術的出現就是為瞭解決變化的問題,使軟體能夠適應變化。而為了這個變化,就需要程式建立更合理、穩定的結構;程式也就不可避免的變得更加複雜;不過這種複雜性卻是很合理的,因為我們的現實世界本身就具有這種複雜性,物件導向在實現功能的時候,還在類比著這個現實世界。物件導向的軟體開發就是在應對軟體危機過程中逐漸發展來的,物件導向思想讓軟體更容易擴充和維護。在搞軟體開發時,編碼不是最重要的,分析、設計才是最重要的,所以好的思想或架構是提高軟體品質的一個保證。
自己的感悟:想起當時在聯創實習時,當時要由3G前台組1.0轉變成2.0,其實就是將相同的業務用不同的思想去體現,剛開始進小組時用的是1.0,面向過程式的解決問題,隨著需求的變化,在主業務中刪刪改改,當時很多老同事說1.0的代碼很難維護了,確實是,看那代碼都頭疼,將所有功能雜在一起,改了這,不知道會不會影響那。當時項目組就決定採用組件的思想,將相同的模組抽取出來,然後用各個組件去組裝成一個完整的業務,現在才理解了專案經理當時說2.0才是真正的物件導向。確實後來在接到一個需求後,很多時候只需要改動組件就可以實現了,比方說:使用者檢驗就是一個組件,這個在所有手機開戶類流程中都有,把這個提取出來看作一個對象,就達到了很好的複用及擴充
堅持當你看到生活中每一個實體的時候都抽象出它的類,並把與它互動的一切都抽象出方法,最重要的是要有一種大局觀,不要去糾結於任何一個細節,OO的思維中,重點是要把握“能做什麼”而不是“怎麼做”,能做什麼是類/對象所具有的屬性(方法),怎麼做是方法的實現過程,這個在具體coding的時候解決吧,你可以寫好一個讓你一眼就能看出功能的方法名,然後就不管它,等搞定整體架構的設計之後,再把一個個方法填滿吧
參考資料:
1.http://zhidao.baidu.com/question/259534836.html
2.http://articles.e-works.net.cn/414/Article31939.htm //Java初學者入門經典:物件導向的思維方法
3.http://www.uml.org.cn/mxdx/200906151.asp //物件導向的思維過程
4.http://knix.blog.163.com/blog/static/295750352010518103852763/ //從列印素數問題看物件導向的思維方式