廁所是如何建成的:趣談麵向對象編程 (圖)

本文內容已被 [ 葉雨 ] 在 2012-03-02 21:55:56 編輯過。如有問題,請報告版主或論壇管理刪除.

 

 

廁所是如何建成的:趣談麵向對象編程

-葉雨

說真的,一直想給小朋友們寫本教科書。因為我自己在小時候看見教科書特別害怕:不容易看懂。我感覺是似乎寫教科書的老學究們覺得一定要用晦澀深奧的語言來寫抖書包才算是有水平,要是通俗易懂,那就表示作者的水平低下,粗俗。

所以今天想跟立誌入門IT的筒子們侃一下當下編程流行的麵向對象的一些概念。

麵向對象的概念在我們的現實生活中也是無處不在,所以今兒咱們不談電腦,改拉家常。

那麽既然說麵向對象的概念無處不在,就舉個例子吧:用我們如何解決“小便”這個問題,來談談麵向對象的一些概念。

你的用戶需求是這樣的:我要小便,急。

為了解決這個艱巨的問題,葉雨來給你上堂課。我先問個問題:“你知道小便的方法有多少種嗎?”(估計我會被茴香豆砸死)

好了,你首先要搞清楚,你小便需要什麽?啥?廁所啊!你先忍著小便,聽葉雨講講如何蓋這個廁所。

我們要定義一下,什麽是廁所。首先,廁所是個廁所,但同時它又不是個廁所。暈了吧?嗬嗬,這就是我要的效果。你要在挨踢(IT)界混,你要學會的第一件事情,就是“紙上談兵”。

“紙上談兵”這個事情,做得不好就是:“瞎掰”,做得好就叫“抽象設計”(Abstract)。所以具有“抽象”能力的挨踢人看到的廁所就不是廁所,而是能把一些共性抽取出來而形成一個“類”。

“類”(Class) 在這裏就是建造廁所的藍圖。而“對象”(Object)就是用“廁所”的藍圖建造出來的實際“廁所”。現在懂了吧,為啥廁所(類)是個廁所(Class,藍圖),但同時它又不是個“廁所”(Object,實際建成的廁所實體)。

那麽我們從廁所裏除了能抽取糞便,還能抽取些什麽出來?

至少我們有:馬桶。這是構成所有廁所(中國旅遊區的廁所除外)的基本要素。

好了,所以在我們的藍圖上,我們有:馬桶。為了好聽起見,這些東西稱之為“屬性”(Attribute)。當然,針對馬桶可以有“解小便”這個動作,我們把這個動作稱之為“方法”(Method)。好了,

現在出現一個麵向對象的最重要的概念之一,就是“封裝”(Encapsulation)。說白了就是“自成一體”。那麽在“廁所”這個“類”裏,封裝了一個“屬性”:馬桶;也封裝了一個“方法”:解小便。

“封裝”真的太重要了。可以說沒有它就不可能存在真正的“麵向對象”。這麽說吧:商店裏在賣馬桶,你能跑進去對著馬桶就小便嗎?最起碼你得拿個什麽把四周 圍遮一下吧?你看,技巧就在這裏。就這麽“遮”一下,你就把馬桶給“封裝”成了一個“廁所”,從而可以自欺欺人地在裏麵舒暢。懂了吧?要是實在不懂就記住 祖國著名詩人趙麗華的詩:

“我堅決不能容忍
那些
在公共場所
隨地大小便
的人。”

真搞不懂為啥這麽多無聊的人在攻擊趙麗華。人家小姑娘用一首小絲就道破了“封裝”的重要性,難怪是國寶級的詩人,我們要好好保護才是。

說了這麽多,忘了問一個重要問題,您要男廁所還是女廁所啊?完了吧,原以為你能“封裝個”廁所趕緊讓你解決問題,現在連男女廁所都沒弄清!

還好,麵向對象裏麵有“繼承”(inheritance)功能。男廁所、女廁所,不都是廁所嗎?所以它們能繼承廁所“類”。因為男廁所和女廁所都繼承了“廁所”,所以“廁所”成了父類(Super Class),男廁所和女廁所成了子類(Sub Class)。

“繼承”是麵向對象的第二個重要概念。

