[从架构到设计]第二回:对象的旅行---对象和人,两个世界,一样情怀(转载)...
[從架構到設計]
第二回:對象的旅行---對象和人,兩個世界,一樣情懷?
?
發布日期:2007.9.3 作者:Anytao
?2007 Anytao.com ,原創作品,轉貼請注明作者和出處。
?
??????????????????????????????????????????????????????????????????????????????????????????????????對象和人,兩個世界,一樣情懷
1.?引言
提起面向對象,每個程序設計者總會說出一堆自己的理解,有獨特的、有偏廢的,不盡而然。但是無論所云,幾個基本的概念總會得到大家的首肯,它們是:類、對象、繼承、封裝和多態。很對,差不多就是這些概念構成了面向對象設計開發技術的基本邏輯,成為數以千萬計程序設計者不懈理解和實踐的標語。而實際上,理解面向對象一個重要的方法就是以實際的生活來類比對象世界,對象世界的邏輯和我們生活的邏輯形成對比的時候,我們的理解將會更有親切感,深入程度自然也就不同以往,因為誰能對生活沒有理解呢?
本文,就從對象這一最基本元素開始,進行一次深度的對象旅行,把.NET面向對象世界中的主角來次遍歷式曝光。?把對象的世界和人類的世界進行一些深度類比,以人類的角度來戲說對象,同時也以對象的邏輯來反思人類。究竟這種品查,會有什么樣的洞悉,看我且來演義。
2 出生
對象就像個體的人,從生而來,入世而歸。
我們對對象的戲說就從對象之生開始吧。首先,看看一個對象是如何出生的:
??????? ????Person aPerson = new Person("Xiao Wang", 27);
那么一個人又是如何出生呢?每個嬰兒隨著一聲啼哭來到這個世界,鼻子是鼻子、嘴巴是嘴巴,呱呱落地,一個可愛的生命來到人間。可見,懷胎十月是人出世之前的成長過程,母親為孩子提供了一切出世為人的環境,這個過程就是一次實實在在的生物化構造。同樣的道理,對象的出生,也是一次完整的構造過程:首先會在內存中分配一定的存儲空間;然后初始化其附加成員,就像給人取個標識的姓名一樣;最后,再調用構造函數執行初始化,這樣一個對象實體就完成了其出生的過程,例如上例中我們為aPerson對象初始化了姓名和年齡。
正如人出生之時,一身赤裸沒有任何的附加品,一切的所屬品將在生命的旅程中逐漸完善,生不帶來就是這個意思。對象的出生也只是完成了對必要字段的初始化操作,其他的數據要等后面的操作來完成。例如對屬性賦值,通過方法獲取必要的信息等待。?
3 旅程
新生的孩子一經出世,就來到人間,加入了人類這個大家庭,社會這個大環境。從而經歷一次在人類倫理與社會規則的雙重標準中生活,這就是人的旅程。同理,對象也一樣。
最為個體的人,首先是有類型之分的,農民、工人、學者、官員等等,為的是方便管理,所以形成的社會規則就是農民一般居住在農村,工人一般生活在城市,學者探討知識,官員管理國家。
對象也是一樣,是有類型的,例如整型、字符型等等。當然,分類的標準不同,得到的角度也會不同,但是常見的分類就是值類型和引用類型兩種。其依據是對象在運行時在內存中的位置,值類型位于線程的堆棧,而引用類型位于托管堆。正如,農民也可以進城生活,工人也可以隱居于鄉村,值類型和引用類型的角色也會發生轉變,這個過程在面向對象中稱為裝箱與拆箱。這點倒是有些變相的貼切,農民進城,工人回鄉,不都得把行李裝進箱子里折騰嘛。
作為人,我們都是有屬性的,例如你的名字、年齡、籍貫等等,用于描述了你的狀態信息,同時每個人也有不同的行為來操作自己的屬性,實現了與外界進行交互的手段。對象的字段、屬性就是我們自己的標簽,例如人的姓名、性別、年齡和身份;而方法就是操作這些標簽的行為。人的名字來自于父母,是每個人在出生之時構造的,這和對象產生時給字段賦值一樣。但是每個人都有隨時更名的權力,這種操作自己名稱的行為,我們稱之為方法。在面向對象中,可以像這樣來完成:
??????????? aPerson.ChangeName("Apple Boy");
所以,對象的旅行過程,在某種程度上就是以方法與外界進行交互,從而達到改變對象狀態信息的過程,這也和人的生存過程是一致的。
人與人的交互是通過語言。既然生則為人,就必然和這個世界的其他人發生交流與切磋,從而才構成一個流動的社會群體,這應該是社會學的基本常識。在對象的世界里,你得絕對相信對象之間也是相互關聯的,不同的對象之間發生著不同的交互性操作,那么對象的交互是通過什么方式呢?對象的交互方式被記錄在一個稱為設計模式的魔法書中,當你不解以什么樣的方式建立對象與對象之間的關系時,學習前人的經驗是最好的選擇,有時候彎路就是這樣變成捷徑的。
下面,我們簡要的分析一下對象到底旅行在什么樣的世界里?
對象的載體是CLR,而人的載體是社會。CLR提供了對象賴以生存的規則,稱之為語法,例如類型、繼承、多態、垃圾回收等等,對象世界建立了真正的法制秩序;而社會提供了人行走江湖的秩序,稱之為法律,例如版權、人權、產權,這是我們力圖實現的社會秩序。
人類社會就是系統架構,也是分層的。上層建筑代表管理與民主,而人民大眾則在底層完成價值的創造。上層建筑靠協約與法律來管理個體的人,在對象世界中,這稱之為接口。面向接口的編程就是以接口方式來抽象變化,從而形成體系。而人類不是也以法律手段來維系社會體系的運作和秩序嗎,這是它們的神似。
??? 由此可見,對象的旅行就是這樣一個過程,在一定的約定與規則下,通過方法進行彼此的交互操作,從而達到改變本身狀態的目的。雖然這種概括未免牽強,但是從最簡單的方式理解實際情況,也確實如此,這些體會的確可以從人的旅程中得到啟示。
4 插曲
??? 接下來,我們以幾個最熟悉的概念來進一步闡釋對象世界與人類世界的和諧統一。
??? 關于繼承。人的社會中,繼承一般發生在有血緣關系的族群中。最直接的例子一般是,兒子繼承父親,包括姓氏、基因、財產和一切可以遺留的東西。但并不代表可以繼承所有,因為父親隱私的那一部分屬于父親獨有,不可繼承。當然,也可能是繼承于族群的其他人,視實情而定。而在面向對象中,繼承無處不在,子類繼承父類,以訪問權限來實現不同的控制規則,稱為訪問級別,主要包括:
| 訪問修飾符 | 訪問權限 |
| pubic | 對訪問成員沒有限制,屬于最高級別訪問權限 |
| protect | 訪問包含類或者從包含類派生的類。 |
| internal | 訪問僅限于程序集。 |
| protected internal | 訪問僅限于從包含類派生的當前程序集或類型。也就是同一個程序集的對象,或者該類及其子類可以訪問。 |
| private | 訪問僅限于包含類型。 |
這些規則,以人的視角來理解,我們以公司的體制來舉例說明,將公司職權的層級與面向對象的訪問權限層級做以類比,應該是這個樣子:
·?????? public,具有最高的訪問權限,就像是公司的總經理具有最高的決策權與管理權,因此public開發性最大,是的不管是同一個程序集或者不管是否繼承,都可以訪問;
·?????? protected,類似于公司業務部門經理的職責,具有對本部門的直接管轄權,在面向對象中就體現為子類繼承這種縱向關系的訪問約定,也就是只要繼承了該類,則其對象就有訪問父類的權限,而不管這兩個具有繼承關系的類是否在同一個程序集中;
·?????? internal,具有類比意義的就是internal類似于公司的職能部門的職責,不管是否具有上下級的隸屬關系,人力部都能管轄所有其他部門的員工考勤。這是一種橫向的職責關系,在面向對象中用來表示同一程序集的訪問權限,只要是隸屬于同一程序集,則對象即可訪問其屬性,而不管是否存在隸屬關系。
·?????? protected internal,可以看作是protected internal的并集,就像公司中掌管職能部門的副總經理,從橫向到縱向都有管理權。
·?????? private,具有最低的訪問權限,就像公司的一般員工,管好自己就行了。因此,對應于面向對象的開發性最小。
??? 另外,對象中的繼承的目的是提高軟件復用,而人類中的繼承,不也是現實中的復用嗎????
關于多態。人的世界中,我們常常在不同的環境中表現為不同的角色,并且遵守不同的規則。例如在學校我們是學生,回到家里是兒女,而在車上又是乘客,同一個人在不同的情況下,代表了不同的身份,在家里你可以撒嬌但是在學校你不可以,在學校你可以打球但在車上你不可以。所以這種身份的不同,帶來的是規則的差異。在面向對象中,我們該如何表達這種復雜的人類社會學呢?顯然,我們讓不同角色的Person繼承同一個接口:IPerson。然后將不同的實現仍給不同角色的人自行負責,不同的是PersonAtHome在實現時可能是CanBeSpoil (),而PersonOnBus可能是BuyTicket()。不同的角色實現不同的規則,也就是接口協定。在使用上的規則是這個樣子:
??????????? IPerson aPerson = new PersonAtHome();
??????????? aPerson.DoWork();
另一個角色又是這個樣子:
??????????? IPerson bPerson = new PersonOnBus();
??????????? bPerson.DoWork();
由此帶來的好處是顯而易見的,我們以IPerson代表了不同角色的人,在不同的情況下實現了不同的操作,而把決定權交到系統自行處理。這就是多態的魅力,其樂無窮中,帶來的是面向對象中最為重要的特性體驗。記住,很重要的一點是,DoWork在不同的實現類中體現為同一命名,不同的只是實現的內部邏輯。
?
?
由此可見,以我們自己的角度來闡釋技術問題,有時候會有意想不到的收獲,否則你將被淹沒在諸如為什么以這種方式來實現復用的叫喊中不能自省。換一個角度,理一種思路,眼界與思路都會更加開闊。
?
5 消亡
對象和人,有生必然有死。在對象的世界里,它的生命是由GC控制的,而人的世界我們把GC稱作為自然規律。不死的人,就像進入死循環的對象,都是違反規則的,終究被Kill的命運。
在這一部分,我們首先觀察對象之死,以此反思和體味人類入世的哲學,兩相比較,也會給我們更多關于自己的啟示。對象的生命周期由GC控制,其規則大概是這樣:GC管理所有的托管堆對象,當內存回收執行時,GC檢查托管堆中不再被使用的對象,并執行內存回收操作。不被應用程序使用的對象,指的是對象沒有任何引用。關于如何回收、回收的時刻,以及遍歷可回收對象的算法,是個較為復雜的問題,我們將以專題加以討論。不過,從這個回收過程中,足以給人類更多的啟示來反思,自己生存與世的道理,大自然就是那么看不見的GC,要想努力的活著,就不要使自己變成可回收的垃圾,而是有益與人的人。
5. 結論
程序世界其實和人類世界有很多相似的地方,本文就以這種類比的方式來詮釋程序世界的主角如何類似于人類社會的主角,以演化推進的手段來描述面向對象程序世界的主角:對象由生而死的全過程,借以品味一下復雜的人類世界主角。人,也是可以簡單的。所以這是一種相互的較量,也是一種相互的借鑒。
本篇純屬戲說,若有雷同,望請笑納。
轉自:http://www.cnblogs.com/anytao/archive/2007/09/03/anytao_design_02.html
轉載于:https://www.cnblogs.com/dirichlet/archive/2010/11/23/1885963.html
總結
以上是生活随笔為你收集整理的[从架构到设计]第二回:对象的旅行---对象和人,两个世界,一样情怀(转载)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解Ubuntu中pidgin登陆IRC
- 下一篇: abap:常用TCODE