用最簡單的一句話說清,什麼是物件導向?他和過程區別是什嗎?有什麼好處?

來源:互聯網
上載者:User
可能我們都在用物件導向方式編程,我們真的理解到他了嗎,每個程式員對物件導向的理解也不一樣,每當別人問我為什麼用對象不用過程時,我總是說不到一個充分的理由,我一般是這麼說的,用對象的好處是,代碼簡潔,重用性高。。。。說說你們的看法和這麼些年的總結阿。

回複內容:

可能我們都在用物件導向方式編程,我們真的理解到他了嗎,每個程式員對物件導向的理解也不一樣,每當別人問我為什麼用對象不用過程時,我總是說不到一個充分的理由,我一般是這麼說的,用對象的好處是,代碼簡潔,重用性高。。。。說說你們的看法和這麼些年的總結阿。

個人拙見,僅供參考,以期啟發,拋磚引玉。

1. 什麼事物件導向?

物件導向就是把跟某一主題(類型稱為類,實體叫做對象)的所有方法(即函數)和所有屬性(即變數)組合起來,用這種邏輯來組織程式的一種程式開發方法。

2. 與面向過程的區別?

面向過程是通過一個一個的函數堆砌起來來組織程式的,面向的是過程(函數),而物件導向是通過一個一個的類/對象堆砌起來來組織程式的,面向的是對象(類/對象)。

3. 物件導向有什麼好處?

當軟體的規模不斷擴大時,面向過程式的程式開發就會遭遇力不從心,一方面難以應付規模帶來的壓力,後期難以維護,另一方面代碼也難以實現複用,造成重複編碼(物件導向通過繼承應對)。
因此,物件導向開發很好的解決了大型程式開發的困難,程式組織更為清晰,更容易後期維護。

王垠看待物件導向編程(王垠使用Java開發了許多項目,包括他的Yin語言):
http://www.yinwang.org/blog-cn/2015/04/03/paradigms/
王垠這篇文章中關於OOP的見解,提到了,物件導向=過程式+抽象,同時指出了完全物件導向導致過度抽象的問題,過度抽象反而會增加耦合.

“對象思想”作為資料訪問的方式,是有一定好處的。然而“物件導向”(多了“面向”兩個字),就是把這種本來良好的思想東拉西扯,牽強附會,發揮過了頭。很多物件導向語言號稱“所有東西都是對象”,把所有函數都放進所謂對象裡面,叫做“方法”,把普通的函數叫做“靜態方法”。實際上只有極少需要抽象的時候,需要使用內嵌於對象之內,跟資料緊密結合的“方法”。其他的時候,你其實只是想表達資料之間的變換操作,這些完全可以用普通的函數表達,而且這樣做更加簡單和直接。把所有函數放進對象的做法是本末倒置的,因為函數本身並不屬於對象,它們只是對象上面的變換操作。絕大部分函數是獨立於對象的,它們不能被叫做“方法”。強制把所有函數放進它們本來不屬於的對象裡面,把它們全都作為“方法”,導致了物件導向代碼邏輯過度複雜。很簡單的想法,非得繞好多道彎子才能表達清楚。很多人至今不知道自己所用的“物件導向語言”裡面的很多優點,都是從過程式語言繼承來的。

大多數的物件導向語言裡都缺乏正確的實現一等函數的機制。Java語言是一個極致,它完全不允許將函數當作資料來傳遞。你需要將全部的函數都封裝進類,然後稱它們為“方法”,但就像我說的,這是綁架。缺乏一等函數是為什麼Java裡需要這麼多“設計模式”的主要原因。一旦有了一等函數,你將不再需要大部分的這些設計模式。

編程最重要的事情,其實是讓寫出來的符號,能夠簡單地對實際或者想象出來的“世界”進行建模。一個程式員最重要的能力,是直覺地看見符號和現實物體之間的對應關係。不管看起來多麼酷的語言或者範式,如果必須繞著彎子才能表達程式員心目中的模型,那麼它就不是一個很好的語言或者範式。
(引用結束)

個人也覺得,物件導向沒有錯,錯的是"完全"物件導向,因為有時候並不需要採用物件導向,完全物件導向就太過於一刀切了.拿PHP的mysqli擴充來說,其提供有物件導向和過程化兩套使用方法.物件導向就是new mysqli()建立一個對象,然後就可以很方便的調用方法和成員.過程化則是使用首碼為mysqli_的一系列函數.在這個情境下,個人覺得new mysqli()的確更合適一些.不過,對於某些情境,比如PHP內建的解析URL的函數parse_url,個人覺得就不需要使用物件導向了,如果再搞個url處理的類,把parse_url放到裡面,就太多此一舉,把簡單問題搞複雜了,作為一個功能性很明確的函數,直接提供給編程人員調用,顯然很友好.

拋磚引玉。

Q: 什麼是物件導向?
A: 一種編程範式,與面向過程相對,代表一種以資料(對象)為單元的對現實世界的抽象方式。

Q: 物件導向與面向過程的區別是什嗎?
A: 用程式描述"我吃飯"。面向過程的寫法:eat(I, food),物件導向的寫法:I.eat(food)。兩者最直觀的區別是程式的組織方式不同,面向過程的程式以動作(函數)為構建單元,通過在函數中調用其它函數完成對現實世界的描述。物件導向是以資料(名詞)為核心,通過對象之間的訊息傳遞構建程式。

