經過多年的演進,不論是軟體開發方法論,或是每當推出新的程式設計語言,皆強調物件導向的概念。每一位物件導向程式設計的學習者,都會被灌輸封裝、繼承、多型這三大物件導向的基本概念。

連去年開始風靡整個Web開發領域的AJAX,也因為其基礎-JavaScript,比較缺乏物件導向特性,導致眾多批評聲浪。不夠物件導向的技術,就好像買汽車不附安全氣囊一樣,會受到眾多開發人員的質疑。

物件導向可以解決一切問題嗎?
大部分的人,在一開始學習C語言的時候,老師一定會告訴我們,C語言屬於程序導向語言,為了要保持程序導向思想的「純正性」,所以強調絕對不能也不該使用「goto」關鍵字,一旦用了,程序導向的思想就不夠純正,老師很可能會訓斥一番。

可是有一天,某人看了Microsoft Press在1993年所出版的《Code Complete》這本書,具有豐富經驗的工程師在書裡告訴我們:「有時候,用goto就是會讓程式碼更簡潔」,開始有人發現,只要goto用的恰到好處,即使你的程序導向思想有了瑕疵,但是卻可以讓你的程式碼寫的更好。

在物件導向的世界裡面,也存在著所謂正統思想,舉例來說,為了達成封裝的概念,類別裡頭的變數,就不該暴露給類別以外的人看到,為了達成這一點,成員變數要設定成private,然後加寫setter/getter兩個method,以確實達成封裝的正統思想。

可是有一天,Java出現了,裡頭有個重要的功能叫做reflection,這個功能可以讓工程師在執行時期,把類別的內部所有公有、私有成員,都看的一清二楚,著名的Java Framework大量地使用reflection來造就更大的彈性,物件導向的封裝理念,好像出現了不純正的因子。然後 .NET出現了,本身也具有reflection功能,奇怪,為什麼這些有可能毀壞正統思想的東西,不但沒有消失,而且被採用的地方越來越多呢?

就像工程數學裡頭的拉普拉斯轉換-換個domain,讓問題更簡單。

物件導向和元件導向的不同
以物件導向為基礎,佐以UML,衍生出OOP(物件導向程式設計)、OOD(物件導向系統設計)、OOA(物件導向系統分析),這些大家耳熟能詳的名詞。至於本篇標題中「元件導向」這個名詞,一般比較少見,而且在Java出現之後,一個類別的原始檔(.java),編譯之後變成一個獨立的二進位檔(.class),使得物件導向和元件導向之間的差異被模糊了。

物件導向和元件導向的最大差異,在於物件導向是「原始碼層級」的開發概念,而元件導向是「二進位層級」的開發概念。換句話說,物件導向強調用封裝、繼承、多型,在編譯時期實現程式碼的重複使用性,而元件導向,則是利用每一個已經編譯成元件的二進位檔,在執行時期重複地使用。

想像一個充滿了動態聯結函式庫(DLL)的系統,DLL可以為許多人所共用,而且不耗費記憶體,開發人員可以在執行時期利用Win32 API – LoadLibray()以及GetProcAddress()在執行時期載入自己想要的DLL模組,達到了靜態連結所無法達到的彈性與重複使用性。

然後世界進化成COM以及CORBA。以COM來說,開發人員可以在執行時期,利用QueryInterface()得知到底該模組有哪些功能,使彈性比單純的DLL更勝一籌,不過缺點就是需要額外的IDL檔來描述該元件。到了Java,這些描述元件的資訊(meta data)直接就存在class檔之中,所以開發人員可以簡單地利用reflection探測該元件(類別)有哪些功能。.NET則更進一步,加強了meta data的內容,並導入Versioning等新功能,模組搖身一變,變成Assembly,讓元件導向的程式開發更為容易。

從上述這個簡單的歷史回顧,您一定可以發現,元件導向程式設計,一直在物件導向程式設計之外輔佐開發人員,讓開發人員可以完成一個在執行時期具有充分彈性的系統。

從COM到Java
Stuart Dabbs Halloway所撰寫的《Component Development for The Java Platform》,就是一本專注於以Java來完成元件導向程式設計的書。作者早年從事於COM的開發與設計,但一直覺得COM實在太過複雜,直到Java出現,發現Java可以用更簡單的方式,實現COM所提供的功能之後,立刻轉而研究Java......

從COM到.NET
相對於Java的觀點,.NET的忠實使用者,也需要一本用.NET的觀點來看待元件導向程式設計的好書。如果您是一位Microsoft技術的忠實用戶,絕對不能錯過Juval Lowy所撰寫的《Programming .NET Component》這本書......

這個世界需要各式各樣的想法
從程式導向、物件導向、元件導向、到Aspect-Oriented (AOP),以及現在大家所矚目的Service-Oriented (SOA),這些思維彼此間並不是互相取代的關係,而是提供開發人員,遇到特殊問題的時候,可以採用某種思維以便更快速地解決問題。

