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