January 21 22:58~January 22 00:10
鄉民們看到這篇的日子應該是大年初一,先跟大家說聲新年快樂。
這次要介紹在物件導向技術中三個經常容易搞混的名詞,分別是object、class、instance。首先看一下Object-Oriented Software Engineering這本書對於這三個名詞的定義:
- Object:An object is characterized by a number of operations and a state which remembers the effect of these operations.(p.44)
- Class:A class represents a template for several objects and describes how these objects are structured internally. Objects of the same class have the same definition both for their operations and for their information structures.(p.50)
- Instance:An instanceis an object created from a class. The class describes the (behavior and information)structure of the instance, while the current state of the instance is defined by the operations performed on the instance.(p.50)
以下為上述定義翻成白話文再加上一點Teddy個人補充的資料:
- Class是用來定義object的一種東西,class的內容包含了動作(operations)與資料(data)。
- 動作(operations)、方法(methods)和行為(behaviors)可以看作同義詞。理想上一個object的狀態只能透過動作去改變它。
- 一個object就是某個class的instance,換句話說可以把object和instance看作是同樣的東西。只是在某些場合大家比較習慣用object這個說法,其他場合則是會用instance。例如,
List<String> a = new LinkedList<String>();
List<String> b = new LinkedList<String>();
你可以說「a、b兩個ojbects各指到一個LinkedList類別的instance」或是說「a、b兩個ojbects各指到一個 LinkedList類別的object」,但是如果程式變成下面這樣:
a = b;
那麼說成「a、b兩個ojbects都指到一個相同的LinkedList類別的instance」,或是更簡單一點「a、b都指到同一個instance」會比「a、b都指到同一個object」意思要來的清楚一點。
- 資料成員(data members)和屬性(attributes)是同義詞,都是用來儲存物件的狀態。如果一個class沒有任何資料成員,這個class所產生的所有objects看起來就會是一模一樣的東西。也就是說,可以把一個沒有狀態的class變成一個static class,不用產生任何instance就可以呼叫該class的operations。
- 物件與物件之間的關係可以簡化成兩種:aggregation和association,請參考GoF Design Pattern, pp.22-23。
***
看到這邊不知道鄉民們會不會有一個疑問:同樣的東西幹嘛搞出不同的說法啊?這就是「阿斗仔」厲害的地方啦。
***
友藏內心獨白:「九x共識」跟「一x各表」算是同義詞嗎?
嗯,從該書的定義上,似乎並沒有說object跟instance是一樣的東西。這樣的確是比較好的作法,因為有不少OOPL是以prototype的型式進行OOP,像Javascript,也有不少語言將class也視為object,像Python與Ruby。
回覆刪除不過對於simula-like的OOPL(C++),的確可以將instance與object與instance視為同義詞。
object在理論上的定義的抽象性高上了不少,在不同的開發平台與環境都可能有不同的確實意義。比較安全的說法或許是:某個class的instance會是一個object。 :-)
回覆刪除Happy New Year.
Hi 小鄭:
回覆刪除謝謝小鄭的補充,看來您對OO頗有研究。Teddy用過的OO languages沒有那麼多啦,有空是應該去惡補一下其他的OO languages...。
參考「課本」第50頁的說法:In object-oriented systems, each object belongs to a class. An object that belongs to a certain class is called an instance of that class. We therefore often use object and instance as synonyms. 所以Teddy就「大膽假設一下」把 object 和 instance當做同樣的東東啦。
OOSE那本書這個地方寫得非常好,應該說它是經典啊:D
回覆刪除我個人的看法:
其實Object本身來說,就是把一堆資料與相對應處理的程式作組合,變得好像是一個角色一樣(叫它Role-Play Oriented好像也沒啥不好?)
所以我想instance本身來說,它想強調:
我是範本文件生出來的新文件
而Object本身代表的是:
可以編輯的文件
而Class則是:
範本文件
所以instance與object當然不一樣囉~
因為白馬非馬(無誤)
咳,正經點,應該說:
instance強調是從class範本生出來的副本
object強調有血有肉有狀態的抽象實體化資料結構及程式碼
而這裡所提到的instance是指an instance of a class,所以它當然是個object
一點murmur :P
對OO我只是業餘興趣啦...
回覆刪除Anyway,回到這個問題,其實以自然語言並不容易描述抽象概念,所以有不少學者嚐試以數學的方式來定義物件導向,以object calculi作為關鍵字可以挖到不少寶。書的話,我覺得"A Theory of Objects"整理的很不錯,不過這個領域的研究進展頗快,書籍可能又會與學者的最新看法有些出入了。:P
說起來也蠻有趣的,lambda calculus為functional programming奠定了紮實的理論基礎,但FP卻沒有在業界流行,反倒是OO先以實務上的需求為出發,然後在近年來才陸續被補上理論去說明各式OO系統。
functional language似乎在最十年有在流行,像是Erlang之類的,以及Haskell
回覆刪除我覺得上面那兩個可以說是超級強的了,尤其是Erlang,有些公司還要求要會Erlang以便寫平行運算的程式
作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
回覆刪除我覺得 http://meebox.blogspot.tw/2006/11/object-instance.html 講的較清楚,通常 instance 會伴隨所屬的類別出現,可翻成實例或實體。
回覆刪除謝謝Teddy分享這系列~感覺滿實用的!但是有發現一個小錯,如下:
回覆刪除An instanceis an object created from a class.
Teddy這句話少了一個空格,應該是An instance is an object created from a class.
一個路人在此路過,感謝大大把物件導向的用語解釋這麼清楚
回覆刪除對於從一個熟悉 C 語言的我
從 C 的觀點來看,ojbects 其實是類似「指標」的概念,
而 instance 其實就是「指標」底下的「實體內容」,
兩個不同的指標變數 可以同時指向 相同的實體內容。
而 class 就相對於 structure。