Q: 物件導向的好處?
A: 物件導向更符合人類對現實世界的認知,人對抽象的“類”和具體的“對象執行個體”這些概念從童年起能有很好的理解,例如 "人類"就是一個抽象的 class,而"張三"就是一個屬於"人類" class 的 object.物件導向有三大特徵:封裝、繼承、多態,能夠避免命名衝突、實現代碼複用,對於構建大型程式十分有利。

上面的答案已經說的很清晰了。
物件導向就是對“類”的合理使用。
面向過程就是對“函數”的合理使用。
好處?減少重複的代碼,增加可維護性。

以前在大學,跟馬士兵老師學習 Java 時,他如是說:

面向過程
汽車啟動是一個事件,汽車到站是另一個事件。在編程式的時候,關心的是某一個事件,而不是汽車本身。
編寫啟動汽車程式。
編寫汽車到站程式。
如果汽車壞了,還要編寫"修理汽車"程式。

物件導向
先選擇操作對象——汽車。在編程式的時候,關心的是汽車本身,讓汽車去完成各個動作。
命令汽車——啟動。
命令汽車——到站。
如果汽車壞了,命令汽車——修理。

很顯然,物件導向是最接近人類思維的編程思想。

依我看,最大的好處就是:

更有助於人類的思考

物件導向的定義,網上一搜一大把。的確,我們每個人都在使用它,卻很少有人思考過其中的原因。

事實上,從文法層面上來說: 物件導向只是面向過程的文法糖。繼承,多態等等,完全可用面向過程來類比,只是繁簡的區別罷了。

物件導向的存在,肯定是有價值的。誠然,面向過程也可用於軟體工程,但為何不被人們所推崇?原因就是: 不好想

人類更願意用聯絡的思想去看問題,因為這更貼近生活經驗,而物件導向就能很好地體現這種思想。

把事物分解為實現,這是機器的腦子; 把事物聯絡成整體這才是人類的腦子

上面說的都挺不錯的,偶也來湊個熱鬧~
簡單到一句話:(按題主的要求)

  1. 什麼是物件導向?對象是資料+操作。

  2. 和面向過程的區別是什嗎?物件導向更關注資料,而面向過程更關注操作。

  3. 有什麼好處?物件導向讓我們能更容易去封裝資料、封裝操作、擴充(繼承機制),以及提供更輕量的介面--多態和duckType

樓上說的都挺不錯的,但是說好的一句話說清呢。。。

要我說,物件導向比面向過程好的是:人類語言很大程度是物件導向的。(至少中文、英文是。我就會這兩個…)

如果非要一句話概括,那麼就是:物件導向是將問題模組化,面向過程是將問題程式化

老程式員了,c# JAVA c++ py都走過,現在愛node。那麼多年的感覺就是,oo其實就是一種建模方法,簡單的說就是你是如何理解這個世界這些業務的,oo只是其中一種。多接觸各種不同的思想,才明白其中的差別,別糾結於理論。

化整為零的哲學思想

舉一個栗子
實現電商網站裡面的一個小功能叫“刪除商品”
如果是物件導向:可能的思路是---“刪除商品”是對商品進行刪除的一種方法,那就在商品這個類裡面增加一個方法
如果是面向過程:可能的思路是---“刪除商品”就是1,判斷使用者登入狀況;2,判斷使用者權限;3,對提交的操作進行庫表操作;4,返回結果;

不知道說的明不明白,我沒有學過物件導向編程,小白的理解~~~~

就拿買膝上型電腦來說吧

過程思維:詢問周圍朋友-->網上查詢報價-->到附近的電腦城自己去買;
對象思維:找個人給他錢,讓他搞個膝上型電腦給你。

oo更適合把資料和其對應的操作封裝起來,對外隱藏實現細節。

能封裝的就封裝

我寫過java,node,,可以說是從物件導向過渡到了物件導向+面向過程。從我個人的體會來說,面向過程更加快速簡便,更加貼近人解決事物的辦法。比如,商店賣掉一個球,面向過程的思路就是把球的總數拿過來,減去一,然後儲存,同時,添加一個訂單。 這種思維方式和現實業務的過程是比較類似的。所以叫做面向過程。

但是物件導向就是另一種方式,它首先要把這些實體都抽象兩個類,球,訂單。然後提供實現方法。比如,球的類有方法 sell,調用這個方法就會把球總數減1,然後調用訂單的方法add,添加訂單。總體的思路就是,先設計好類的介面以及互動方式,然後只要在 業務發生的時候, 將訊息發送給相關的類就可以了。 這裡,我們只需要調用 球的sell方法就行了。至於,它怎麼下訂單,訂單價格,我們都不管。

可以看出,物件導向的方式比較有利於商務邏輯內聚,只要設計好介面,可能很長時間都不用更改類的通訊方式。永遠都是 調用球的sell。當球的價格變了,或者有促銷了,我們只需要修改sell實現,或者針對臨時的促銷,實現一個球的子類,比如叫做促銷球。這樣的話,能最大限度的保證架構的穩定。但是反過來說,如果真的要改架構,成本是比較大的。而且為了保證架構的穩定,前期設計上也會花費更多的資源。

面向過程的優勢也正在於此,雖然處理複雜的業務不是強項,但是開發迅速,改變成本也比較小。非常適合複雜度不高或者適中,業務內容多變的開發。

以上。

現在我們來應該討論 oop 和 aop 。。

封裝,繼承,多態。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.