2012-06-16 71 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

鉴于问题细节中的上下文,上述缺点似乎都不是显示阻止者。 –