1

蛋糕图案的一大局限是它的静态性。我希望能够完全独立地混合可能由不同编码人员编写的特征。然而特征不会需要经常混入。在运行主应用程序之前,用户将有一个初始化屏幕,他们将在其中选择特征/程序集。所以我想到为什么不在用户选择选择模块中混合和编译选择的特征。如果编译失败,用户只会收到一些消息——不兼容的程序集或其他任何问题。如果编译成功,那么顶层 UI 模块将加载新编译的类以及程序集的预编译部分并运行主应用程序。请注意,在运行时初始化期间可能只需要编译一两个类。所有其余的代码都可以正常编译。

我对 Scala 很陌生。这是公认的模式吗?有什么支持吗?对于相对简单的依赖情况,不得不使用 Guice 似乎很疯狂。我可以在应用程序中轻松运行 Scala 编译器吗?我可以在内存中运行它并从内存中使用它的输出而无需创建不必要的文件吗?

注意:虽然看起来是动态的,但这种方法将保持100% 静态。

编辑它发生在 Microsoft 的 Roslyn 项目的驱动力之一是为 C# 和 Visual Basic 启用这种东西。但这似乎是一个相当大的项目,即使对于一个强大的微软团队来说也是如此。

4

1 回答 1

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 的那种东西。你很可能会找到各种工作的地方,但与你的架构的其他部分发生冲突(是的,这很模糊)。
于 2012-06-16T15:10:37.613 回答