茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1670916 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00011.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

軟工藝術 : [轉貼]話說從頭 - 為什麼要使用物件導向設計 (OOD)

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]話說從頭 - 為什麼要使用物件導向設計 (OOD)
話說從頭 - 為什麼要使用物件導向設計 (OOD)

會想要談論這個題目其實是有緣故的。
自從.Net Go2 OO這個部落格成立以來,我們發表了幾篇關於物件導向基礎的文章,關心的眼光都停留在介面這個重量級的角色上,其中包含了介面使用的時機以及為何要使用介面的正確觀念;另一方面我們也發表了幾篇較為進階的文章,初步的介紹了Design Patterns中較為簡單的幾個樣式,其中也包含了一篇如何應用Pattern來實做的案例。

但是我們逐漸聽到了類似下面的問題:「究竟為什麼要使用物件導向設計,在現實面究竟有什麼好處存在?在現實上這麼辛苦麻煩的設計架構究竟有沒有價值?」

我不禁回想起這些年來學習程式設計以及物件導向設計的過程,這中間我不斷的聽到這樣的標準答案,所謂物件導向就是封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)。我也在許多書本上學習了這些詞彙的解釋,也懂得了如何利用這些特性來撰寫程式(OOP),但是即便如此,我還是沒辦法很輕易的回答上面的問題,我也很少聽到或者看到一個可以讓我由衷讚嘆「對啦,就是這樣!」的說法。

接著我開始接觸物件導向設計(OOD),解釋物件導向的說法開始變的更加虛無飄渺了,每個人都用「汽車與卡車都是車子」的故事來為我解釋物件導向。可是就算我知道汽車跟卡車其實有親戚關係,我還是沒辦法自圓其說為什麼我要使用物件導向設計。難道就因為大家都說它好所以它就好嗎?

然而隨著接觸的層面越來越廣,對於物件導向設計我逐漸有了另外一種看法。

我們時常提及的封裝、繼承、多型或者物件的分析本質都是物件導向設計的特色,又或者說物件導向設計是由這些特質所組合而成的。但是這並不足以構成物件導向成為主流的原因。

一個男人的如果長的很帥可以是他的特色,但是如果長的帥沒辦法為他帶來好處,那我們就不能說長的帥是他的優點。

那麼封裝、繼承、多型這些特色究竟可以為我們帶來什麼好處?

這裡不打算解釋什麼是封裝、繼承、多型,有許多書本都講解的非常的清楚明白,要麻煩不瞭解的朋友們去查閱這些書籍。

換個角度

首先,封裝讓程式碼易於理解。我們可以從一個類別的名稱以及他的行為去理解與記憶它和系統之間的關係與責任,這樣的特性可以縮短日後我們重新檢視程式碼時所要花費的時間,沒有人會說這不是好處吧?

再來,繼承讓程式碼可以重複使用。就拿剛剛提到的車子、汽車與卡車的例子來說吧。我們把大部分重複的程式碼寫在車子的類別裡,以後的十種汽車跟八種卡車都可以直接享用車子中已經定義好的程式碼與功能。我們因此縮短了浪費在重複性工作上的時間。

最後,多型讓程式易於擴充與維護。針對共通的介面來撰寫程式時,可以使得物件之間的關係被鬆綁,讓軟體在日後進行擴充或者個別物件修改時不需要更動到既有的程式碼。當軟體龐大到一定程度之後,擴充與修改對程式設計師而言往往是非常痛苦的一件事情,我對於善用介面可以達到的效果非常推崇,可以說相當程度的提供了軟體品質的穩定。

撇開所有美輪美奐的說詞,回來面對現實,我們就是為了能夠讓程式碼重複利用,讓系統易於擴充與維護所以才要使用物件導向。這一切最直接的效果就反應在縮短軟體開發的時間以及增進軟體的品質穩定度上,讓我們能夠專注在真正重要的工作上面。美麗或者基本教義派的崇拜都不是物件導向之所以存在的原因。

站在實作的角度來看,物件導向的存在就是為了增進程式設計師工作的效率以及軟體的品質,以這樣的觀點而言,使用物件導向設計是再實際也不過了,千萬別說使用物件導向是天真而不肯面對現實。

水能載舟亦能覆舟

不過問題來了,既然物件導向這麼優秀,為什麼還會有這麼多人不願意把她娶進門,仍然嫌東嫌西的呢?

