什麼是物件?

2016-07-25    分類:其他、程式設計開發、首頁精華0人評論發表於2016-07-25

本文由碼農網 – 孫騰浩原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

我們有成千上萬的面相物件書籍和成百上千的面相物件語言,我相信它們大多數給我們關於物件的定義是錯誤的。這就是為什麼整個物件導向世界充滿誤解與錯誤。它們給物件的定義基於所採用硬體架構,所以很原始很機械。我想介紹一種更好地定義。

什麼是物件?我做了一些小調查,發現如下回答:

  • “物件一般以域的形式包含資料,通常稱作屬性;以程式的形式包含程式碼,通常稱作方法”——文章編寫時摘自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?
翻譯作者:碼農網 – 孫騰浩
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章