自從我學習程式設計開始,就不斷地聽到大家談論物件導向。在最開始接觸c++時,確實被它的oo特性迷住了,相比之前用過的c語言更加豐富多彩。想當初,經常因為寫出了乙個類而暗自自豪半天。
現在做程式設計師也有些年頭了,回過頭來看以前似乎領悟到的oo思想又有了一些新的感悟。
提起oo,大家都會想到class關鍵字。以前老師這麼教的,平時自己也是這麼用的。雖然有些語言中的表現不一樣,但本質上都是差不多的。剛開始時,說oo是一種技術;後來說oo是一種潮流;再後來說oo是一種信仰;後來的後來說oo是一種思想,總之是越說越玄。
不過有一點卻是肯定的,我們可以將oo思想用在不支援oo特性的語言中。比如說,學了c++的人去寫c程式,很可能寫出來的還是c++風格的。
進一步推理,oo思想可以在語言之外體現出來。
外掛程式分為**和配置兩個部分,**實現外掛程式的業務,配置檔案處理外掛程式特性和外掛程式之間的互動關係。可以說,在外掛程式系統中,**加配置組成的那個東西也能叫做「物件」,也就是**之外的物件。
當我們能將oo思想擺脫**的侷限時,那麼就能擁有更加廣闊的思考空間了。
封裝、繼承、多型是物件導向的三大特性。對於外掛程式來說,封裝是能很好地表現出來,但對於繼承和多型卻非常難實現了。至少我現在還沒有看到有人將外掛程式做成支援繼承的。
以前有人問我覺得物件導向的三個特性中哪乙個最有意思。當時我回答是多型,因為它最靈活。多型是和繼承繫結的,繼承是一種強耦合,也就是說派生類和基類不 可解耦。在有些時候繼承和多型能帶來意想不到的好處,但更多時候我們需要用組合來代替繼承,以此獲得更大的靈活性,尤其是站在系統的層面。
比如說有兩個模組功能非常接近,如果按照派生的思路,在這兩個模組之上提出乙個基類,繼承兩個子類來完成具體的功能。對於**之中的物件這樣做沒什麼問 題,但對於**之外的物件,只能採用組合來代替派生的思路了。做法是將兩個模組的公用部分做成乙個公用子模組c,不同部分做成a、b兩個模組。a與c組合 起來生成第乙個模組,b與c組合起來生成第二個模組。
還有一種解決方法就是用配置來處理模組特性,大家可以參考我以前寫過的文章。
在設計模式中也強調「組合優於繼承」。
將軟體模組比作積木,我們程式設計師就是玩積木的人了。各種各樣的類庫和框架、加上形形色色的控制項,都是我們玩的積木。在外掛程式系統中,外掛程式就是積木。本文的著重點是外掛程式系統。
好的「積木」需要具備以下的幾點:
1、可插拔性,動態載入
2、外觀可調
3、顯示位置可配置指定
4、統一的列表管理
5、元素之間可通訊
上面介紹一些基本的要點,也是外掛程式系統需要解決的若干個問題。上面的這些問題在以前的文章中已經簡單介紹過。解決上述問題的方法多種多樣,很感謝那些和我分享自己解決方法的朋友們:)
在現在的專案中,最關鍵的一點就是「配置」,這就要求滿足1、2、3點,而4、5點則是將外掛程式組裝成完整系統的必備因素。
粗略地可以將程式設計師分成兩類:做積木、與玩積木的人。
做積木的人指的就是那些自己寫控制項、外掛程式的人,玩積木的人指的就是將各種各樣控制項或外掛程式組裝成系統的人。在業界大多數人都會認可那些自己寫控制項的,對於「只會拖拖控制項」的程式設計師則不屑一顧。
我們很難說做積木與玩積木的人哪乙個水平高,因為需要的是兩種不同的能力。做積木的人需要對底層計算機技術有深刻的了解,而玩積木的人則需要對業務、使用者需求和整體框架有清楚的認識。兩個層面的人都需要有優化的意識。
很多學生的眼中,技術含量指的就是學習系統底層知識,掌握計算機原理;但工作過一段時間,尤其是做行業軟體的程式設計師則會有不同的看法,他們更加關注怎樣來「玩積木」,同樣是一門學問。這也就是設計模式在學生中很少有人知道,而演算法等基礎理論離職業化程式設計師越來越遠的原因。
我們不能僅僅按照做積木和玩積木兩種型別來區分技術含量,不同的工作對技術的側重點不一樣。不過在我看來,玩積木才是我真正想做的事情,也可以說是架構設計了。當然,成為乙個優秀的架構師還是相當困難的。
trackback:
讀《現代軟體工程 構建之法》1 5章的感受
1 看完書後的第一感覺 晚上抽出時間看了軟體工程這本書。剛開始的時候我也就憑著對作業的要求去看了1 5章,並沒有深刻的去了解,甚至有的章節還就一眼帶過,或者直接跳過,直到很隨便的看完後,並沒有了解到多少。說句心理話,這本書在我認為真的是很枯燥乏味,但能成為我們的學習課程之一,一定有它的好處,有它的知...
用禪宗理解 軟體開發的境界
用禪宗理解 軟體開發的境界 1.參禪之初 看山是山,看水是水 初學軟體開發時認為 c 是 c,vb 是 vb 都要乙個乙個學 2.禪有悟時 看山不是山,看水不是水 等到漸漸地運用純熟了,可以觸類旁通,發現以前學過的那些語言和將要新學的,總有這樣那樣的相通 相近 相似之處。任何一門 語言,都能快速上手...
用隱喻來更充分的理解軟體開發
隱喻是對事物或知識的通俗抽象,能幫助人更好的理解知識,也可以啟發探索不同的方向。化學家庫勒夢見一條蛇咬著自己的尾巴,醒來後他意識到類似的環狀分子結構可以解釋苯的各種特性。後來的實驗證實了他的這個假說。好的隱喻除了幫助人們理解事物,也能助力事物的研究。例如天圓地方的隱喻無法解釋為什麼航海時會先看到桅杆...