1. 程式人生 > >讓軟體具有二次開發功能,提高產品的應變能力

讓軟體具有二次開發功能,提高產品的應變能力

任何一個軟體,都不可能完全滿足所有使用者的需求,為此,我們必須經常修改我們的程式,隨著使用者的數量的增加,我們會感覺很累,儘管我們的程式增加了很多可以配置的功能,但是還不夠,使用者的需求總在變化,我們無法阻擋,我們不可能將程式中所有的環節都設定為可改變的。是否有一個好的辦法,可以減輕一下開發人員的負擔,二次開發是一個很好的選擇。

很多人都知道,AutoDesk是一個著名的CAD軟體公司,AutoCAD是其最著名的產品之一,該軟體在世界各地的應用非常普及,除了產品本身的易用性和適應性之外,軟體本身具有的二次開發功能,是其在很多行業根深蒂固的重要原因之一。AutoCAD本身功能有限,但是由於其良好的設計,並且兼有非常優秀的SDK解決方案,使用者可以通過二次開發按照自己的要求擴充軟體功能,甚至使得AutoCAD與企業的管理系統融為一體,很多企業,尤其是製造業,幾乎無法離開AutoCAD。

我們設計軟體開始時,往往首先考慮實現功能,然後再考慮優化,基本上不考慮二次開發的功能,其實,二次開發功能也是軟體可維護性的一部分。我們的軟體具有二次開發功能,則在一定程度上,使用者可以自己實現一些不具備的功能,而不是由公司的程式設計師修改程式碼,然後重新由工程人員給使用者升級,這樣週期長,維護的費用非常之高。軟體具備二次開發功能,具有如下的幾點好處:1、提高軟體產品的競爭力,軟體的適應性更高,可以更多方面的滿足使用者的需求;2、降低軟體的維護成本,尤其在資訊管理類軟體上,使用者的需求總在變化,程式設計師沒有必要總是修改程式碼,使用者可以自己實現,或者由售後工程師自己在使用者工作現場實現。3、將軟體系統的功能限制在一定的範圍之內,而不是根據使用者的要求,無限制的修改程式程式碼,以增加新的功能,可以在一定程度上降低、甚至消除因修改系統程式碼帶來的風險。

當然,增加軟體具有二次開發功能,要做很多工作,會使初期的開發週期較長。但是,考慮到後期的種種好處,前期的付出是完全值得的。

那麼,如何讓我們的軟體具備支援二次開發的功能?最基本的就是程式動態呼叫預定義的DLL中的函式或類,實際的情況可能會複雜一些,下面舉一個簡單的例子,通過純粹的DLL說明如何實現一個二次開發功能。

1)首先我們完成一個簡單的程式,其中包括兩個模組,MyApp.EXE和Sys.DLL。MyApp直接呼叫Sys.DLL,Sys.DLL包括所以系統的命令函式。這兩個模組組成了一個功能完整的系統,可以很好的執行。

2)增加一個SDK.DLL,其中封裝了Sys.DLL中的很多公開的函式,供使用者呼叫。

3)我們規定使用者在SDK.DLL上開發得到的新的DLL必須具有兩個基本函式,第一個函式是BOOL IsUserDLL(),並且返回TRUE,另一個函式是BOOL ExecUserCommand(void * pParam),可以執行UserDLL.DLL中的函式命令。

4)增加一個Adapter.DLL模組,該模組通過LoadLibrary函式動態呼叫UserDLL.DLL,並且可以執行其中的函式。它可以同時載入多個使用者DLL,並且將有關函式指標儲存到一個數組中,便於在適當的時候通過指標呼叫函式。

5)修改MyApp.EXE使之可以在適當的位置呼叫Adapter.DLL。

修改之後的系統如下所示:

其中UserDLL.DLL是使用者根據SDK.DLL開發的,MyApp通過Adapter.DLL間接呼叫UserDLL.DLL,再間接呼叫SDK.DLL,再間接呼叫Sys.DLL。這樣,使用者可以很方便的擴充MyApp的功能,並且可以修改系統的很多屬性,例如改變系統的狀態,修改其選單,修改工具條,增加新的選單等等。

如果你認為直接通過純粹的DLL進行二次開發不方便,你可以通過COM封裝Sys.DLL,這個COM模組就是COMSDK.DLL,這樣,有了COM介面,使用者可以通過COM對MyApp進行二次開發,這是的adapter.DLL必須修改一下,使之既可以動態載入DLL,有可以動態載入COM。

微軟推出.NET多年了,如果你希望使用者可以使用.NET對MyApp進行二次開發,沒有問題,您可以在COMSDK.DLL的基礎上通過.NET再封裝一次,產生一個NETSDK.DLL,修改adapter.DLL使之可以呼叫.NET的程式碼。修改之後系統的結構如下:

 

我通過通過VC6編寫的MyAPP,其中的SYS.DLL,SDK.DLL,Adapter.DLL都是通過VC開發的,如果希望程式支援.NET,建議使用Visual Studio 2005開發,C++/CLR可以方便的實現C++與.NET程式碼的混合程式設計。

我們設計的新版軟體,現在面臨這樣的問題:面對新的使用者,我們直接在新程式的基礎上修改程式碼以滿足使用者的要求,還是,將軟體的基本功能限制在一個範圍之內,然後通過SDK,開發新的功能,以滿足該使用者的特殊要求?在經歷了苦難的維護歷程之後,我毅然決然的選擇了後者,我們的新版軟體必須具有二次開發的功能,否則,我們死定了。

軟體二次開發的基本結構確定之後,就是明確設定一個軟體的功能範圍,那些是產品的基本功能,那些功能應該通過SDK實現等等,這點非常重要。另外,Sys.DLL可能由多個DLL組成,這些DLL的力度,功能,以及他們之間的介面等問題,看看設計模式和麵向物件的設計等書籍,當然,關鍵是實事求是。