設計模式之ArcGIS的API設計

      去年一年在外出差做項目實施有10個月。所做的工作都是ArcGIS的擴展研究及開發。

      今年終於有時間停下來,學習一下新的東西,認真總結一下自己的知識了。因爲C++中沒有反射機制,而且是ArcGIS是基於COM技術的,所以ArcGIS的擴展都是基於COM技術的。如何擴展其實就是做兩件事,一,確定是否有擴展點,而,如果有擴展點,實現需要實現的接口,完成接口中的方法。

      擴展需要什麼基礎?其實做了很多之後就兩點,一是不做假設,而是瞭解C++的常用設計模式。

      在組件式開發的基礎上寫擴展最重要的一個原則就是不做假設,你不能假設接口中的方法是在什麼環境下返回特定的東西。而因該考慮通用的設計下,我只返回Client調用過程中需要的東西,此處對返回不能特化。這個地方的確很難理解。因爲擴展的組件可以在任何環境下采用,如果特化,調用順序或方式改變,就有可能發生問題。譬如,我爲電信機站渲染寫的ISymbol擴展組件,9.3下的ISymbol內的方法的調用順序和9.2下ISymbol內的調用順序是有差別的,假如我對接口內的方法調用順序有假設(可能會利於GDI初始化),結果就會出現問題。

      關於模式,我在ArcGIS的開發中不斷的學習和總結。事實上ArcGIS的架構是相當精良的。有些人說是設計過度,那是因爲他自己沒有深入到擴展應用的層次,只是做些代碼的堆積,如果僅是這樣開發,這些人是不需要懂得設計和模式的;事實上大部分的GIS功能在ArcGIS的組件中已經提供,用戶需要學習的僅僅是如何按照順序去調用,至於組件是如何寫出來的,大部分人是不會去關心和了解的。  

     對於ArcGIS模式的瞭解也是一個長期的過程,事實上通過ArcGIS自己提供的對象模型圖(OMD)我們是可以瞭解一些產品架構的,但是僅限於此還是很難了解底層的架構。我覺得最有用的是研究ArcGIS提供的擴展例子和說明,在GOOGLE上搜索Extending ArcObjects可以找到許多相關例子。此外通過動手寫一些組件,通過VC調試器查看AO的接口調用過程也能弄清楚具體調用細節。但是可以肯定地是清楚瞭解模式是所有這些的基礎。

      ArcGIS的API中最長用的幾種模式有factory,bridge,facde,等等。日後會慢慢總結自己所做的逆向工程。因爲ArcGIS在以後的產品進化過程中會往輕量級應用靠近(便於雲部署),但是產品的設計框架會更強調架構上的靈活性。

發佈了77 篇原創文章 · 獲贊 77 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章