物件導向是什麼

更新於 發佈於 閱讀時間約 3 分鐘

在現代,物件導向雖然仍是主流,函數式慢慢得到關注。物件導向並不適合所有的程式邏輯,但在像是Java的物件導向的程式語言中,幾乎所有值都被當作物件,因此在一些情境下Java寫起來會非常冗余。物件導向流行的原因大概是因為它的思考方式比較符合我們對於世界的認知,但邏輯推理與解決問題的方式卻不一定符合我們的想像,若是硬要用物件導向的方式設計程式,就會使得程式架構變得奇形怪狀。或許是因為程序猿累積了足夠多的失敗經驗,又或是人類對於世界的認知改變了,物件的思考方式在最近漸漸的被放棄。然而究竟什麼是「物件」?


「物件」這個詞似乎一直沒有明確的定義,只是一個抽象的概念。在這裡我想討論的是物件(class/object)與結構(struct)差在哪裡。c++中class與struct基本上是沒有任何差異的,但有些人會特別選用其中一種定義,而我想探究其背後的想法。


對於c#來說,class與struct最大的差別就是ref/value type:物件總是以參考的方式傳遞。Java也有類似的特性,只是Java只有一些原始類別是value type。只有在這種刻意消除指標概念的GC程式語言才有這種差別,很多高階程式語言如Python, JavaScript 等都有相同的特性。這種消除指標的做法跟函數式非常像,由於參考透明的特性,大多數函數式程式語言都沒有記憶體的概念。然而這類物件導向的程式語言卻非常依賴資料的修改,因此就算沒有指標的概念,有時也必須要判斷變數是否是同一個「東西」,而這種身份的判斷就形成了物件的概念。然而這只是把指標的概念簡化而已,雖然物件需要用指標,但並不是所有指標都是物件。然而在這類的程式語言就連陣列都被當作物件(我認為它不算物件,如果連一串數字都必須當作物件處理,就太過冗余了)。因此我不認為這是判斷是否應該用物件包裝的依據。


現代的物件導向主要有四個特性:封裝、繼承、多型、抽象。這些特性主要圍繞著一個設計理念 – 把程式分解為資料與相關的操作並封裝起來,而這個概念就形成了「物件」。然而一些結構如陣列和智慧指標也帶有方法,事實上方法就只是以物件為主要參數的函式而已。因此我認為有沒有方法並不是區分物件的指標。而「封裝」不一定要和資料綁在一起,只是對於屬於物件的資料來說這是必要的。但我認為提供物件層級的封裝會使得物件導向的模組化變的畸形複雜,最好的方法應該是讓封裝更容易控制,而非跟物件綁在一起。這種微妙的差異使得物件導向漸漸變成另一種怪物。


smalltalk 作為最早的物件導向程式語言,對於物件導向有另一種詮釋:物件是一種「對象」,你可以藉由方法跟他「溝通」以完成某些目的。這個解釋強調的是物件的「獨立性」,他具有某些隱藏的狀態,我們只能藉由溝通改變他的狀態。現代的物件導向延伸自這種詮釋,但重點卻變為封裝資料與方法。這種具有隱藏狀態的特性非常像閉包closure,事實上物件的確可以藉由閉包建構。我認為「閉包」最適合描述物件的概念,從這裡可以看到它與現代物件導向的差異。閉包的封閉性引導出了現代物件導向的封裝,但閉包並沒有複雜的存取控制,而這也不是它的主要目的。閉包本身也沒有繼承機制,而是藉由互相合作完成更複雜的功能,我認為這種分而治之的方法優於繼承。定義物件的目的應該是捕獲複雜的運算狀態,而不是為了抽象化某種行為。現代的物件導向依賴於繼承以達成抽象化,但相較於繼承,介面和泛型更適合描述行為的抽象化。物件導向一路走歪到現在,人們才發現做錯了,現在學習物件導向都會建議初學者少用繼承多用介面。我想最好的建議是不要使用現代的物件導向。