其實上帝是公平的,這世界上本來就不存在十全十美的事物,物件導向既然擁有這麼抽象而複雜的特性,也就造成了它在撰寫上一開始就必須克服的時間成本。為了能夠做到封裝,所以我們必須多花一些時間在分析物件的責任歸屬,為了做到繼承,所以我們必須多花一些時間在分析物件之間共有的責任與資料,為了日後擴充方便,我們必須多花一些時間創造出合適的抽象介面來讓物件實做。

這些都是伴隨著物件導向設計而來的工作。我們不能否認,使用結構式的程式設計不必付出這些時間成本;當然,自然也享受不到繼承與介面的優點。

持平而論,物件導向的出現是為了讓程式設計師能夠用更短的時間開發出更優良的軟體,如果在某些現實條件下的評估結果是,不使用複雜的物件導向設計勝於使用的話,又為何不選擇簡單一點架構呢?明明不會有擴充或者變動的可能性,硬要放個抽象介面在那邊礙眼,這是最不智的行為。

吃路邊攤的時候穿晚禮服,就算你長的再美,也只會讓人家覺得你有毛病而已,不是嗎?

結論

在現實生活中開發任何軟體專案時,我們通常希望在專案的進度、品質以及成本之間取得平衡,極端的要求在最短的時間內花掉最少的成本來取得最高的品質是不可能實現的夢想。

物件導向設計是軟體開發歷史演進下的產物,集結了許多前輩的智慧與經驗而成,即便是如此,也不可能達到上述夢想中的境界。我們當然可以追求最完美的物件導向設計架構,但是必然將犧牲開發的進度以及成本。相對的,一昧追求時效捨棄良好的軟體設計也不可能得到合理的品質。

許多時候並非物件導向設計無用,只是在有條件的選擇下被捨棄罷了。
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]物件 (Object) 的媽媽是 類別 (Class)?
物件 (Object) 的媽媽是 類別 (Class)?

Kenming | 14 Aug, 2006 22:32

從 OOP 學習物件導向(Object-oriented)觀念時,你就不太容易去對一些基本的 "術語 (terminology)",下功夫來去 "參透" 其本質的意涵。例如,我雖然已經許久沒有教授基本物件觀念的課程,但在教授類別圖(Class Diagram)與物件圖(Object Diagram)時,多少就需要複習與說明什麼是類別,什麼又是物件。尤其,我最喜歡 "考" 程式設計的老手們,一個他們認為再基本與簡單不過的問題了: 物件是由誰誕生的?

嘿,如我預料,十個有九個回答:是由其所屬的類別誕生的。 是嗎? 我再請他們反思一個問題: 到底類別與物件的區別是什麼? 有人會回答:類別是死的;物件是活的。 這更有趣了,既然類別是死的,那麼,死的類別怎又能如何誕生出活的物件呢?

物件是有機的生命體,但類別卻不是,事實上,世界上根本就沒有 "類別" 這種有機體;而若是類別不是有機的生命體,那麼, 物件就絕對不可能是由其誕生的!

為何會有公司、部門、員工等類別? 因為容易讓組織的層次分明,這是一種 "人工" 的分類;為什麼從狒狒的角度看人,就知道 "非我族類"? 因為這就是一種與生俱來的 "本能",沒有任何理由,是再自然不過、也不用說明的道理了。所以,將 "物件" 分門別類,可以是 "人為判斷",也可能是一種再自然不過的 "本能",沒有絕對的標準,要將物件歸為那一類,只能說,要將物件分屬為某一類,你要能作比較 "合理化" 的說明而已。


看似再簡單不過的問題,其實才真正是蘊含極為深奧的哲理,要能具體說明類別與物件的區別,這其實比想像得還困難。首先,你可必須先徹底思考,到底什麼是類別,為什麼需要有類別,要如何分類 ...等。關於類別,我會就我個人幾年來持續思考的體悟與認知,另外著文說明。"類別" 這個主題,絕對是在物件導向觀念中,最為關鍵的核心,因為,決定資訊系統因應需求變動而所能承受的震盪程度,取決於類別圖的設計,真正的軟體行家,如 Peter Coad 與 Martin Fowler,非常擅長將問題領域(Problem Domain)的概念(Concepts),抽象(abstract)化並依其本質與特性 "分門別類",具化並組成為軟體內部的靜態結構,得以支撐系統的穩定、彈性與延展度。

回歸主題,到底物件是由誰誕生的呢?
我們先看底下一行程式碼,試著想想看,這一行程式碼的意思是什麼。


 Employee e = new Employee();

我在某討論區看到有人是作類似這樣的解釋: 用 Employee "類別" 造出一個 "物件實體" e ,這樣的回答,其實仍與物件是由其所屬的類別所誕生的意思是一樣的。

