回覆列表
  • 1 # IT人劉俊明

    面向物件和麵向過程最本質的區別在於考慮問題的出發點不同,面向過程是以事件流程為考慮問題的出發點,而面向物件則是以參與事件的角色(物件)為考慮問題的出發點,所以面向物件在處理問題時更加靈活。目前,面向過程的語言更多被用於處理底層業務,而面向物件程式設計則更多用於實現一些業務邏輯複雜的大型系統。

    從結構上來說,面向過程的特點是模組化和流程化,而面向物件的特點是封裝、繼承和多型,這裡面就有本質的區別了。面向過程以功能(函式)作為模組化的基礎,而面向物件則以類作為功能的組織基礎,而類需要一個“抽象”的過程。比如在Java中,完成一個功能的呼叫需要三個步驟,分別是類的定義,物件的建立,方法的呼叫,看一個例子:

    而C語言的功能實現則方便得多,看一個例子:

    透過這個例子我們發現,Java更麻煩一些,Java需要先根據功能抽象出類,然後創建出物件,再然後透過物件才能完成對方法的呼叫,而C語言則只需要函式的定義和呼叫,並不需要建立物件,所以C語言的執行效率更高。

  • 2 # 極客宇文氏

    面向過程,最典型的代表是C語言,面向物件我們就用個人比較熟悉的Java。一個關鍵是“過程”,一個關鍵是“物件”,寫過簡單的C語言程式碼的一定清楚,C語言的程式碼邏輯思路很清晰,入門比較容易理解,就是先放個標頭檔案,,然後在main函數里非常有條有理得寫下程式碼,比如下圖的簡單實現圓相關計算,簡簡單單的一個大括號,宣告變數,加上變數的邏輯,最後輸出結果,就完成了一個小功能,過程化的程式碼,比較接近底層,所以C語言比較接近彙編,接近機器語言,符合機器的邏輯。

    而面嚮物件語言,完成一些簡單的邏輯其實也不難,但是思維方式會不一樣,本著“萬物皆為物件”的核心思想,Java語言寫出任何一個功能都是在物件裡完成的,物件是什麼?初學者如果能比較好的理解物件的用法,就知道,人是一個物件,鼻子眼睛是人的器官,可以是物件本身,也可以是物件的屬性。對的,面向物件講究屬性,講究物件裡的方法函式,而不像C語言一咕嚕下來,函式就是函式自己的,它不屬於誰。面向物件不同,面向物件的函式是不能單獨存在的,要直接用,至少也得放在靜態類裡面。其實說太細,兩種語言相差確實大,不過殊途同歸,都是為了實現所需要的功能,做出所需要的軟體。

    一句話概括,面向過程更貼近機器,面向物件對程式設計師更友好。(是不是有點道理,點點關注背)

  • 3 # 大學生程式設計指南

    這是技術面試過程中經常問的問題,真要徹底的講明白,不是一件很容易的事情。可以簡單的用C語言和C++兩種語言的本質區別來具體解釋,首先從設計模式來講面向物件更加容易形成框架特性,現在高階語言基本上都支援面向物件,像java,python都是這個樣子。

    從事程式設計十幾年兩種思想的程式語言都有一些涉獵,整體給人感覺面相對物件更加容易理解,面向物件更加抽象,現在就一些具體的特性做一個大概的瞭解。

    如何理解面向過程

    面向過程和大家正常是思維模式接近,把一個問題按照從左到右,從上到下的解決方案分解成N個小步驟然後挨個去執行,說的再抽象一點就是模組化,具體實現透過函式來完成,函數里面又可以呼叫函式,最終功能點就是被無數個函式來完成。

    從程式碼邏輯上分析,主函式main函式下面分成幾個大的功能函式,這幾個函式又被分解成無數個小函式完成,稍微複雜點開啟多個執行緒非同步處理一些功能,基本上就是面向過程的全過程了,非常容易理解,底層的功能模組也能別的功能模組共用,不能講面向過程沒有共用性,只不過相對框架性看起來差些,linux核心絕大部分程式碼都是C語言完成,如果沒有框架性不可能這麼穩定的執行,也正是這麼靈活的功能模組呼叫,早就了高效,所以在某些領域C語言依然是程式設計首先,同時也是基石,現在很多程式語言的底層都是C語言來完成的。

    如果能用C語言的框架把一個系統構建的十分完善並且具備很強的擴充套件性,一定是程式設計的高手,這主要靠內在功底把零散的東西有機的結合成一種框架,不像面向物件自帶抽象模型體系。

    如何理解面向物件

    面向物件在模式上和麵向過程截然不同,面向物件是先抽象一個模型,然後把這個模型例項化來使用,這個抽象模型就是大家經常聽到的類的概念,類並不能直接去使用,而是需要直接例項化,所以做了很多年面向過程的老程式設計師,發現面向物件類必須例項化,特別是想呼叫裡面其中的一個方法的時候,還需要拿到對方的例項,然後才能直接去呼叫,放在面向過程的程式設計裡面是可以直接功能函式。

    面向物件裡面的類,其實是面向物件裡面結構體的延伸,把這個概念放大化了。類主要是兩個部分構成,屬性和方法,屬性就是變數,方法就是功能模組。當然面向物件最主要的概念是把事物抽象化,舉個例子,把各種動物抽象成一個類,常見的狗,雞鴨鵝等共有的屬性,都有能走動的動作,都有腳屬性,但不同的動物數量不一樣,抽象成一個動物類,如果要弄一個狗的類首先繼承一個動物類,並且把動物基本的特性繼承過來,如果覺得有些方法差異太大就覆蓋掉,同時增加新的特性封裝成一個新的類,然後例項化進行具體使用,還可以同時繼承多個類,拿到共性的方法或者屬性,這樣子能很好的繼承已經有的功能,特別積累並且繼承以前的功能。

    面向物件在程式碼量上會比面向過程的會少一些,畢竟有些功能方法可以直接繼承過來用,所以開發面向物件的程式設計師切換到面向過程會覺得特別不舒服,有些共有的方法直接繼承過來去用非常順其自然,面向過程呼叫更加突兀或者直接一點。面向物件在解決複雜是邏輯上更加佔據一定的優勢,而且越用越有感覺。

    如何理解面向物件的三個特性?

    1.封裝性

    就是把屬性和方法都放在一個類裡面,而且還可以透過訪問類的許可權屬性給區分開,更加安全,不想要釋放的功能,直接搞成私有機制,正好符合軟體架構裡面高內聚低耦合,自己內部的事情就不要暴露出來,外部介面儘量簡單,所以在設計上就符合軟體設計的理念,封裝性還具有安全性了,不想讓外部訪問的時候可以遮蔽。

    2.繼承性

    就是把之前已經實現好的程式碼或者方法透過繼承的方法拿過來使用,能節省大量的程式碼量,符合程式碼設計裡面的繼承優秀程式碼特性,而且寫好的類還能給後來的人繼續使用,面嚮物件語言更能形象的稱之為站在巨人的肩上

    3.多型性

    由於可以繼承多個類,能夠組合成多種特性,但多型的關鍵是覆蓋,就是同一個方法可以用不同的方式去實現,展現出多型性。

    雖然看似這些概念很簡單,說起來要比較容易,還是要真正在專案中去體現,真正透過程式碼來驗證自己的想法,透過大型的專案實戰再回歸研究這些基本的概念,就會對這個設計者充滿無線的欽佩。

  • 4 # 會點程式碼的大叔

    做了十多年的程式開發,對面向物件和麵向過程都有一定的瞭解,下面請讓我為大家就介紹一下這兩者的區別。

    面向過程 VS 面向物件

    面向過程:是以事件(功能)為中心,分析出解決問題的步驟,然後用程式碼實現這些步驟,並按照步驟的順序執行程式碼。

    面向物件:更像是組裝,設計出來事件(功能)有哪些物件組成,每個物件能做什麼事兒,然後將物件組裝起來,完成完整的功能。

    舉個例子,有一個需求,把大象放冰箱,需要幾步:

    面向過程:

    開啟冰箱門;

    把大象放進去;

    關上冰箱門;

    面向物件,這個裡面有兩個物件,分別是冰箱和大象:

    new 冰箱();

    冰箱.開門();//冰箱有個開門的方法

    冰箱.放入(new 大象());//冰箱有個“放入”的方法,需要傳入一個物件

    冰箱.關門(); //冰箱有個關門的方法

    看上去,面向物件好像需要的程式碼更多,但是新的需求來了,“把長頸鹿放冰箱需要幾步”:

    面向過程:具體不說了,繼續開啟、拿出、放入、關上就好了。

    面向物件,前幾步省略:

    冰箱.開門();//可以複用以前的方法

    冰箱.取出(大象);//增加取出方法

    冰箱.放入(new 長頸鹿());//複用,只是引數不同

    冰箱.關門(); //複用

    是不是發現,面向物件可以增加程式碼的複用性,那麼面向過程和麵向物件各自有什麼優缺點呢,我總結一下。

    各自的優缺點

    面向過程

    優點:效能非常高,所以嵌入式開發、微控制器等都是使用面向過程的開發;

    缺點:複用性、擴充套件性較差;不易維護;

    面向物件

    優點:複用性、擴充套件性好,還能做到模組之間的松耦合,更容易維護;

    缺點:效能方面比面向過程要差。

  • 5 # 老想飛的企鵝

    面嚮物件語言,關鍵在於物件,我理解中的好的程式中的物件應該會有一個真實世界的原型。

    所謂真實世界的原型,比如,多執行緒程式設計,如何合理的使用多執行緒,這個案例,反饋到真實世界,比如,有二十層樓,上面有兩百包大米,現在電梯壞了,我要把它們從頂樓搬運到一樓,如何處理?

    辦法1,請兩百人,去搬下來就是。

    這個辦法,出主意的人是比較省心的,但執行層面不一定合適。兩百人的工資比較高(佔用系統資源),樓道會很擁擠(多執行緒阻塞),每個人只要搬一包就行了,但我要給每個人開工資(資源浪費)。

    辦法2,請一個人,跑兩百躺(單執行緒,迴圈處理),這個人會非常累,而且要搬很久(cpu佔用率高,處理過程延時嚴重)。

    辦法3,請二十個人,每個人只負責負責一層樓的搬運(二十個執行緒,十九個快取佇列),這個辦法比起前兩種,從常識的角度分析就更合理

    當我們把程式裡的世界對應到真實世界的原型時,程式裡的世界會更加容易理解。這些原型,我們可以把它理解為物件。

    這些都是我個人的一些心得體會,書本上描述的定義都是對的,但一定要親身體會才會更加深刻

  • 6 # 將夢拉到現實

    題主的問題可以理解為“面向物件程式設計”與“面向過程程式設計"的區別:

    首先要明白什麼是面向物件程式設計,什麼是面向過程程式設計

    由此,要深入剖析什麼是物件,什麼是過程

    物件是什麼?客觀來講‘萬物皆物件’,面向物件程式設計就是將真實世界各種複雜的關係,抽象為一個個物件,然後由物件之間的分工與合作,完成對真實世界的模擬。

    1.什麼是面向物件程式設計?

    當實物被抽象成物件,實物之間的關係就變成了物件之間的關係,從而就可以模擬現實情況,針對物件進行程式設計。

    對於js來講物件是一個容器,封裝了屬性(property)和方法(method)

    要深入理解 “屬性是物件的狀態,方法是物件的行為(完成某種任務)” 思維!

    舉例說明:假設 狗(dog) 是一個物件

    屬性:狗的坐、立、跑、吃、睡。。。都可以透過一種 "狀態" 描述。

    這就構成了 "物件的屬性" 。

    方法:狗如何坐?如何立?如何吃?-----都可以透過一種 "方法" 實現。

    狗可以朝東坐,可以背朝前坐; 狗可以四隻腳立,也可以兩隻腳立。

    這種實現行為的方式方法,就構成了 "物件的方法"。

    這就是面向物件程式設計,簡單來講,就是將實物抽象的表現為一個個物件,透過物件間的相互作用,從而模擬現實實物之間的相互關係。

    2.什麼是面向過程程式設計?

    由於我學的是前端,多用面向物件的思維來解決問題,所以解釋可能不會太準確,之前為大家解釋了物件包含屬性和方法

    那麼面向過程就是方法的細分,方法的實現要一步步達到,不會一蹴而就,那麼這就是面向過程程式設計

    舉例說明:

    拿之前狗如何坐行為來做簡單的例子,狗由趴變為坐,要經歷哪幾步?

    首先要先站立,其次要擺定姿勢,然後可能才會達到坐的目的。

    這就是實現方法的細分,也可以理解為面向過程程式設計。

    其實“面向物件程式設計”中包含“面向過程程式設計”,“面向過程程式設計”中又包含“面向物件程式設計”。

    簡單講,面向物件程式設計可能需要藉助面向過程程式設計才能實現,同理,面向過程程式設計可能也需要藉助面向物件程式設計才能實現。二者間:你中有我,我中有你。

    舉例說明:小明要去北京。

    小明有自身的屬性:身高、體重、性別、姓名、、、、、

    小明去北京有自己的方法:火車、飛機、大巴、腳踏車、自己開車、、、、

    在實現去北京的方法時,可能需要藉助其它物件來達到這一目的,但是這個物件又不存在,所以需要我們重新 new 一個出來,這不是面向物件包含面向過程,面向過程又包含面向物件的體現嗎?

    個人只是一個新學習前端的小白,可能回答有些片面,大家將就看哈,不認同的大可一笑而過。

  • 7 # 13號檔案館

    用最簡單每個人都會做的事為例子簡單的闡述下,相信每個人都知道了。

    例子:洗衣服

    面向過程:首先你得把足夠的水放進一個大盆裡,並且放入洗衣粉。其次,你再一件一件的用手去搓洗衣服,每搓洗完一件,就放旁邊,直到所有衣服都洗完。然後你在重新放水,把洗好的衣服用清水清洗一遍。最後在一件件的擰乾。

    面向物件:把所有衣服放入洗衣機,按下放水鍵,按下功能鍵,按下開始鍵。去玩局LOL,回來衣服就洗好了。

    洗衣機就是物件,這個物件裡封裝了“放水”“洗衣”“清洗”“甩幹”等功能。這些都是物件去幫你操作,你要做的就是根據你的需求去操作這個物件。

    這個例子小白或者剛學習程式設計的朋友而言,理解起來就簡單易懂了。

    其實生活中處處都是面向物件。學習程式設計的時候都會結合一些例子來記憶,這樣理解也深刻。

  • 8 # MaccreeMa

    提出這個問題應該對面向過程有基本瞭解。

    面向物件是需要把物件該有的一切方法都做好,以求複用,移植方便

    比如面向物件的程式設計 寫一個五子棋遊戲

    要有初始化,白棋物件,黑棋物件,判勝方法,走棋規則

    如果需要移植,你只需要把五子棋物件檔案複製過去,呼叫五子棋物件即可

    如果是面相過程,你需要完全理解所有步驟,逐一複製

  • 9 # 中原一點紅3341

    面向過程需要你事無鉅細,一步一步為程式設計好流程。但是在處理特別大的程式時,人很容易犯錯。面向物件可以將很多基礎功能打包成模組,減小工作量。另外未來的人工智慧,只能面向物件,否則不會有突破。未來一定是機器製作機器,程式開發程式,人腦固有侷限性。日常普通應用還是面向過程比較簡單

  • 10 # 一瑜一琂

    面向過程和麵向物件的本質區別是抽象方式不同!

    面向過程將問題抽象為一組資料結構以及對這些資料結構進行操作的方法

    面向物件將問題抽象為一組物件以及物件之間的互動

    函數語言程式設計將問題抽象為一組函式以及函式之間的互動

    面向物件的三大特性:封裝、繼承、多型。有嚴重的誤導性!

    無論是面向過程還是函數語言程式設計,都有類似封裝、繼承和多型的機制!

    對面向物件的三大特性的描述,實際上少了字首,應該是「基於類的封裝」,「基於類/物件的繼承」,「基於繼承的多型」!

  • 11 # 北漂程式設計師小津

    舉個生活中的例子,如何把大象放進冰箱裡。這個任務確定需要三個步驟來解決。1、把冰箱開啟,2、把大象裝進去,3、把冰箱門關上,每一個過程都有階段性的目標,把冰箱開啟,開啟後得到的是冰箱。把大象裝進去,開門後得到的是裡面裝好大象的冰箱。把門關上,開啟門,裝好大象,獲得關好門的冰箱。依次完成這些過程,就能把大象裝進冰箱裡。面向物件是把構成問題的事務分解成各個物件。建立物件的目的不是為了完成一個步驟,而是為了敘述某個事物在整個解決問題步驟當中的行為。簡單地說,就是構造一個物件模型。將資料與方法組織在一起,那麼,將上述的案例用面向物件的思想實現一下,就是這樣一個流程。為了把大象裝入冰箱,需要做三個動作,或者是叫做行為,每個動作有一個執行者。他就是物件。冰箱就是一個物件。具體的三個步驟。1、冰箱你給我把門開啟,2、冰箱你給我把大象裝進去。3、冰箱你給我把門關上。依次做這些動作,就能把大象裝入冰箱裡。面向物件是一個模型化的,你只需要抽象出一個類。比如本例中的冰箱,而冰箱怎麼開門,冰箱怎麼裝大象。冰箱怎麼關門等功能封裝在冰箱的實際方法當中。

    從這個例子當中,我們可以看出,面向過程是具體化、流程化的,解決一個問題,你需要一步一步的分析,一步步的實現。但設計人員只考慮實現客戶的需求,不考慮以後的擴充套件。一旦客戶的需求有變化,那麼需要修改的程式碼量就很大,耗時耗力。而面向物件的程式設計,許許多多東西都是獨立的。強調的是物件的重複使用,資料和資料相關的操作被包裝成物件,每個物件是完整獨立的。一個物件做好一件事情,物件內部的細節,外面世界不關心也看不到。同時,不同種類的物件之間的依賴性降低,這將降低程式之間的耦合性。而所有的這些都有助於達成一個崇高的目標,就是可重用性。實際上,面向物件是在面向過程的基礎上,兩種思想不是非彼即此的對立關係。不能說面向物件取代了面向過程,如果用面向物件,就要把一個軟體任務劃分成兩個層次。那麼,面向物件是解決第一層次的問題,面向過程是解決第二層次的問題。只有兩個層次上的任務都完成之後,才能說完成了整個程式的設計任務。

  • 中秋節和大豐收的關聯?
  • 《三國演義》中,劉備武有五虎將、謀有龍鳳,為何沒能統一天下?