我阅读了Opa 文档,但没有发现模块和包之间的区别,以及模块或包如何链接到 Opa 应用程序的源代码布局。
有人可以提供有关如何以及何时使用模块与包的合理示例吗?
您可以将应用程序的某些部分隔离到不同的packages
. 例如,您可以创建 3 个包:模型、视图和控制器。package myApp.model
只需在属于模型包的源文件的开头定义示例即可。
然后,如果您的某个视图文件需要模型,只需import myApp.model
在文件开头添加即可。
除了在源文件中写入package
和import
之外,您还可以使用单个 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()
更新:阅读下面的消息,它们提供了其他有用的信息。
只是为了补充 Cedrics 的回答:
包是一个基本的编译单元。如果一个包或它所依赖的任何包发生了变化,那么它不需要重新编译。对于较小的项目,不使用包可能是可以的,这相当于将所有内容放在一个包中。对于较大的项目,您通常希望将项目拆分为多个包以从单独的编译中受益。
模块主要为相关定义提供命名空间。您可以在一个包中包含多个模块。
Opa 不施加任何文件名限制。您可以在一个文件中包含多个模块,它们的名称与文件名无关。包名称和文件在源目录树中的位置之间也没有强加关系(尽管在这里使用约定肯定是有意义的)。显然,一个文件属于一个包。
基本上,包总是用于包含在另一个文件中定义的值和函数。(除了那些在标准库中定义的。)因此它可以将代码部分彼此分开,或者换句话说,将您的代码构造成不同的部分。Cédrics 回答中已经解释了他们的使用方式。包不提供抽象,因为完整的代码总是包含在import
.
另一方面,模块提供抽象。使用模块,可以定义仅在模块内部使用而从外部不可见的值和函数。这使得可以向模块的用户隐藏部分实现,并为外部提供定义良好的接口。这个概念使更改特定实现部分变得更容易,而不会破坏使用模块的代码。这是程序设计中非常重要的概念。