2008-08-11 81 views
15

是否有將擴展性功能編入代碼的一般過程?添加插件功能的建議?

我想知道一般的過程是什麼擴展類型的能力添加到您正在編寫的系統,以便可以通過某種插件API擴展功能,而不必修改系統的核心代碼。

這樣的事情往往取決於系統寫入的語言,還是有一個允許這樣的一般方法?

回答

3

這通常是你必須暴露自己的東西,所以是的,它將取決於你的系統寫入的語言(儘管通常也可以爲其他語言編寫包裝)。

例如,如果您有一個用C語言編寫的Windows程序,插件將作爲DLLs寫入您的程序。在運行時,您會手動加載這些DLL,並向它們展示一些接口。例如,DLL可能會公開一個gimme_the_interface()函數,該函數可以接受一個填充了函數指針的結構。這些函數指針將允許DLL進行調用,註冊回調等。

如果您使用的是C++,那麼您將使用DLL系統,除非您可能傳遞一個對象指針而不是一個結構體,並且該對象會實現一個提供功能的接口(完成與結構相同的事情,但不那麼難看)。對於Java,您可以按需加載類文件而不是DLL,但基本思路是相同的。

在任何情況下,您都需要在代碼和插件之間定義一個標準接口,以便您可以初始化插件,這樣插件就可以與您進行交互。

P.S.如果您希望看到一個C++插件系統的好例子,請查看foobar2000 SDK。我很久沒有使用過它,但它曾經做得非常好。我認爲它仍然是。

+0

是的,我害怕它會是這樣一個答案。不過,好處在於,這意味着您完全可以控制插件可以做的事情。 – kaybenleroll 2008-09-15 22:25:35

1
  1. 找出你想插入插件作家的最低要求。然後製作一個或多個接口,寫者必須爲您的代碼實現以知道何時何地執行代碼。

  2. 製作一個API,作者可以使用該API訪問代碼中的某些功能。

您還可以創建一個作者必須繼承的基類。這將使API更容易接線。然後使用某種反射來掃描目錄,然後加載找到的符合要求的類。

有些人還爲他們的系統製作了腳本語言,或者爲現有語言的子集實現瞭解釋器。這也是一條可能的路線。

底線是:當你得到代碼加載,只有你的想象力應該能夠阻止你。
祝你好運。

4

我過去曾使用基於事件的API進行插件。您可以通過調度事件並提供對應用程序狀態的訪問來插入插件的鉤子。例如,如果您正在編寫博客應用程序,則可能需要在將新帖子保存到數據庫之前引發一個事件,並將該帖子的HTML提供給插件以根據需要進行更改。

2

我很想你指向設計模式一書把這個通用的問題:對

說真的,我認爲答案是否定的。默認情況下,你不能編寫可擴展的代碼,它將很難寫入/擴展,而且效率非常低(Mozilla始終以可擴展性爲主題,到處都使用XPCOM,現在他們意識到這是一個錯誤,並開始移除它它沒有意義)。

有意義的是確定可以進行有意義擴展的系統組件,併爲這些情況支持適當的API(例如編輯器中的語言支持插件)。你會使用相關的模式,但具體的實現取決於你的平臺/語言選擇。

IMO,它也有助於使用動態語言 - 可以在運行時調整核心代碼(當絕對必要時)。我很高興Mozilla的可擴展性在編寫Firefox擴展時以這種方式工作。

1

如果您使用的是C或C++等編譯語言,通過腳本語言查看插件支持可能是個好主意。 Python和Lua都是優秀的語言,用於編寫大量應用程序(Civ4和blender使用Python,Supreme Commander使用Lua等)。

如果您使用的是C++,請查看boost python庫。否則,python附帶可以在C中使用的頭文件,並且記錄C/python API的功能相當好。 Lua的文檔看起來不太完整,但我可能沒有足夠努力。無論哪種方式,您都可以提供一個相當穩定的腳本平臺,而無需大量工作。它仍然不是微不足道的,但它爲您提供了一個很好的工作基礎。

2

我認爲有兩個方面你的問題:

該系統的設計是可擴展的(設計模式,控制和其他建築方面的倒置)(http://www.martinfowler.com/articles/injection.html)。而且,至少對我來說,是的,這些模式/技術是獨立於平臺/語言的,可以被看作是「一般程序」。現在

,其實施是語言和平臺dependend(例如,在C/C++你的動態庫的東西,等等)

幾個「框架」已經發展到給你一個編程環境,爲您提供可插拔性/可擴展性,但正如其他人提到的,不要太瘋狂,使所有東西都可插拔。

在Java世界的一個很好的規範來看看是OSGi的(http://en.wikipedia.org/wiki/OSGi)有幾種實現最好的一個恕我直言,是春分(http://www.eclipse.org/equinox/