我正在阅读 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 来做到这一点,它带来了一些其他的好东西,这些东西很好,但不是整个散布在多个源文件上的抽象模块类的核心思想。C# has partial classes
,它提供相同的功能,并且还允许嵌套类。大概其他一些语言对嵌套类以及将一个类拆分为多个文件有类似的支持。
这种模式是否出现在 C# 或任何其他语言的任何地方?我认为许多语言的大型项目都面临抽象模块要解决的问题。这个“抽象类作为抽象模块”的东西不起作用,因此没有被使用,有什么原因吗?在我看来,与提供相同功能的各种 DI 框架相比,它是一个更简洁的解决方案。