從一而終,死板地遵守每種思維的教條,不允許任何「雜質」來破壞思想的純正,不該發生在一位現代軟體開發人員身上。

Component Development for The Java Platform
Stuart Dabbs Halloway著
Addison-Wesley Professional出版
售價:34.99美元
推薦:Amazon四顆半星

Programming .NET Component
Juval Lowy著
O'Reilly出版
售價:44.95美元
推薦:Amazon五顆星

《作者簡介》王森
現任昇陽教育訓練中心經理,及Run!PC、iThome專欄作者,曾著深入淺出KJava、Java手機程式設計入門、Java深度歷險、手機/PDA程式設計入門等書,並於Run!PC開闢Java與PDA、Java與手機、深入JDK、Web Services的應用等專欄 。從COM到Java

Stuart Dabbs Halloway所撰寫的《Component Development for The Java Platform》,就是一本專注於以Java來完成元件導向程式設計的書。作者早年從事於COM的開發與設計,但一直覺得COM實在太過複雜,直到Java出現,發現Java可以用更簡單的方式,實現COM所提供的功能之後,立刻轉而研究Java。

這本2002年所出版的書,現在讀起來,絲毫不會感覺到因為Java版本快速變動而導致其內容過時。這是因為這本書所介紹的並不是Java程式語言,而是Java平臺的系統面,這些都是Java用來實現元件導向程式設計的基礎設施。除了Java SE 5.0開始,在class file format與JVM所加強的部分之外,本書的內容一點不老舊。

作者在本書一開始,就展示了一個小範例,說明物件導向與元件導向差異,在此範例中,元件導向的設計方式,使用了Java的Reflection功能,完成了用COM來做要複雜好幾倍的工作,並且傳達了一個在執行時期相對有彈性的一個小程式。

因此,作者在本書用了整章的篇幅,討論Java之所以可以在執行時期,簡單取得物件型態與其成員的Reflection功能,當然,介紹reflection的同時,也順道討論了Dynamic Proxy。

本書最有價值的部分,在於用了整整兩章的篇幅,介紹Class Loader的架構、運作方式,以及如何客制化類別載入的機制。本書在Class Loader的介紹上,目前還沒看到其他相關書籍能出其右。

本書另外有一個名為「Serialization」的章節,和一般Java書籍介紹Java Serialization的內容有很大的不同,一般的書籍裡,都是介紹如何利用Java Serialization來完成永續儲存的概念,而本書卻是強調Java平臺利用存在於class file裡面的metadata,配合Java Serialization,完成像是RMI這樣遠端元件的概念。

最後,作者以Generative Programming為題,說明了一些Code Generation的概念,像是Java RMI中,skeleton與stub程式碼的自動產生、JSP自動編譯成Servlet的議題、以及EJB部署到Application Server之後,EJB Container自動產生程式碼以供分散式存取,都有概略的介紹。總的來說,本書完整地傳達了元件導向程式設計的精隨,也因此本書內容,不同於一般傳統的Java程式設計書籍。從COM到.NET

相對於Java的觀點,.NET的忠實使用者,也需要一本用.NET的觀點來看待元件導向程式設計的好書。如果您是一位Microsoft技術的忠實用戶,絕對不能錯過Juval Lowy所撰寫的《Programming .NET Component》這本書。

Juval Lowy是一位Microsoft技術的忠實愛好者,從早期DLL的開發,接著和COM技術奮鬥多年、等到ATL出現之後,他才跟IDL說了拜拜,繼續邁入DCOM的世界,也曾經使用MTS與COM+來開發系統,直到.NET的出現,開始找到了技術生命中的太陽。

這本書有趣的地方在於,既然都是號稱元件導向,所以他的章節內容,其實和前面所介紹的《Component Development for The Java Platform》,有很多地方類似。比方說,作者一樣在最開頭的第一章,先解釋了物件導向到底和元件導向有什麼不同,列出了一些”條件”,告訴我們怎樣叫做元件導向。對作者來說,兩者最重要的差別,在於物件導向是建構在『繼承』這樣的特性,而元件導向則是大量地使用『介面』來降低每個模組之間的隅合程度。另外,一樣有章節討論Serialization and Persistence,一樣有章節討論Remoting(類似Java的RMI機制),兩本書都看過的人,大概會驚嘆,行銷上看起來水火不容的兩個技術,結果竟是異曲同工,萬流歸宗呀!

然而,.NET既然號稱擷取了Java的優點,並且做了改進,所以本書也談到了在Java書籍中不會談到的Assembly Versioning議題(Java到目前為止,對JAR檔的Versioning機制還在JSR制定當中),以及.NET Component Services(有點類似Aspected-Oriented,在Java以AspectJ來實現)。

熱門新聞

Advertisement