Julia 代码封装。这通常是个好主意吗?

Julia code encapsulation. Is this a generally good idea?

Julia 用户使用 module 关键字将功能封装到自己的模块中是否很常见?

我一直在研究模块,它们似乎使用 include 比实际使用 module 关键字更多。

更好的方法是什么?

Julia 有 3 个级别 "Places you can put code"

  • include 个文件
  • 子模块
  • packages——为了我们的目的,它只有 1 个(非子)模块。

鉴于我来自 python。

,我曾经是子模块的忠实粉丝

但是 julia 中的子模块不是很好。 根据我的经验,从开发人员和用户的角度来看,使用它们编写的代码往往很烦人。 它只是不干净地工作。 我已经从我的至少一个包中删除了子模块,并切换到普通 includes.

Python 需要子模块,以帮助处理其命名空间 -- "Namespaces are great, lets do more of those"。 但是由于多重分派,julia 不会 运行 出函数名——你可以重复使用相同的名称,但类型签名不同,这很好(好偶数)

一般来说,子模块允许您将每个子模块彼此分离和解耦。但在那种情况下,你为什么不使用完全独立的包呢? (具有共同的依赖性)

我发现子模块出错的地方:

说你有:

 - module A
     - module B (i.e A.B)
         - type C 

一个人通常会做 using A.B
但是错误地你可以做 using B,因为 B 可能在你的 LOAD_PATH 中一个名为 B.jl 的文件中。 如果你这样做,那么你想要访问类型C。 如果您完成了 using A.B,那么当您输入语句 B.C() 时,您将得到一个类型 A.B.C。 但是,如果您错误地完成了 using B,那么 B.C() 会为您提供类型 B.C。 而且这种类型不兼容,因为函数(因为它们做对了 using)期望为 A.B.C。 只是有点乱。

另外reload("A.B")也不行。 (然而 reload 通常效果不佳)


Base 是使用子模块(据我所知)的唯一主要 julia 代码块之一。甚至 Base 也被推送到 julia 0.7 的单独 (stdlib) 包中。

简而言之,如果您正在考虑使用子模块, 检查这不是你从另一种语言带过来的习惯。 并考虑您是否不只是想发布另一个单独的包。