熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

再談面向對象

2022-06-13   來源: Java核心技術 

  談到面向對象這方面的文章非常多但是明確地給出對象的定義或說明對象的定義的非常少——至少我現在還沒有發現其初面向對象是專指在程序設計中采用封裝繼承抽象等設計方法可是這個定義顯然不能再適合現在情況面向對象的思想已經涉及到軟件開發的各個方面面向對象的分析(OOAObject Oriented Analysis)面向對象的設計(OODObject Oriented Design)以及我們經常說的面向對象的編程實現(OOPObject Oriented Programming)許多有關面向對象的文章都只是講述在面向對象的開發中所需要注意的問題或所采用的比較好的設計方法看這些文章只有真正懂得什麼是對象什麼是面向對象才能最大程度地對自己有所裨益這一點恐怕對初學者甚至是從事相關工作多年的人員也會對它們的概念模糊不清下面我從一般的概念出發再引申到軟件開發領域中所涉及到的對象的概念
  
  上一篇文章中我曾舉過一個樹的例子來說明對象的概念這裡我仍然利用它對對象的概念做闡述對象一詞英文為Object德語為Sachen都可以譯做物體其實所有的物體都可以作為我們的對象——只要我們注意並對它思考了一個人從生下來到進行第一次的戶外活動他將接觸到許許多多的新鮮事物他將睜大眼睛好奇地看著這陌生的一切也許對他來說那些高大的東西有干有枝有葉——雖然那時他並不知道這些——其映象已經深刻地印在了他的腦海中此時對他來說樹並不是對象因為在他的腦子當中只有樹的映象而沒有對樹的精神上的意向當他再大一點時也許他會想著爬到樹上去玩一會兒——但此時樹也還不是他的對象存在的對象只是他自己——他想讓自己去做某件事長大以後也許他他成了一名木匠——就像我們成了程序員用他的鋸子斧頭把一棵樹砍下來做成一張桌子——就像我們利用Java C/C++語言開發出一套數據庫系統在這裡樹是木匠的對象而數據庫系統是程序員的對象於是我在這裡給對象下一個定義對象是人腦中的物質意識和精神意識通俗地講就是事物在人腦中的映象和人腦對事物的意向之所以要在這裡強調事物是我要說明這裡所說的物質並不是物理學中的物質思維活動事物間的關系我們也稱為是物質的
  
  真正要在較深的層面上討論什麼是對象是很復雜的因為這要涉及到精神意識本質的問題遠遠超出了我們要討論的范圍我們不要討論什麼高深的問題就以實用為主我就利用這個概念來舉一個簡單的例子木匠前面有一張桌子他可能要面臨兩個問題一是給桌子添加一些部件如抽屜這樣桌子就可以放更多的東西二是裝飾一下桌子使得它更美觀在這裡桌子是他的對象——他對桌子進行思考了這使得他對桌子的意向性也明顯地顯露出來我們甚至可以把改造桌子稱為面向對象的改造因為那不是隨意的改造這一點我在隨後對面向對象思想的說明中提到為什麼說是不是隨意的改造考慮一下面向對象可以知道它是一個動賓關系的短語動詞面向表面這個短語含有如何去做的意思這可以說是涉及到了方法論的范疇了這也給我們提供了一個重要的信息面向對象的做不僅牽涉到什麼是對象的問題還牽涉到如何去做的問題木匠如何去做他的桌子我們不必擔心他肯定能做好的——如果他是一個優秀的木匠的話他有著豐富的經驗他有一套自己的方法他知道如何去做也許在做桌子之初就已經做了良好的設計以為以後的升級作准備這就像一個經驗豐富的程序員他知道怎麼設計才能讓自己的程序結構清晰易懂容易排錯也易於維護
  
  有一點要注意的是對象不是實體它可以脫離實體而存在這是因為對象只不過是人腦思維活動的產物我們可以用某種方式如自然語言圖畫等將它表示出來就像我們在軟件開發中所說的對象用類(程序當中)或系統結構圖(如流程圖層次圖HIPO圖等)來描述一樣
  
  於是我們就可以對象我們一般在軟件開發領域裡所討論的對象下個定義了對象由一個數據集以及對該數據集的操作組成這個定義適合程序語言中的類也適合對整個系統而言也許大家會對這個定義覺得很熟悉這不是程序或進程的定義嗎?注意這裡的對象是有自我意識也就是說它是有自己的行為的進程指的是一系列的二進制流的集合是一次運行活動在程序中我們用類來描述對象而對整個的系統我們用系統圖來描述在這裡系統也是我們的對象數據集就像事物在我們大腦中的映像對數據集的操作就如同我們對事物的意向如果我們仔細考察系統的各個部分那麼它們也可以看作是對象面向對象的XX就是要求我們如何合理地分配對象之間的層次結構使得它清楚明了在保持效率的同時還便於排錯維護我們有一個專業名詞來表示已經定型得到大家認可的軟件方法那就我們常說的模式各行各業都會有它自己的一般的方法模式如建築業有建築模式軟件開發有其開發模式我想當初愛因斯坦之所以做出幾個丑陋的凳子就是因為他不懂得凳子的設計模式吧這就如同好多編程初學者稍微大一點的程序就會寫出雜亂不堪的除了自己誰也看不懂的代碼也許過了幾天連自己都看不懂了
  
  在軟件開發過程當中系統(我們面對的終極對象)的分析設計才是最重要的而這兩方面是緊密結合在一起的這兩步沒有做好下面的編碼實現工作很難玩成可以說是寸步難行我曾經在一家軟件公司(說是公司其實加上老板才只有六七個人)做過一段時間那時老板叫我們用Java做一個數據庫系統(圖書館管理系統)用來當招牌以後也好對接項目有利我以為他會先拿出一個設計圖讓我們看不料他說現在就開始做說實在的那時我對這方面根本沒有經驗我當時就對他說你至少得把你設計的藍圖給我們看一看吧?他說沒有他也不知道如何做以前沒做過還說我們邊做邊學習我說那至少你應該先做一做系統分析吧他說要是我有這能力還能在這裡呆著?結果可想而知我們在那裡呆了幾天這裡瞧一瞧那裡看一看又在機子上寫一寫什麼也沒做成老板看見我們稍微有所松懈就不斷地催促快做快做後來我受不了就一個人跑了也不知道他們做成了沒有可以說這是一個不成功的例子就算是寫成了沒有分析設計的結果肯定也是很難維護的這就象是請來的木匠把一套家具打造得很不合理看上去非常糟糕可能還很不實用有誰會願意用這樣的家具?程序包設計得不好有誰能用得好?無論誰用起來都會很吃力如果說一個項目沒有設計好即使開發出來了後來的維護工作別人怎麼能接手?在我們中國軟件領域有這樣事情的例子很多當然產生這樣情況的原因很多中國的體制公司的實力也是一大方面但是如何去做有是一個范圍很寬的話題了
  
  上面聊得多了對象是一個比較廣泛的概念在我們通常軟件領域裡也是這樣對象之間可以包含對象對木匠來說一套組合家具是一個對象一件衣櫃也是對象——全局和局部都要考慮對他們來說如何從整體到部分的設計出受人好評的家具是需要豐富的經驗和良好的設計方法的對我們來說也是這樣除了要打下扎實的基本功積累豐富的經驗還要注意學習我們的前輩們給我們留下的東西以及同行們的好的方法現在有關面向對象的書籍文章都很多我們都應該去看看去學習
  
  全文說了這許多只談了有關面向對象的概念有幾位朋友來信問到如何劃分對象層次結構對系統運行的重要性等受篇幅所限不能述及還有可能有的朋友對對象的理解不是很合理這裡我談一下我的觀點對象在系統運行時是有其生命期的但是在運行內對象自身的改變(如動態地增加縮減功能數據集的變化等)不能看作是改變了對象例如對於一個二叉樹初始化時只有根節點當然我們可以看作是一個節點對象但一般我們是將它看成一個整體的二叉數對象當樹生成之後它還是那個對象而不能把它看成是另外一個對象了如果你那樣理解的話就把對象的各個運行時期分離開來了這就與對象的概念有曲解了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26514.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.