2010-08-05 51 views
5

所以元編程 - 可以在運行時修改類/對象,注入新方法和屬性的想法。我知道它對框架開發的好處;一直在使用Grails,並且該框架在運行時爲您的類添加了一堆方法。你在User對象上有一個name屬性,而bamm,你會在運行時注入一個findByName方法。元編程,它有什麼好處?

  1. 我的描述是否完全描述了這個概念?
  2. 除框架開發之外,還有什麼其他好處(具體示例)?
+2

這有什麼好處?絕對沒有。 – Radu 2010-08-06 18:52:51

+1

http://en.wikipedia.org/wiki/War_(Edwin_Starr_song) – Tom 2010-08-06 18:55:49

+0

可能存在重複一些答案指出,您的描述不正確。您的描述似乎涉及反思和麪向方面的編程(AOP)。這兩個在運行時擴展了語言的功能。元編程在編譯時擴展了語言的能力,特別是在類型系統(類型系統)上運行的能力。另一方面,反思增加了在運行時對類型進行操作的能力。 – rwong 2013-12-06 23:10:46

回答

3

對我來說,元編程是「編寫程序的程序」。

元編程是重用特別好,因爲它支持的概括:您可以定義屬於特定模式概念家庭。然後,通過可變性您可以將該概念應用於類似但不同的場景。

最簡單的例子是Java的getter和setter通過@Sjoerd提到:

兩個getter和setter遵循良好定義圖案:吸氣劑返回類構件,和一個設置器類成員的值。通常你建立一個叫做的模板,以允許應用和重用那個特定的模式。模板如何工作取決於正在使用的元編程/代碼生成方法。

如果您希望getter或setter以稍微不同的方式行爲,您可以向模板添加一些參數。這是變異性。例如,如果您想在獲取/設置時添加額外的處理代碼,您可以添加一段代碼作爲變異性參數。混合自定義代碼和生成的代碼可能會很棘手。 ABSE是目前我知道的唯一一種MDSD方法,它本身直接支持自定義代碼作爲模板參數。

1

元編程不僅在運行時添加方法,它還可以在編譯時自動創建代碼。即代碼生成代碼。

  • Web服務(即在WSDL定義的方法,你想,如果他們的對象真實的方法來使用它們)
  • 避免樣板代碼。例如,在Java中你應該使用getter和setter,但是這些可以自動爲大多數屬性設置。
+0

我認爲元編程是一個特定的運行時間事物。有趣。關於鍋爐板代碼的好點(Grails也是這樣做的)。還要別的嗎? – hvgotcodes 2010-08-05 13:32:41

+0

@hvgotcodes:元編程主要是編譯時間;與運行時用法相比,運行時使用實際上非常罕見。見f.e. C++模板(這是一種元編程,即使沒有多少人願意承認這一點):所有使用STL的程序......有很多。 – liori 2010-08-06 18:52:51

0

元編程不僅用於添加東西到您的代碼庫。它也可以用來描述你正在處理的當前代碼,而不用耦合你的代碼庫。它在「多對多關係」應用中非常有用,如mediator pattern