"Thinking in Java" 一書中,起碼還作了比較合理的說明:
You must create all the objects (所有物件都必須由你建立)

那個 "你" 是程式設計者? 我寧願作這樣的解釋:
程式設計者(Programmer)透過 new 關鍵字來要求「請給我一個新物件」。

既然是 "請",也就代表了,程式設計者只是作宣告(Declare)而已,真正 "誕生" 物件者,其實就是 "系統"!,再說得白一點,就是應用伺服器(Application Server),或者,我個人蠻喜歡用 "Container" 這個術語,來說明應用程式其實就是透過它來取得系統層次的服務(System-level services),包括誕生物件等。

透過上述的說明,上面那一行程式碼比較合理的解釋應該像是這樣:
"個體(Instance) e 透過 new 關鍵字宣告,請系統(System)建立一個新物件,並將其分屬於 Employee 類別 (也就是具備了 Employee 類別所應有的 "本能")。"

至於 "Instance" 一詞,本質就是物件,國內一般書籍翻譯為 "實例",我很不喜歡,覺得不自然,也不夠貼近英文原意;翻譯成 "個體" 或 "實體",應該是比較恰當的,而個體代表的就是,一個個的物件是可以獨立運作、為有機的生命體,瞭解(know) "something" 以及做(do) "something"。

對了,"系統(System)" 這個字眼,若以比較 "擬人化" 的術語,那未,我覺得「駭客任務」電影中,那個 "母體(Martix)" 應該會是最佳的代名詞了。 :-)



冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]不要從程式語言學習「物件導向」!
不要從程式語言學習「物件導向」!
轉自:矇矇的秘密基地:不要從程式語言學習「物件導向」!

許多技術人員係從物件導向程式語言(OOP, Object-Oriented Programming Language)來學習物件導向,從 OOP 的角度來學習物件導向時,經常會把它當作是一種 "技術",當作 "技術" 時,你會想去 "用" 它,而若當你無法 "應用" 在現實面時,就會覺得 "不好用"、"難用" 、理論無法與現實結合" ...等。

把物件導向當作 "技術" 的最大的問題是: 你永遠不知道為什麼你要使用物件導向!

幾年前,微軟的 COM 剛盛行時,有些是 "微軟技術代言人" 會在其技術文章裡提及:COM/3-tier/物件導向技術是增進系統效能(Performance)的最佳解決方案;採用上述提及的技術可以加速系統開發。甚至到現在,我仍常聽到:採用 EJB(Enterprise Java Bean) 是實現物件導向的最佳利器、可以讓開發者 "ReUse" 所設計的元件(Component)、節省開發者的開發時間。

嘿,這些 "似是而非" 的論調,幾年前從技術人員口中聽到是如此,現在聽到的還是如此,說真的,我是覺得,還真是一點自我的反思都沒有。我每次對這些技術人員的反駁就是:有什麼方式會比 Client/Server 直接連線至資料庫來處理還要快? 有什麼開發方式會比你使用 Client/Server 拉一拉表單,然後直接至資料庫 "撈" 資料還要便捷? 當然,技術人員的直覺反駁是,Client/Server 無法應付數百人以上同時間的交易處理,是啊,沒錯啊,Client/Server 有些假設點:同時上線使用者不超過 200 人、系統的需求不常變動。

但,重點是,系統效能與你採用 COM/EJB/物件導向有何關係? 那是屬於系統資源(Resource) 的控管處理,諸如 Resource Pooling 的機制、Transaction Management(還包括交易物件的設計)的處理,Database "Performance Tunging"、頻寬的資料傳輸量的處理... 等。


而採用物件導向/COM/EJB 可以節省系統開發? 那更是可笑! 採物件導向可更是耗費開發成本,開發人員每當一想到為什麼要在中間層對物件分門別類,然後實做一個功能要串上好幾個物件的傳遞才能完成工作,一直無法接受這種觀念,如同 Martin Fowler 所提:你永遠無法讓物件導向的新手們瞭解為什麼要採取這種分散式的設計,你只能要求他們如此做,幾年後,他們會突然頓悟,腦袋有如重生一般。所以,採取物件導向可是要花腦筋在軟體設計上,而且若是實做在所謂的實體元件的機制,如 COM+/EJB,那是為了系統分散與交易機制的處理的元件規格,所以,實做上可是更為麻煩,一點也不會減輕開發者的實做的負擔。

