什麼是物件?
本文由碼農網 – 孫騰浩原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
我們有成千上萬的面相物件書籍和成百上千的面相物件語言,我相信它們大多數給我們關於物件的定義是錯誤的。這就是為什麼整個物件導向世界充滿誤解與錯誤。它們給物件的定義基於所採用硬體架構,所以很原始很機械。我想介紹一種更好地定義。
什麼是物件?我做了一些小調查,發現如下回答:
- “物件一般以域的形式包含資料,通常稱作屬性;以程式的形式包含程式碼,通常稱作方法”——文章編寫時摘自Wikipedia.
- “物件在域中儲存自身狀態並通過方法暴露自身行為”——摘自Oracle.What Is an Object?
- “每個物件就如一個小型電腦——它有狀態,並且它提供操作,你可以呼叫執行”——Thinking in Java第4版,Bruce Eckel,第16頁。
- “一個類包含了存放數值的資料域和運算元值的的方法”——Java in a Nutshell第6版,Evans and Flanagan,第98頁。
- “一個物件就是儲存某些型別的值的記憶體空間”——The C++ Programming Language,第4版,Bjarne Stroustrup,第40頁。
- “一個物件包含一些私有記憶體空間和一些操作”——Smalltalk-80,Goldberg and Robson,第6頁。
這些定義都用了一個詞”包含”(或”儲存”,”有”,等等)。他們都認為物件是個存放資料的盒子。而這個觀點恰恰是我強烈反對的。
如果我們看一看C++或Java如何實現的,以上對於物件的定義聽起來在技術上是正確的。確實,對於每個物件,Java虛擬機器開闢一些位元組的記憶體來存放物件的屬性。因此,我們在技術上可以宣稱,在這些語言中,物件就是記憶體空間中儲存資料的盒子。
正確,但這太片面了。
讓我們來想象另一種面相物件語言,它不在記憶體中存放物件的屬性。一臉懵逼嗎?先忍耐我幾分鐘。讓我們來看看在這種與語言中定義一個物件:
c { vin: v, engine: e }
這裡,vin(車輛識別碼)和engine(發動機)是物件c的屬性(c是一輛車car;讓我們暫時忘記類,專注於物件)。因此,這僅僅是包含兩個屬性的物件。第一個是車的車輛識別碼,第二個是它的發動機。車輛識別碼是v物件,發動機是e物件。為了更好理解,Java中可以這樣表示:
char[] v = {'W','D','B','H',...'7','2','8','8'}; // 17 chars Engine e = new Engine(); Car c = new Car(v, e);
對於Java虛擬機器我不太瞭解,不過在C++中,這樣的物件會佔用25位元組的記憶體(在64位x86架構下)。前面17位元組儲存字元陣列,後8個位元組是指向物件e所在記憶體塊的指標。這就是C++編譯器如何理解物件,並把它們應用於x86架構。在C++中,物件就是各資料屬性被清晰定義配置的資料結構。
在這個例子中,屬性vin和engine並不相同:vin是“資料”,engine是指向另一個物件的“指標”。我這樣設計的目的就是展示只有vin可以稱得上是存放資料的盒子。只有當資料確實在物件內部的時候,我們才能稱物件是存放資料的盒子。對於engine,這並不正確,因為資料並沒有真正在物件內部,它是通過指標指向另一個物件。如果我們的物件只有engine屬性,那它只佔8位元組的記憶體,而且並不是真正的資料。
現在,回到我們虛構的語言中。讓我們想象一種區別於C++的處理物件的方式——並不在記憶體中儲存物件屬性。它沒有指標,也不瞭解x86架構。它只知道屬性屬於物件。
因此,在我們這個語言中,在技術概念上物件不再是存放資料的盒子。它們知道資料在哪裡,但是它們不包含資料。它們表示資料,就像其他物件和實體一樣。的確,物件c在我們想象的語言中表示兩個其他物件:vin(車輛識別碼)和engine(發動機)。
簡而言之,我們要明白儘管在大多數程式語言中對物件的機械定義是正確的,但把物件當做存放資料的盒子在概念上是不正確的。這會驅使我們程式化思考並嘗試訪問資料。
如果我們把物件作為資料的“表示(representative)”而不是容器,我們不會立刻去獲取資料。我們會明白資料遙不可及。我們與物件互動——而且並不需要關心物件如何與資料互動。
我希望在不久的將來,會出現一種新的面相物件語言,不把物件作為資料結構存放在記憶體中,甚至是在技術層面上。
順便說一下,這是我最喜歡的書定義的物件Object Thinking,David West,第66頁:
物件相當於構成宇宙的量子。
你怎麼想?是否和我提出的“表徵(representative)”有異曲同工之妙呢?
譯文連結:http://www.codeceo.com/article/what-is-object.html
英文原文:What Is an Object?
翻譯作者:碼農網 – 孫騰浩
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 什麼是BOM物件物件
- js基礎梳理-究竟什麼是變數物件,什麼是活動物件?JS變數物件
- 什麼是物件儲存?物件
- 什麼是物件,為什麼要物件導向,怎麼才能物件導向?物件
- 什麼是物件?什麼是抽象?怎麼理解物件導向的程式設計思想?物件抽象程式設計
- JavaSE什麼是物件導向?Java物件
- 內建物件、宿主物件和本地物件是什麼物件
- 什麼是偽物件設計模式物件設計模式
- 什麼是Date物件一個內建物件Date:物件
- 為什麼Java字串是不可變物件?Java字串物件
- 為什麼物件是大勢所趨?物件
- DDD | 03-什麼是實體物件物件
- 物件導向中類和物件的定義是什麼?物件
- Python中的類和物件是什麼Python物件
- em單位的參考物件是什麼物件
- 什麼是應急響應?網路安全應急響應的物件是什麼?物件
- C++類和物件是什麼?C++類和物件詳解C++物件
- 什麼是cookie,什麼是sessionCookieSession
- 什麼是DNS,什麼是HostsDNS
- 什麼是模式? 什麼是框架?模式框架
- 這是什麼這是什麼
- DDD中實體與值物件是幹什麼的物件
- 在Java中建立物件的不同方法是什麼?Java物件
- 什麼是序列化?物件和類的區別?物件
- XML簡明教程(4)什麼是XML物件模型(轉)XML物件模型
- 什麼是WebAuthn、FIDO 是什麼?Web
- ITIL是什麼意思?ITIL是什麼?
- 什麼是跨域,什麼是同源跨域
- Python - 物件導向程式設計 - 什麼是 Python 類、類物件、例項物件Python物件程式設計
- 什麼是.NET平臺、什麼是c#、什麼是ASP.NET。C#ASP.NET
- 不要問程式設計師什麼是“物件”,也不要給他介紹“物件”程式設計師物件
- 用java進行物件導向程式設計,物件導向是什麼意思Java物件程式設計
- 等級保護物件是指什麼?是指整個單位嗎?物件
- ftp是什麼,ftp是什麼東西?FTP
- Java是什麼_Java是做什麼的?Java
- 什麼是正向代理?什麼是反向代理?
- NLA是什麼?NLA的原理是什麼?
- ###什麼是Linux核心###什麼是MMULinux