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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00029.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2008/3/19 7:53:51
軟體設計美學之道第2回──軟體的美麗元素──設計思維
世界上大大小小的事件、每個人的想法、做法,只要不是具象的事物,就都是抽象的,而軟體設計的思維亦是如此。

在軟體設計的領域中,物件導向的設計方式是個抽象的分析思考法,很適合在虛擬世界裏面表達出真實世界的需求。

雖然物件導向的技術已經行之有年了,但是真正了解其觀念,並且能將其思維放到實際設計與實作上的人並不多,可能是因為受到現實環境的影響。

以Java來說,筆者就看過許多使用Java寫出C程式風格的例子,以應用面來看,這樣實在談不上有設計思維,只能說是透過程式撰寫一行行地列出工作而已。然而也許是因為這樣的觀念不清,導致利用Java開發的系統效率不張或者幽靈問題不斷,而讓人誤解Java系統的好壞。

物件導向的關鍵哲理-抽象

物件導向是一種很有趣的分析「哲學」,它試圖從人們對真實世界的看法及感受來解釋屬於虛擬世界的軟體。從分析問題領域,進而轉成相對應的程式碼,都是在模擬真實世界裏的自然過程。

真實世界的事物是瞬息萬變的,而軟體開發也是如此,唯一不變的,就是恆變的需求。因而,「抽象」則是描述「瞬息萬變」的一個重要並且安全的方法。

抽象的觀念也是大部分的人在學習或運用物件導向觀念時,比較容易遇到的瓶頸。所謂的抽象,簡單來說,就是「萃取」出的概念,而且和實作無關,因為真實問題背後所隱含的意義,往往無法從直接的實作中得知。抽象的焦點是事物的本質特性,不同的觀點可以對同一事物抽離出不同的元素來,若是將抽象結果對映到真實世界中,有可能是一個具體的東西,也可能是一個看不見的概念。

抽象有助概念與實作的再利用
想像一個簡單的例子,在人聲鼎沸的世貿電腦展裏,你能夠抽象出什麼呢?是某電腦公司的攤位、辣妹跳舞、某個品牌的電腦,還是拆解成攤位、辣妹、表演、消費者、產品、銷售、交易?若是後者,那麼將這些元素套用到家具展上,其實也沒問題。因此,抽象有助於「概念的再利用」,同樣也有助於「實作的再利用」及穩定。


如果我們要設計一個展覽館的軟體平臺,起碼,當電腦展要改成家具展時,只要重新實作產品內容,不用重新設計整個平臺,因為交易模式及展埸運作模式都是類似的。

大家在此應先建立一個觀念,物件導向的分析方法是由特殊到一般,由實體到抽象。抽象的觀念還可以在經過一般化(generalization)或者特殊化(specialization)的分析後,衍生出階層的結構,這一層一層的抽象結構,可以像一層一層的防火牆一樣,擋住一級一級需求變異的風浪。

以駭客任務說明物件導向
對物件導向技術有初步認識人都會讀到不少技術名詞,例如介面(Interface)、訊息(Message)、類別(Class)、抽象(Abstraction)、具象(Concrete)或者Pattern、IoC(Inversion of Control)、Dependency Injection、MVC(Model View Controller)等等,這些名詞都和物件導向的設計思維習習相關。我很喜歡的一部電影──駭客任務(Matrix),可以套用來說明這些名詞的觀念及物件導向設計的思維。


在駭客任務的電影情節裏,人類被所謂的「母體」控制在一個虛擬的電腦世界裏,在那個虛擬世界裏面的所有事物,例如行道樹、食物、味覺,甚至物理或化學反應,不管是看得到、感覺得到還是所謂的自然定律,都是電腦程式所創造出來的,而真實的人類卻渾然不知地被「飼養」在一座座充滿連接管線的生態槽裏。

看完電影後我不禁思考:如果我是那母體(Matrix)的架構師(architect),該怎麼設計那套系統?

我大概會利用複合技術(composition)的方法,再配合連結器(adapter)機制和真實世界生態槽裏收集人體各項類比訊號的生物介面連接,再轉化成數位訊號,然後將人類的類別(class)具現(instantiate)到數位世界裏時,利用dependency injection的方式,將經轉化的數位訊號注入人類實例(instance),並和那裏的所有事物建立物件關係,然後人類就可以在那個世界裏生活著。


這麼酷的想像,透過物件導向的技術來形容似乎就不難理解,它可以容易地傳遞設計的思維。 然而,光是了解物件導向的原理,還不足以讓你變成一位好的設計師,好的設計作品應該是容易地再利用、擴充及維護的,因此除了抽象、封裝、繼承與多型的基礎概念之外,有經驗的老手可能還知道許多物件導向的設計原則,像是「封裝變異」、使用複合技術代替繼承、針對介面寫而不是實作。

設計思維的傳達與再利用
當你在利用上述這些設計思維來塑造軟體時,出現的另一個問題是:大部分的軟體開發不會是只由你一個人負責,而是團隊作業,然而在一個團隊中,要如何讓伙伴了解你根據這些物件導向基礎或原則所做的美妙設計呢?設計思維的傳達,變成了下一個問題,而這也意味著一個很重要的概念,那就是設計思維應該是可以再利用的。

物件導向的重要概念-介面
在物件導向的設計裏,表達抽象的一個重要設計概念就是「介面」,它也是物件導向的基石。這裡所指的介面有2種意義:Java語言上的介面(interface),以及概念上的介面,此處我們所談論的是後者──概念上的介面。


物件的介面界定出「外界」能送給它的訊息資訊,也可以說是「限制」了外界對該物件所能影響的範圍,對每個物件來說,介面也是了解另一個物件的唯一方法。以汽車的例子來說,我們看得到汽車的外觀,也看得到汽車移動的方式,因此汽車的外觀及移動方式,都是屬於汽車的介面。

至於汽車是何以能如此移動,是利用什樣的動力驅動-汽油引擎、柴油引擎或油電混合引擎,是採用什麼樣的傳動機制-前輪驅動、後輪驅動或四輪驅動,以上這些則屬於實作。

有趣的是,一個物件可以有一個以上的介面,這就是多形(polymorphism)的應用。舉個例子來說,臺灣之光-王建民,他是洋基隊的球員,他也是臺灣人,更是他父母的兒子,因此,以球隊的觀點來看,他可以幫洋基隊投球,以臺灣的觀點來看,他有國民的義務,以家庭的觀點來看,他必須盡到做兒子的責任,但是他都是王建民。所以,介面有點像是物件所扮演的角色,而角色當然就伴隨著「責任」,物件導向設計時的重點之一就是在做物件的「責任分配」。

有許多的Pattern或者Framework都要靠穩定的介面為其發展的基礎的,例如,DI(Dependency Injection)、MVC(Model View Controller)、Spring、Struts、JUnit等等,不勝枚舉。


《作者簡介》葉政達
艾群科技研發中心技術經理,中原大學電子工程研究所碩士。
曾任職於網際商擎科技、台聯電訊研發工程師等職,專精於OOAD、軟體架構設計、Pattern、J2EE、J2SE、行動運算應用;通過SCEA、SCWCD、SCJP等認證。曾參與電子商務系統、航空即時訂票系統、SNMP網路管理產品開發、亞太電信QMA Image Solution、Sandio Mobile Sync產品設計開發等專案規畫建置。
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

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