我從08年畢業之後就開始做ArcEngine二次開發,很幸運。因為通過ArcEngine二次開發,我較深刻的瞭解了ArcEngine庫的組織方式,瞭解了通過物件導向技術,怎麼把那麼龐大的類庫組織的井井有條。我覺得ArcEngine庫的組織方式比.Net Framework的庫的組織方式還要好。當然這兩個庫有著本質的區別。ArcEngine庫是面向某個具體的業務方向,只要熟悉該業務的人員,再學習ArcEngine庫會有很大的優勢。而.Net Framework庫是一個基礎庫,面向的是絕大部分的程式員,各種能力、各種背景。所以它要能讓開發人員有一個循序漸進的學習過程,這些東西可能也影響了.Net Framework庫整體結構。
在使用ArcEngine庫的過程中,逐漸加深了我對物件導向的理解,以前想不通的地方,不明白的很多都是從ArcEngine庫的組織上得到了啟發。學習ArcEngine庫除了你要有一定的GIS RS知識,還要要求你對物件導向有深刻的理解。如果具備上面的條件,你只要使用ArcEngine的開發協助和ArcGIS案頭工具基本上一些常用的功能就都能搞定了。
既然是使用ArcGIS案頭工具和協助,那我就來說說這兩個東西。ArcGIS案頭工具就是ArcMap,是在ArcObject庫的基礎上開發的。而ArcEngine又是ArcObject庫的簡化版。三者就是以上的關係。所以ArcMap常用的一些功能,用ArcEngine基本上都能開發出來。所以在尋找介面,實現功能的時候,ArcMap也給了我們很好的產考。例如在設定FillSymbol時,發現FillSymbol可以設定顏色和邊線顏色,以及邊線寬度。我們就很容易想到IFillsymbol介面具有Color屬性和OutLine屬性,並且OutLine屬性類型為ILineSymbol。ArcMap的介面組織和ArcEngine庫很相似,是一個很好的開發參考資料。
ArcEngine協助,一提起ArcEngine協助,我就不得不說.Net的協助。我一般看協助就是看類之間的繼承關係,屬性,方法,事件等,再多一些就是一些應用執行個體。ArcEngine很清晰的把這些組織到了一起,尋找起來十分方便舒服。雖然.Net協助也能夠提供這些資訊,但卻是要費你一些力氣。但對於初學者就像以前的我是從來不關注繼承關係的,這就為那時的我提供了不少的方便。
物件導向技術到底有多重要,值得我們那麼大力度的宣傳?我沒有用過面向方面編程技術,也不瞭解Ruby這種動態語言。但至少現在支援物件導向的靜態語言是現在使用最廣泛的的一種程式設計語言。我從大二的時候學習編程,中間也學過C++物件導向編程這門課,但我最終理解還是到了大四。當時看了一本道現在已經想不起來的書,CSDN推薦的,那時候才算是對物件導向瞭解了一些,最起碼知道幹嘛的,什麼時候用了。當我畢業之後,工作了一年多,看了敏捷開發設計,重構,領域驅動設計,企業架構模式等書,並且熟悉了ArcEngine庫的組織圖後,才能寫出了好的物件導向代碼,做出了好的物件導向設計。那時我才敢說我寫的代碼是物件導向的,我的設計是可拓展的。
促使我寫本篇文章的原因之一就是我看了ERSI官方給的ArcGIS API for SIlverlight 的例子。我把原始碼下下來一看,整個就是垃圾。一點組織邏輯都沒有,一點可擴充性,可讀性也沒有。如果說ERSI的技術人員不行的話,那可就錯了,我看了ArcGIS API for Flex的例子,那個例子寫的很好,可配置,可擴充,代碼模組組織的也比較好。那我就想不明白了,為什麼Silverligt的代碼就那麼差呢?難道所有人寫C#代碼都那麼隨意嗎?這也是C#程式員一直被人詬病的原因。但實際情況確實c#程式員比Java程式員瞭解系統分層,瞭解重構等比較早一些。Java語言有很多好的開源系統可以參考,而C#卻沒有或者很少。從這個例子也能看出來,一個那麼大的公司,一個技術那麼雄厚的公司,寫出來的C#的例子就是這樣的水平,這樣的代碼只能誤人子弟。我看到ERSI中文社區中很多人都在要、討論或或是在其基礎上擴充,感覺害人很深。
什麼時候C#能像Java一樣,開源能發展起來,優秀的開源項目多起來,特別一些大公司不要發布垃圾代碼,誤人子弟,真正的讓物件導向思想深入C#程式員中。