好了,既然繼承了父類,我們蓋男廁所的時候就已經具備了父類(廁所)的所有屬性和方法。不過需要注意的是,在父類裏麵,“解小便”這個方法隻被解釋成“坐 著上”,沒有考慮到有些變態男人也能“站著上”。於是乎男人為了自己的自私目的,重新定義男廁所裏的“解小便”。這個方法的具體代碼就是“坐著上還是站著 上,看我心情如何”。女廁所也繼承了父類“廁所”的所有屬性,她們老老實實地沒有修改父類的“解小便”的具體代碼,那就是維持“坐著上”(別跟我抬杠說女 人不一定要坐著,你就可憐可憐男人吧。現代社會女人已經無所不能,男人隻剩下“站著上”這個最後專利了…..)

在子類各自解釋不同的父類方法時,我們發現了第三個重要概念:“多態性”(Polymorphism)。

多態性有幾種:男廁所類對廁所父類裏麵的“解小便”有了不同的詮釋。這個不同的詮釋是由於重寫父類的方法而得來的,所以這種多態性叫做基於重寫繼承(inheritance)的多態,也叫做“override”。

好了,喜歡抬杠的人就發話了:男廁所不是還有尿兜嗎?

好了,廁所父類定義了一個解小便的規格,那就是: 解小便(馬桶 某馬桶,小便者 某人)。
那麽在男廁所裏麵,除了我們有馬桶這個屬性,另外我們還有“尿兜”這個新屬性。
要注意,在“繼承”裏麵,我們強調了繼承父類和沿用/複用的特性。但是由於繼承產生的子類理所當然也會有自己特有的東西,例如這個男廁所裏的尿兜。

男人們因為父類的馬桶,而有了自己對使用馬桶的詮釋,然而還沒有對如何使用尿兜的詮釋。好在男人們自己發明了一個名稱相同,但是參數不同的解小便新規格:解小便(尿兜 某尿兜,小便者 某人), 而其具體實現的方法就是“站著上”。

好了,現在在男廁所裏,男人們可以有兩個小便的方法可以選擇:
解小便(馬桶 某馬桶,小便者 某人), 實現方法:“坐著上還是站著上,看我心情如何”。
或者:
解小便(尿兜 某尿兜,小便者 某人),實現方法:“站著上”。

這就出現了第二個多態性,叫做同一個類裏麵基於同名方法的不同簽名的多態性,還是老外簡單,把這個叫“overload”。要注意override跟overload的區別。

男人可以選擇站著或者坐著小便,一會兒override,一會兒overload,不如就叫“多態男”,或者隻呼“變態男”算了!

總結一下:所謂麵向對象三大特性就是:封裝,繼承,多態(變態)。

好啦,我們偉大的男廁所建成了!你給了我幾百萬,我給你蓋了個是富麗堂皇、鑲金鍍銀的廁所,不錯不錯!

不過我忘了告訴你,你還沒有對你廁所裏的東西定義權限。啥權限啊?就是私有還有共有唄!為啥啊?難道有人跑到廁所裏偷馬桶蓋不成?嘿你真新鮮!連大街上的井葫蘆蓋都有人偷了去賣錢,偷你個鑲金馬桶蓋還不是小菜?

那咋辦?把你的男廁所裏麵的東西定義成私有啊,這樣別人就偷不走了!好,就這麽辦!讓我們來看看男廁所裏麵都有啥:
兩樣東西:馬桶、尿兜;兩個方法:解小便(馬桶 某馬桶,小便者 某人)、解小便(尿兜 某尿兜,小便者 某人)

我們給這些個東西都上鎖,都弄成“私有”,這就保險了!原來麵向對象還能保護私有財產,真是個好東西啊!好了,馬桶有了,尿兜有了,使用馬桶和尿兜的小便方法也有了,鎖也上好了,齊了!搞了這麽多事兒,您尿憋急了吧?那就趕緊上廁所啊!咋了?還不進廁所?

現在才發現個重要問題:廁所沒門兒!

好嘛!建了個富麗堂皇的私有化安全廁所,小偷是進不去了,您自個兒也進不去了!

啥叫高科技垃圾?這就叫高科技垃圾!最後你逼急了,隨便在您幾百萬的廁所外麵找個牆角旮旯解決拉倒,不受這洋罪!

好了,等你花了幾百萬蓋了個無門高級廁所,然後你在廁所的牆腳用原始方法解決了以後,我再告訴你:你再給我一百萬,讓我做第二期工程吧,我來給你裝個門, 廁所就能用了。那你肯定會罵:幹嗎不早說?你傻啊?你不知道挨踢界裏麵,所有的第一期工程都是沒法用的垃圾,然後程序員再向業務部門要錢搞第二期、第三 期……把這個高科技垃圾維持下去,不這麽幹我們喝西北風去啊?

