c# - C# 或其他语言中的 Scala 风格抽象模块?

标签 c# java scala architecture dependency-injection

我正在阅读 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 做到了这一点,它带来了一些其他的好东西,这些好东西虽然不错,但对于整个 spread abstract-module-class over multiple source files 想法来说并不是核心。 C# 具有部分类,它们提供相同的功能,并且还允许嵌套类。大概其他一些语言对嵌套类也有类似的支持,以及将一个类拆分为多个文件。

这种模式是否出现在 C# 或任何其他语言中的任何地方?我认为许多语言的大型项目都面临着抽象模块旨在解决的问题。有什么理由说这个“抽象类作为抽象模块”不起作用,因此没有被使用吗?在我看来,与提供相同功能的各种 DI 框架相比,这是一个更简洁的解决方案。

最佳答案

通常与 ML 模块进行比较,其中 Scala 特征(或抽象类)扮演 ML 签名的角色,而它们的具体实现(通常是 Scala 对象)扮演 ML 结构的角色。 ML模块的讨论here应该使连接相当清楚。

Scala 和 ML 之间的类比是经过深思熟虑的,如果您查看 Scala 编译器的源代码,您会发现 Scala 对象通常使用包含“Module”作为一部分的名称来引用。

关于c# - C# 或其他语言中的 Scala 风格抽象模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10944264/

相关文章:

c# - 将类库公开为 WCF 服务

c# - 包含比 StartsWith 快?

java - 错误 : Class "test2" is mapped, 但不包含在任何

java - 我如何指定一个同时匹配 String 和 long 的类型?

scala - Monocle 的 Optionals 与部分镜片相同吗?

scala - 有效地返回 scala 排序集合中不存在键的下一个较大值?

c# - 如何从 C# 向 Gmail 发送电子邮件

c# - 如何忽略公共(public)类或方法的帮助文件生成器生成的文档?

java - 如何在 Java 中测试特定索引处是否存在对象?

java - Scala 的数值库