代码之家  ›  专栏  ›  技术社区  ›  anirvan

其他编程语言中类似OSGi的模块化

  •  2
  • anirvan  · 技术社区  · 15 年前

    严格的 OSGi框架在Java中提供的模块化,在任何其他编程语言中都可用?

    我觉得 friend 朋友 概念可以应用于 namespace 水平。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Jörg W Mittag    15 年前

    有很多语言都有模块系统。三个立即浮现在脑海中的是标准ML的模块系统、球拍的单元系统和Newspeak的模块系统。

    有些人认为这三个系统比OSGi或类似的系统更强大或设计更好(或两者兼而有之)。

    认真地 ,类自动成为模块定义,对象自动成为模块。

    这与其他模块系统(如标准ML、Racket或OSGi)形成了鲜明的对比,它们通常是 疯狂的 复杂。以下是BitC编程语言设计师Jonathan Shapiro关于设计模块系统的一段有趣的话:

    当Haskell的设计师之一Simon Peyton Jones被问及为什么Haskell只有这样一个基本的模块系统时,他说他们觉得自己不够聪明,无法设计出一个真正的模块系统。让它沉入。。。这个 Haskell的设计师 不聪明

    NeXTalk的设计非常精彩:在面向对象中,每件事情都是一个消息发送(在java中,这是一个(非静态的)方法调用,在C++中,这是一个虚函数调用)。在大多数面向对象语言中,不幸的是这不是真的。您有变量、字段、常量、非虚拟函数、静态方法、类字典、包字典等。访问其中任何一个都不是通过消息发送完成的,而是通过其他一些方式。

    在Newspeak上就不是这样了:在Newspeak中,一切都是消息发送。甚至类的超类也是消息发送。(即:如果我写 class Foo extends Bar 在Newspeak,然后 Bar 对类本身的引用,它只是调用一个名为 酒吧 ,然后返回一个类。这意味着您可以重写子类中的超类,这非常令人吃惊。)

    是不是 封闭范围。并且不能调用从超类继承的方法,因为 声明 作为一个超类,您需要调用一个方法,但您只能调用定义的方法 全班同学。

    只有 将依赖项注入类的方法,因此类初始值设定项作为模块依赖项规范发挥作用。

    其他一些很酷的功能也自然会从中脱颖而出。许多其他模块系统没有的特性:由于模块实际上只是一个类,所以可以有一个模块的多个实例,只需像调用任何其他类一样多次调用构造函数。在许多其他模块系统中,模块是单例的。

    而且,您可以将参数传递给构造函数,从而为您提供参数化模块,这通常仅由非常高级的模块系统(如果有的话)支持。