好了,除了“私有”(Private)這個權限,還有“公有”(public)和“保護”(protected/friendly)等權限(具體到不同的 語言有些些微差別)。其實這三個權限屬於前麵“封裝”的範疇。現在講講它們的區別。私有(private)就是完全屬於“物主”。產生了一個對象,對象本 身就是“物主”。那麽private就是隻能物主關在自己的房間裏自己用。所以你其實可以使用沒有門的高級廁所,前提是要把你也永遠關在廁所裏麵。
“公有”就是顧名思義了。如果是要建公共廁所,這個權限是不能少的。那麽“保護”呢?保護的權限相當於家庭廁所。三類人可以用這個廁所:物主(也就是被關在廁所的那位)、物主的子女們(繼承了該類的子類們)、同屋的人(在同一個包裏的類)。

那麽我們該如何應用這些權限呢?有一個趨勢,就是所謂的“高內聚,低耦合”(highly cohesive, loosely coupled)。葉雨一下子變得這麽學究,你是不是該暈了?好了啦,所謂高內聚就是自己的東西要保管好,低耦合就是“能不上套就不上套”。那麽具體到 “男廁所”這個類,什麽東西需要高內聚的?馬桶,尿兜。我們要確保這兩個東西保管好,所以對馬桶、尿兜實行“私有”。剛才說過,除非把你關在廁所裏不出 來,否則你不能使用私有的馬桶跟尿兜。好了,技巧來了:你是不能直接使用私有的馬桶跟尿兜,但是你別忘了還有兩個定義好的方法啊:兩個方法:解小便(馬桶 某馬桶,小便者 某人)、解小便(尿兜 某尿兜,小便者 某人)。
好了,因為小便方法是男廁所類裏麵的成員,所以理所當然這兩個方法能夠直接訪問到私有的馬桶跟尿兜。然後我們把這兩個方法弄成共有的(public)不就 行了嗎?這個方法真是天才!一方麵我們保證了馬桶跟尿兜誰也偷不走,一方麵我們可以開放公共廁所了,讓大家一起來小便。問題解決啦!

好了,造價高昂的公共廁所正式營業了。你坐在廁所門口收錢,開始覺得回報的時候到了。但是好景不長,裏麵開始有人嚷嚷他們不能使用馬桶!咦?我們不是已經定義了一個解小便的方法了來讓大家使用馬桶了嗎?

一問之下,原來有人想對著馬桶解大便,而你隻提供了解小便的方法,而沒有大便的方法!那你要問了,如果別人知道如何對廁所裏的馬桶解大便,為啥還要我們提 供解大便的方法啊?這是因為我們已經把馬桶“私有”了,所以除了廁所內部定義的方法,否則外部一切的動作都不能直接作用在我們的馬桶上。也就是說,你想大 便可以,但是要按我們的方法來!

你看,辛辛苦苦蓋了這麽好的廁所,隻能小便不能大便!顧客們吵著要退錢,你沒辦法,找挨踢去了,說能不能加個“大便”的方法。那當然歡迎之至了!第三期大便工程,再加一百萬!

本文旨在提高讀者的學習興趣,補充老學究們寫不出來的趣味部分。也希望讀者能認真看專業書籍學習這部分的知識。



請閱讀更多我的博客文章>>>

  • 廁所是如何建成的:趣談麵向對象編程 (圖)
  • 原創語音節目:老街書店 (音)
  • 所有跟帖: 

    Ding! -GuoLuke2- 給 GuoLuke2 發送悄悄話 GuoLuke2 的博客首頁 (0 bytes) () 03/02/2012 postreply 12:12:34

    高人呐。咱現在還停留在結構化的層次。 -coolwin- 給 coolwin 發送悄悄話 (169 bytes) () 03/02/2012 postreply 16:22:23

    等我看完,已經尿褲子了。 -Lunear- 給 Lunear 發送悄悄話 (0 bytes) () 03/04/2012 postreply 11:21:16

    嗬嗬,看來建築係的人改編程很有優勢啊。 -常量2- 給 常量2 發送悄悄話 (0 bytes) () 03/05/2012 postreply 10:17:17

    軍民人等不得在此小便(第三、六字符後加一逗號) -xylw- 給 xylw 發送悄悄話 (0 bytes) () 03/08/2012 postreply 13:53:40

    Agile 的人就先做個坑,權當是廁所了。 -yuhaian- 給 yuhaian 發送悄悄話 (0 bytes) () 03/19/2012 postreply 00:16:35

    請您先登陸,再發跟帖!