1

我阅读了Opa 文档,但没有发现模块和包之间的区别,以及模块或包如何链接到 Opa 应用程序的源代码布局。

有人可以提供有关如何以及何时使用模块与包的合理示例吗?

4

3 回答 3

2

套餐

您可以将应用程序的某些部分隔离到不同的packages. 例如,您可以创建 3 个包:模型、视图和控制器。package myApp.model只需在属于模型包的源文件的开头定义示例即可。

然后,如果您的某个视图文件需要模型,只需import myApp.model在文件开头添加即可。

除了在源文件中写入packageimport之外,您还可以使用单个 conf 文件:

myApp.controller:
    import myApp.view
    src/controller.opa

myApp.view:
    import myApp.model
    src/view.opa

myApp.model:
    src/model.opa

然后使用 --conf 编译选项。

模块

一个模块是这样定义的

module MyModule {
   function f(){ void }
}

您可以通过以下方式访问模块功能MyModule.f()

包内的模块

因此,如果您有一个包含定义model模块的包MyModule,并且您想从外部访问它,您将编写:

import myApp.model
MyModule.f()

更新:阅读下面的消息,它们提供了其他有用的信息。

于 2012-06-06T13:36:10.967 回答
2

只是为了补充 Cedrics 的回答:

包是一个基本的编译单元。如果一个包或它所依赖的任何包发生了变化,那么它不需要重新编译。对于较小的项目,不使用包可能是可以的,这相当于将所有内容放在一个包中。对于较大的项目,您通常希望将项目拆分为多个包以从单独的编译中受益。

模块主要为相关定义提供命名空间。您可以在一个包中包含多个模块。

Opa 不施加任何文件名限制。您可以在一个文件中包含多个模块,它们的名称与文件名无关。包名称和文件在源目录树中的位置之间也没有强加关系(尽管在这里使用约定肯定是有意义的)。显然,一个文件属于一个包。

于 2012-06-07T06:47:22.500 回答
0

基本上,包总是用于包含在另一个文件中定义的值和函数。(除了那些在标准库中定义的。)因此它可以将代码部分彼此分开,或者换句话说,将您的代码构造成不同的部分。Cédrics 回答中已经解释了他们的使用方式。包不提供抽象,因为完整的代码总是包含在import.

另一方面,模块提供抽象。使用模块,可以定义仅在模块内部使用而从外部不可见的值和函数。这使得可以向模块的用户隐藏部分实现,并为外部提供定义良好的接口。这个概念使更改特定实现部分变得更容易,而不会破坏使用模块的代码。这是程序设计中非常重要的概念。

于 2012-06-07T08:31:13.817 回答