所以,為什麼要使用物件導向? 因為,物件導向是一種思維,是一種哲理,是一種典範,甚至是一種生活觀,你需要綜合相當多的知識,蘊化為 "智慧",來協助你如何應付與應對軟體的 "善變",並能提供具體的解決方案。嗯,這兩年突然對軟體設計某小一部分的哲理有一些 "頓悟" 後,每當看到許多系統因為粗製濫造而衍生出複雜的表象,眾多人們卻被淹沒在糾纏不清的問題與狀況時,而個人(外加 Ringle) 卻能 "一眼" 看出問題在哪裡,並且可以提出具體的解決方案,嘿,那可真是莫大的成就感與喜悅的呢。

學習物件導向的思維與哲理可是一條漫長之路。對我而言,我個人是已經選擇了這條 "自討苦吃" 之道,這條道路所要學習的廣度與深度,可是與圍棋之道一樣的深奧無比,每一個階段的學習與體悟,會讓你更接近與探索根本道理,但,似乎又永遠無法達到那個 "彼岸"。如同吳清源大師已經快 100 歲,仍舊每天研究圍棋;Ivar Jacobson 已經 80 餘歲,卻仍茲茲不倦地研究與發表軟體設計的論述一樣,這是終身職志,已經是融入每天的生活,永遠也研究不完的,甚至,還準備帶到下一輩子繼續來「修道」的。


所以,回頭來看物件導向程式語言,OOP 僅是實現(Implement)物件導向的工具,你會想透過 Java, VB.NET 等程式語言來實作如介面(Interface)、繼承(Inheritance)、多型(Polymorphishm) ...等設計。但問題是,OOP 無法告訴你 "What" and "Why" 介面、繼承、多型等這類屬於設計的哲理面(philosophy),甚至,也無法告訴你 "What is Object?"、"How to divide the Object?" ...,而這些哲理,根本不是為了重覆使用或增進效能,目的旨於,協助人們在面對複雜的現象時,應用 "本來就有" 的智慧哲理,來解決複雜的問題,而 OOP,是讓軟體人員解決問題時,所需使用使用到的 "工具",它就是工具,就是一種手段而已!

從 OOP 學習物件導向觀念是一種本末倒置的方向,那不會是一個好方法,若勉強說,利用 OOP 來 "驗證" 物件導向的一些設計想法,那到說得過去。那麼,從何處學習物件導向呢? 我這兩年,是透過 "觀察" 生活的周遭環境,逐漸來反思與體悟的。這與我多年來閱讀許多大量其它領域的書籍,除了軟體設計專業書籍外,包括學習類、成功潛能類、企管與專案管理、歷史 ...等,實在有莫大的幫助,對短期的軟體技能幫助不多,但對中長期在軟體設計的思考上,會突然在某一個時間點突破而後 "頓悟",這時再回頭看軟體專業各類的書籍,那可真是游刃有餘,輕鬆而能感受書中的作者所想表達的觀點與主題。

對初學者,若要更具體一點,要看相關這方面的書籍的話,除了上次介紹過 Grady Booch 的「Object-Oriented Analysis and Design」一書外,國外的一些書籍,例如 James Martin/James J. Odell 合著 「Object-Oriented Methods」 一書,除了內容淺顯易懂、又饒富物件思維之道外,書籍排版與印刷的精美,那更值得典藏的好書。有件事最好避免,國內坊間 OOP 的書籍,有談及物件導向觀念的,最好略過不要看,幫助不大,反而誤導成分居多。


有感而發,既然,Java and .NET 都已經昭然若揭,程式語言確然往物件導向的實做之路,那麼,軟體人員也確實需要俱足物件導向的設計觀念。隨著工具的易學易用,以及網際網路龐大的資料庫,成為實做 "how-to" 的最佳參考來源,使得實做得以更形簡單。那麼,軟體人員更需要將精力擺在物件導向的設計思維,才有可能應對越形複雜的系統,懂得如何以簡御繁。

所以呢,我個人準備把我這幾年的一些心得與體會,盡量利用日常生活面的例子,來解釋物件導向的一些基本觀念與術語,例如,什麼是物件/類別、什麼是介面/多型、什麼是封裝 ...等。我會將這些文章另行分類成 "物件基本觀"。對了,有一些議題我會採反問的方式來闡述一些個人的物件觀。例如,若你要問我,EJB 是不是物件導向? 我會說 "不是";然而 Client/Server 是否是物件導向?,我的答案卻是 "Yes"。 呵呵,先賣個關子,這些是蠻有趣也蠻引起爭議的話題,爾後我會著文說明我的看法與理由的。

前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|