留言
avatar-img
留言分享你的想法!
avatar-img
have bear的沙龍
4會員
28內容數
這不是教你如何從物件導向到函數式編程的入門教程。我會深入探討物件導向與函數式編程的差異,並討論為什麼你應該使用函數式編程並徹底放棄物件導向。
have bear的沙龍的其他內容
2024/02/15
這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,
2024/02/15
這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,
2024/02/08
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
2024/02/08
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
2024/02/04
前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。 物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重
2024/02/04
前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。 物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
本文章深入探討物件導向程式設計的三大核心特性,包括封裝、多型和繼承。這些特性對於建立模組化、可擴充以及易於維護的程式架構至關重要。封裝確保資料的隱私和完整性,多型實現靈活的系統設計,繼承則促進程式碼的重用。瞭解這些概念將幫助開發者設計更高效的程式系統。
Thumbnail
本文章深入探討物件導向程式設計的三大核心特性,包括封裝、多型和繼承。這些特性對於建立模組化、可擴充以及易於維護的程式架構至關重要。封裝確保資料的隱私和完整性,多型實現靈活的系統設計,繼承則促進程式碼的重用。瞭解這些概念將幫助開發者設計更高效的程式系統。
Thumbnail
本文探討物件導向編程及其在面試中常見的必備知識,特別是物件導向與程序導向的基本概念與特性分析。此外,介紹了物件導向的五大原則——SOLID,分別為單一功能原則、開放封閉原則、里氏替換原則、介面隔離原則及依賴反轉原則,重點在於提高程式的維護性與擴展性。這些原則對於現代軟體設計具有重要的指導意義。
Thumbnail
本文探討物件導向編程及其在面試中常見的必備知識,特別是物件導向與程序導向的基本概念與特性分析。此外,介紹了物件導向的五大原則——SOLID,分別為單一功能原則、開放封閉原則、里氏替換原則、介面隔離原則及依賴反轉原則,重點在於提高程式的維護性與擴展性。這些原則對於現代軟體設計具有重要的指導意義。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這篇文章介紹物件導向程式設計(OOP)的基本概念,包括類和物件的定義以及四大核心概念:封裝、繼承、多型和抽象。讀者將瞭解如何在Python中定義類和物件,並學習如何使用這些OOP特性來構建更具組織性和可維護性的程式碼。透過實例,文章探討如何將真實世界的物件模擬到程式設計中。
Thumbnail
這篇文章介紹物件導向程式設計(OOP)的基本概念,包括類和物件的定義以及四大核心概念:封裝、繼承、多型和抽象。讀者將瞭解如何在Python中定義類和物件,並學習如何使用這些OOP特性來構建更具組織性和可維護性的程式碼。透過實例,文章探討如何將真實世界的物件模擬到程式設計中。
Thumbnail
這本書在書單中很久了,前陣子有空繞去天龍書局發現有中譯版就買回家來翻翻 (沒錯,買中譯版 XD),一看很合胃口,很快就翻完了,心有戚戚焉的句子很多,特別是在最後一章關於框架設計的部分。
Thumbnail
這本書在書單中很久了,前陣子有空繞去天龍書局發現有中譯版就買回家來翻翻 (沒錯,買中譯版 XD),一看很合胃口,很快就翻完了,心有戚戚焉的句子很多,特別是在最後一章關於框架設計的部分。
Thumbnail
一、前言   這篇文章將會簡單介紹物件導向的設計模式,以及學習這項技術需要有哪些先備知識,學習才會比較順利。 二、設計模式   在物件導向中,除了最基本的五大原則以外,其實還有一知名的概念,那就是設計模式(Design Pattern),它能運用到很多層面。 1. 解決一再出現的問題   許多程式設
Thumbnail
一、前言   這篇文章將會簡單介紹物件導向的設計模式,以及學習這項技術需要有哪些先備知識,學習才會比較順利。 二、設計模式   在物件導向中,除了最基本的五大原則以外,其實還有一知名的概念,那就是設計模式(Design Pattern),它能運用到很多層面。 1. 解決一再出現的問題   許多程式設
Thumbnail
  物件導向說到這邊其實修飾詞不只有之前所提的public、private這些,還有可能遇到抽象(abstract)、虛擬(virtual)、覆寫(override)、隱藏(new)、密封(sealed)、介面(interface)等等,我們就來看一下它們的差異吧~
Thumbnail
  物件導向說到這邊其實修飾詞不只有之前所提的public、private這些,還有可能遇到抽象(abstract)、虛擬(virtual)、覆寫(override)、隱藏(new)、密封(sealed)、介面(interface)等等,我們就來看一下它們的差異吧~
Thumbnail
  物件導向(Object Oriented Programming,又稱OOP),在程式領域中很常會看到一些英文代稱,如果不懂的話就比較會不知道在說些什麼,所以除了知道中文名稱外也要稍微知道一下它的代稱是什麼會比較好唷! 一、什麼是物件導向?   把程式寫出來的功能集合成一個類別(class),接
Thumbnail
  物件導向(Object Oriented Programming,又稱OOP),在程式領域中很常會看到一些英文代稱,如果不懂的話就比較會不知道在說些什麼,所以除了知道中文名稱外也要稍微知道一下它的代稱是什麼會比較好唷! 一、什麼是物件導向?   把程式寫出來的功能集合成一個類別(class),接
Thumbnail
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
Thumbnail
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
Thumbnail
物件導向的概念,以python程式為範例。
Thumbnail
物件導向的概念,以python程式為範例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News