2012-06-16 44 views
1

蛋糕模式的一個很大的侷限性就是它的靜態。我希望能夠完全獨立地混合可能由不同編碼人員編寫的特徵。然而,而不是的特點需要經常混入。在主應用程序運行之前,用戶將有一個初始化屏幕,他們可以選擇特徵/程序集。所以我想到了爲什麼不在用戶選擇選擇模塊中混合並編譯所選擇的特徵。如果編譯失敗,用戶將不會收到一些消息 - 不兼容的程序集或任何問題。如果編譯成功,那麼頂級UI模塊將會使用程序集的預編譯部分加載新編譯的類並運行主應用程序。請注意,可能只需要在運行時初始化期間編譯一個或兩個類。所有其他代碼都可以正常編譯。Scala:懶蛋糕和蛋糕模式的運行時編譯

我對斯卡拉來說很新。 這是一種公認​​的模式嗎?有沒有對它的支持?似乎很生氣,不得不使用Guice來獲得相對簡單的依賴情況。 我可以在應用程序中輕鬆運行Scala編譯器嗎?我可以在內存中運行它,並且可以在內存中使用它的輸出而不會創建不必要的文件

注意:雖然看起來是動態的,但這種方法仍然會保持100%靜態的

編輯它發生在Microsoft的Roslyn項目的驅動器之一是爲C#和Visual Basic啓用這種事情。但即使對於一個高性能的微軟團隊來說,這似乎也是一個相當大的項目。

+0

過去幾天有個問題,看起來像你的:http://stackoverflow.com/questions/11054299/can-we-assign-change-traits-to-the-scala-class-during -runtime-how-any-sampl –

+0

@ om-nom-nom不,我不認爲它是同一個問題。我只是試圖自動化開發人員可以手動執行的操作。選擇一些mixins編譯類,使模塊與預先存在的庫結合起來,然後運行程序。它根本不違背靜態範式。 –

+0

@RichOliver鑑於JVM的侷限性,這些特徵中的代碼必須插入到爲其工作編譯的類中。 –

回答

6

直接從Scala調用編譯器是可行的,但不是膽小的。幸運的是,Twitter上的好人已經爲你自動完成了這個過程。 (140個角色名人微博,以及一些很酷的Scala實用程序!感謝Twitter。)您可以使用com.twitter.utils.Eval類來編譯和評估Scala字符串。在你的榜樣,你會做這樣的事情

val eval = new Eval() 
val myObj = eval[BaseClass]("new BaseClass extends " + traitNameList.mkString(" with ")) 

這將創建你所有你想要建在性狀的新對象。隨之而來的問題,這是否是一個好主意。缺點:

  • 呼喚Scala編譯器是不是快
  • 如果這樣做的話,你會超載PermGen的空間,爲類創建將永遠不會被垃圾收集
  • 這還真是比較你需要一種動態語言而不是Scala。你可能會找到各種各樣的作品的地方,但與你的建築的其餘部分(是的,這是模糊的)衝突。
+0

是的,我想我樂觀地尋找編譯器作爲一種服務,即使對於C#團隊來說,它已經證明是一個非常重要的項目。 –

+0

鑑於問題細節中的上下文,上述缺點似乎都不是顯示阻止者。 –