Martin Odersky の著書 Programming in Scala の抽象モジュールに関するセクションと、彼の論文 Scalable Component Abstractions を調べていました。
http://lampwww.epfl.ch/~odersky/papers/ScalableComponent.pdf
私の要点は、モジュールをオブジェクトの代わりに抽象クラスにすることです(または、Java のような古典的な静的なグローバル モジュール)。
abstract class myModule{
// this is effectively an abstract module, whose concrete
// components can be configured by subclassing and instantiating it
class thing{}
class item{}
object stuff{}
class element{}
object utils{}
}
異なる具体的な特性を持つモジュールの複数のサブクラスとインスタンスをインスタンス化できます。これにより、状況に応じてモジュールをさまざまに構成できます (たとえば、テスト中にデータベース コンポーネントを置き換えたり、開発環境で IO コンポーネントを置き換えたりするなど)、複数のモジュールをそれぞれ独自のモジュール スコープの変更可能な状態のセットでインスタンス化できます。
私が理解できることから、基本的なレベルでは、外側のクラスがモジュールとして機能できるように、ネストされたクラスを持つことができるというのは難しい要件です。
他の実際的な要件は、クラス定義を複数のファイルに分散できることです。これは、多数のクラスを含むモジュールは、単一のソース ファイルでほとんどが受け入れるよりも多くのコード行になる可能性があるためです。
Scala は Traits を使ってこれを行います。Traits は、複数のソース ファイルにまたがる抽象モジュール クラス全体に広がる優れた機能の中心ではありません。C# にはpartial classes
、同じ機能を提供する があり、ネストされたクラスも使用できます。おそらく、他のいくつかの言語では、ネストされたクラスや、クラスを複数のファイルに分割するための同様のサポートがあります。
この種のパターンは、C# やその他の言語のどこかで発生しますか? 多くの言語での大規模なプロジェクトは、抽象モジュールが解決しようとしている問題に直面していると思います。この「抽象モジュールとしての抽象クラス」が機能せず、使用されない理由はありますか? 私には、同じ機能を提供するさまざまな DI フレームワークよりもはるかにクリーンなソリューションのように思えます。