l

2012年1月23日 星期一

什麼是物件導向(2):Object, Class, Instance

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)
  • InstanceAn 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各表」算是同義詞嗎?

12 則留言:

  1. 嗯,從該書的定義上,似乎並沒有說object跟instance是一樣的東西。這樣的確是比較好的作法,因為有不少OOPL是以prototype的型式進行OOP,像Javascript,也有不少語言將class也視為object,像Python與Ruby。

    不過對於simula-like的OOPL(C++),的確可以將instance與object與instance視為同義詞。

    回覆刪除
  2. object在理論上的定義的抽象性高上了不少,在不同的開發平台與環境都可能有不同的確實意義。比較安全的說法或許是:某個class的instance會是一個object。 :-)

    Happy New Year.

    回覆刪除
  3. 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當做同樣的東東啦。

    回覆刪除
  4. OOSE那本書這個地方寫得非常好,應該說它是經典啊:D

    我個人的看法:
    其實Object本身來說,就是把一堆資料與相對應處理的程式作組合,變得好像是一個角色一樣(叫它Role-Play Oriented好像也沒啥不好?)

    所以我想instance本身來說,它想強調:
    我是範本文件生出來的新文件
    而Object本身代表的是:
    可以編輯的文件
    而Class則是:
    範本文件

    所以instance與object當然不一樣囉~
    因為白馬非馬(無誤)

    咳,正經點,應該說:
    instance強調是從class範本生出來的副本
    object強調有血有肉有狀態的抽象實體化資料結構及程式碼

    而這裡所提到的instance是指an instance of a class,所以它當然是個object

    一點murmur :P

    回覆刪除
  5. 對OO我只是業餘興趣啦...

    Anyway,回到這個問題,其實以自然語言並不容易描述抽象概念,所以有不少學者嚐試以數學的方式來定義物件導向,以object calculi作為關鍵字可以挖到不少寶。書的話,我覺得"A Theory of Objects"整理的很不錯,不過這個領域的研究進展頗快,書籍可能又會與學者的最新看法有些出入了。:P

    說起來也蠻有趣的,lambda calculus為functional programming奠定了紮實的理論基礎,但FP卻沒有在業界流行,反倒是OO先以實務上的需求為出發,然後在近年來才陸續被補上理論去說明各式OO系統。

    回覆刪除
  6. functional language似乎在最十年有在流行,像是Erlang之類的,以及Haskell
    我覺得上面那兩個可以說是超級強的了,尤其是Erlang,有些公司還要求要會Erlang以便寫平行運算的程式

    回覆刪除
  7. 作者已經移除這則留言。

    回覆刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 作者已經移除這則留言。

    回覆刪除
  10. 我覺得 http://meebox.blogspot.tw/2006/11/object-instance.html 講的較清楚,通常 instance 會伴隨所屬的類別出現,可翻成實例或實體。

    回覆刪除
  11. 謝謝Teddy分享這系列~感覺滿實用的!但是有發現一個小錯,如下:
    An instanceis an object created from a class.
    Teddy這句話少了一個空格,應該是An instance is an object created from a class.

    回覆刪除
  12. 一個路人在此路過,感謝大大把物件導向的用語解釋這麼清楚

    對於從一個熟悉 C 語言的我
    從 C 的觀點來看,ojbects 其實是類似「指標」的概念,
    而 instance 其實就是「指標」底下的「實體內容」,
    兩個不同的指標變數 可以同時指向 相同的實體內容。

    而 class 就相對於 structure。

    回覆刪除