面向對象的編程方法為什么使用起來不理想?
我感覺確實應用不理想,很多程序員,有些都是資深程序員了對于面向對象的概念僅僅停留在技術層面上。程序員還是沒有理解面向對象的基本概念,即使使用類似Java這種工具,也很難提高效率,更何況Java也被程序員帶得走形了。
關于面向對象,我會寫一系列文章介紹如何認識世界,可以先讀以下兩篇,感興趣加關注。
軟件架構師必讀:面向對象編程思想(OOP)的由來與本質軟件架構師必讀2:一文帶你理解面向對象(OOP)中類的本質我總結了一下,當前理解上主要有這幾個原因:
對于面向對象在系統分析中的作用不掌握,還沒有掌握拆分對象、屬性和方法的基本原則,對于繼承的理解不足,對于重載、多態和接口存在濫用現象。項目籌劃倉促,沒有業務專家的加入或者業務變化比較大,拆分不好對象的設計不僅不能省力,還會給后期的更改造成麻煩。具體工具語言實現過程中,例如Java和Python,也沒有對面向對象提供明確使用規范。反倒是產生了“優先使用組合而不是繼承”這樣的經驗,這是技術上開倒車了。......當然問題還有很多,但我看了許多面向對象的文章,發現困擾程序員,甚至是資深程序員的主要問題是對世界的認識不正確,就是問題1,不掌握的根源在于對世界缺乏認識論。這里說的認識論包括分類、屬性、關系、方法、結構.....等要素之間的關系分析能力。
幾乎隨便找出一篇面向對象的文章,你都可以發現最主要的問題出在根源上:認識世界不正確。
我舉個例子大家就明白了:
我們公司說180天以前的發票不給報銷,這是自然語言,一句話就說清楚了。但是引入了一個詞叫“發票”,發票包含火車票、住宿票、出租車票、停車發票、飯費發票、旅游發票,發票有個屬性叫做發生日期,
if 填單日期-發票.發生日期> 180 天 then 顯示("發票日期超過180天不予報銷")
......你看,要是沒有發票的這個指代作用,我們要費好多話。
一個好的面向對象的程序就是要做到概念(指代范圍)明確、邏輯清晰、語句精簡。這樣才好維護好更改。
兩篇別人面向對象的小例子,你有別的文章要分析也可以發給我,我感覺大部分問題都出現在例子上,就是對世界的認識方法上。
例子一:前幾天看了一篇討論Java面向對象的文章,其中舉了一個例子:如何將水生動物、陸生動物、食草動物、食肉動物進行分類,如果把他們都做成動物類的繼承,你會發現有的食草水生動物不知道往哪兒放。最后決定動物是類,把食草、食肉,水生、陸生都做成接口,然后問題就成功得以解決。
如何對水生動物、陸生動物、食草動物、食肉動物進行分類,其實你仔細想一下,我們學過的動物學中有水生動物這個類別么?并沒有!有什么動物類別么?你想起來初中生物學中哺乳動物的主要特征么:胎生、哺乳。沒有這兩個特征就進入不了哺乳的類別。
那我們怎么表示水生動物這個集合啊?別著急,集合是一定要通過類別表示么?類別也可以通過屬性表示。設置一個生活環境屬性:水生動物={動物| 生活環境=水}屬于對象和屬性的分析不合理。
例子二:在另一篇文章中,設計了這樣一個繼承關系:也是推導了半天,最后得出結論面向對象不好使。
我們來看一下,父親和孩子是實體么?這個是對象么?,每個有孩子的人都是孩子,一個老人能管他叫孩子么?那他曾經是孩子怎么辦?他對于他父母來說始終是孩子吧?......邏輯暈得一塌糊涂。這么分析是不會有結果的。
我們跳出來看一下,實體應該是人,實例是具體的人。父親和孩子是實例之間的一種關系。認識到這一層就知道要把父親和孩子分別做成人的方法:如果是get,返回參數就是找當前對象的父親和孩子。
小結一下:如何認識世界、分析世界是一門學問,叫做本體論,是面向對象的哲學基礎。
學習語言和語文對編程至關重要,說到底編程語言還是語言,語言就有自己的規律和特點,抓住規律才能事半功倍。
博士聊IT,感興趣請關注!
「博士聊IT」一文看懂編程的本質,程序員有前途么?
程序員比社平工資高70%?編程的本質是什么?能力強還是分配不公
低代碼無代碼平臺的未來在哪里?編程語言的進化史告訴你答案
軟件架構師必讀:面向對象編程思想(OOP)的由來與本質
中國為什么沒有自己的編程語言?哲學、數學和語言學基礎是關鍵