Julia 代码封装。这是一个普遍的好主意吗?

标签 julia encapsulation

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

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

有什么更好的方法?

最佳答案

Julia 有 3 个级别的“可以放置代码的地方”

  • 包含的文件
  • 子模块
  • packages -- 就我们的目的而言,它恰好有 1 个(非子)模块。

我曾经是子模块的忠实粉丝,因为我来自 python。

但是 julia 中的子模块并不是那么好。 根据我的经验,无论是从开发人员的角度还是从用户的角度来看,用它们编写的代码都会很烦人。 它只是不干净。 我已经从我的至少一个包中删除了子模块,并切换到纯 includes.

Python 需要子模块来帮助处理它的命名空间——“命名空间很棒,让我们做更多”。 但是由于多次分派(dispatch),julia 不会用完函数名——你可以重用相同的名称,使用不同的类型签名,这很好(Good even)

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

我发现子模块有问题:

说你有:

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

人们通常会使用 A.B
但是你可能会错误地using B,因为B 可能在你的LOAD_PATH 中一个名为B.jl 的文件中。 如果你这样做,那么你想访问类型 C。 如果你已经使用 A.B,当你输入语句 B.C() 时,你最终会得到一个类型 A.B.C。 但是如果你错误地使用了B,那么B.C() 会给你类型B.C。 而且这种类型与期望为 A.B.C 的函数(因为它们使用正确的using)不兼容。 就是有点乱。

reload("A.B") 也不起作用。 (但是 reload 通常效果不佳)


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

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

关于Julia 代码封装。这是一个普遍的好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40310787/

相关文章:

package - julia:创建和使用没有 Internet 的本地包

julia - 具有 "issetequal"的数组数组的唯一元素

c++ - 重载 operator= 作为非成员

append - Julia 推!或追加!浮点值到整数数组

julia - 在 Julia 中计算 K 均值的余弦相似度

javascript - 最小化 JS getter/setter 样板文件

ios - Swift 中的封装与其他 OO 语言中的封装一样重要吗

c++ - 在 C++ 中是否可以通过类似属性的语法调用访问器?

java - 如何避免Java中脆弱的基类

Julia 程序,执行过程