OSGi框架在Java中提供的严格模块化概念是否可用于任何其他编程语言?
我觉得C ++中friend
类的概念有点类似,但它似乎是一个更精细的控件。我不确定friend
概念是否可以在namespace
级别应用。
在其他语言中,我不知道,如果有人能在这里提供一些见解,我将非常感激。
答案 0 :(得分:2)
有很多语言都有模块系统。立即想到的三个是标准ML的模块系统,Racket的单元系统和Newspeak的模块系统。
有些人认为这三者比OSGi或类似系统更强大或更好(或两者兼而有之)。
我特别喜欢Newspeak模块系统,因为它非常简单。事实上,Newspeak甚至没有拥有模块系统,只是证明如果你认真对待 ,那么类会自动成为模块定义,并自动成为对象成为模块。
这与标准ML,Racket或OSGi等其他模块系统形成鲜明对比,后者通常疯狂复杂。以下是关于设计模块系统的BitC编程语言设计师Jonathan Shapiro的一句精彩而有趣的话:
ML模块系统仅由David MacQueen完全理解,并且仅在交替的几周内完全理解。 Scheme模块系统需要Matt Flatt和Matthias Felleisen(以及语言标准的六个版本)的组合才能实现。
当Haskell的设计师之一Simon Peyton Jones被问到为什么Haskell只有这样一个基本的模块系统时,他说他们并不觉得他们足够聪明来设计一个真实的系统。让它沉入...... Haskell的设计师。 不聪明。
Newspeak的设计非常出色:在面向对象中,一切都是消息发送(用Java语言表示,这是一种(非静态)方法调用,在C ++中 - 说这是一个虚函数调用)。在大多数面向对象的语言中,遗憾的是不正确。您有变量,字段,常量,非虚函数,静态方法,类字典,包字典等。访问任何这些都不是通过消息发送,而是通过其他方式。
Newspeak不是这样:在Newspeak中,一切都是消息发送。甚至类的超类也是消息发送。 (即:如果我在Newspeak中写class Foo extends Bar
,那么Bar
不是对类本身的引用,它只是调用一个名为Bar
的方法,然后将返回一个类。哪个BTW意味着你可以覆盖子类中的超类,这是非常令人费解的。)
这意味着顶级类不能有超类:因为超类是消息发送,你将它发送到哪里?在顶级类中,您只能调用类本身中定义的方法:您无法从封闭范围调用方法,因为在顶级类中,没有封闭范围。并且你不能调用从超类继承的方法,因为为了声明一个超类,你需要调用一个方法,但是你只能调用里面定义的类的方法
现在,这不是很有用,因此类具有类初始化器,允许您将对象(和类是对象)注入到类中。这是将依赖项注入类的唯一方法,因为类初始化程序作为模块依赖项规范运行。
另一方面,如果做某事的唯一方法是通过消息发送,那么类的内部是自动私有的,其功能只能通过调用公共方法来实现。因此,公共方法用作模块接口规范。
其他一些很酷的功能也自然而然地脱颖而出。许多其他模块系统没有的功能:由于模块实际上只是一个类,您可以拥有模块的多个实例,只需像对任何其他类一样多次调用构造函数。在许多其他模块系统中,模块都是单例。
并且,您可以将参数传递给构造函数,从而为您提供参数化模块,这些模块通常仅由非常高级的模块系统支持(如果有的话)。