1

ケーキパターンの大きな制限の1つは、静的であるということです。異なるコーダーによって完全に独立して作成された可能性のある特性をミックスインできるようにしたいと思います。しかし、特性はしません頻繁に混ぜる必要があります。ユーザーには、メインアプリケーションを実行する前に、特性/アセンブリを選択する初期化画面が表示されます。そこで、ユーザー選択選択モジュールで、選択した特性をミックスインしてコンパイルしないのはなぜかという考えが浮かびました。コンパイルが失敗した場合でも、ユーザーはメッセージ(互換性のないアセンブリなど)を返すだけで問題ありません。コンパイルが成功した場合、最上位のUIモジュールは、アセンブリのコンパイル済み部分を含む新しくコンパイルされたクラスをロードし、メインアプリケーションを実行します。実行時の初期化中にコンパイルされるクラスは1つまたは2つだけでよいことに注意してください。残りのコードはすべて正常にコンパイルされている可能性があります。

私はScalaにかなり慣れていません。これは認識されたパターンですか?それに対するサポートはありますか?比較的単純な依存関係の状況でGuiceを使用しなければならないのは気が狂っているようです。アプリケーション内からScalaコンパイラーを簡単に実行できますか?メモリ内で実行し、その出力を不要なファイルを作成せずにメモリから使用できますか?

注:動的に見えますが、この方法は100%静的なままです。

編集すると、MicrosoftのRoslynプロジェクトの推進力の1つは、C#とVisualBasicでこの種のことを可能にすることでした。しかし、それは強力なMicrosoftチームにとってさえかなり大きなプロジェクトだったようです。

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 に答える