Perl 模块依赖组织和包含顺序

标签 perl module perl-module

我知道 perl 中的循环模块依赖以及这是一个非常糟糕的主意,例如:

package ModuleA;
use ModuleB;

package ModuleB;
use ModuleA;

我想问问以下模型是否安全,是否遵循一些最佳实践规则:

package main;
use ModuleA;
use ModuleB;

package ModuleA;
use ModuleB;
use ModuleC;

package ModuleB;
use ModuleC;

另外我想问一下 use 模块的顺序是否有影响?例如如果

package main;
use ModuleA;
use ModuleB;

相同
package main;
use ModuleB;
use ModuleA;

如果

package ModuleA;
use ModuleB;
use ModuleC;

相同
package ModuleA;
use ModuleC;
use ModuleB;

等等

编辑: 请注意,ModuleA 显式加载 ModuleC(并且不依赖于 ModuleB 它将加载 ModuleC),因为 ModuleA 使用 ModuleC 中的函数。这是好的设计方法吗?

最佳答案

最佳实践很简单:每个文件、程序或模块都应指定其所有依赖项。而已。例如,如果脚本需要模块 A 和 B,而模块 A 需要模块 B,则不要指望模块 B 已经被脚本加载 - 如果其他脚本需要模块 A 而不需要 B 怎么办?

好的基于 Exporter 的模块应该使用 @EXPORT_OK 并且您应该在 use 子句中明确列出导入的子例程。它有助于防止名称冲突。

对于仅导出子例程的普通模块,顺序无关紧要。但在其他情况下,它可能会:考虑

use warnings_;
use diagnostics;

对比

use diagnostics;
use warnings_;

关于Perl 模块依赖组织和包含顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28046133/

相关文章:

perl - 我如何限制 Perl 程序中的下载?

perl - 在 Perl 中访问具有子进程的数组

c++ - 如何使用 C++ 在 Node 中编辑歌曲元数据?

recursion - OCaml:具有一等模块和存在类型的递归

Perl:如何在样板模块中注入(inject) UTF-8 pragma?

perl - 处理相互使用的模块的最佳方式是什么?

Perl:为什么不应该使用 "last"退出 grep 或映射?

perl - 使用 perl 解析文件并将特定值插入数据库

javascript - TypeScript 和 systemjs 循环依赖

linux - 将主脚本变量传递到 Perl 模块