简而言之,我尝试使用网络中每个实例的对象来建模网络拓扑。此外,我还有一个顶级管理器类,负责管理这些对象并执行完整性检查。文件结构看起来像这样(我省略了大部分目标文件,因为它们的结构都非常相同):
Manager.pm
Constants.pm
Classes/
+- Machine.pm
+- Node.pm
+- Object.pm
+- Switch.pm
从事 OOP 工作多年,我是代码重用等的粉丝,因此我在对象之间设置了继承,继承树(在此示例中)如下所示:
Switch -+-> Node -+-> Object
Machine -+
所有这些对象的结构如下:
package Switch;
use parent qw(Node);
sub buildFromXML {
...
}
sub new {
...
}
# additonal methods
现在有趣的部分:
问题 1
如何在不静态输入名称的情况下确保正确加载所有这些对象?根本问题是:如果我只是require "$_" foreach glob("./Classes/*");
得到许多“子程序新重新定义在”错误。我还尝试了use parent qw(-norequire Object)
,Module::Find
以及各种组合的其他一些@INC
修改,以使其简短:它不起作用。目前我正在静态导入所有使用的类,它们会自动导入它们的父类。
所以基本上我要问的是:(perl-)正确的方法是什么?
高级:能够创建更复杂的文件夹结构(因为会有很多对象)并且仍然具有继承+“自动加载”,这将非常有帮助
问题 2 -已解决
我怎样才能“分享我的进口”?我使用了几个库(我自己的,包含一些辅助函数、LibXML
、Scalar::Util
等),我想在我的对象之间共享它们。(这背后的原因是,我可能需要为所有对象添加另一个通用库,并且很有可能会有超过 100 个对象 - 手动编辑所有对象并使用正则表达式 / 脚本执行此操作在理论上可行,但是这似乎不是最干净的解决方案)
我尝试了什么:
- 将所有内容导入
Manager.pm
-> 在 Manager 包中工作 - 给我类似“未定义的子例程 &Switch::trace 调用”之类的错误 - 在每个对象中创建一个
include.pl
文件和//do
它- 给我同样的错误。require
use
- 还有一些我很遗憾不记得的东西
include.pl
基本上看起来像这样:
use lib_perl;
use Scalar::Util qw(blessed);
use XML::LibXML;
use Data::Dumper;
use Error::TryCatch;
...
我再次问:正确的方法是什么?我是在使用正确的方法,只是在执行中失败了,还是应该完全改变我的结构?
为什么我当前的代码不能很好地工作并不重要,到目前为止,为这些问题提供一个正确、干净的方法就足够了:)
编辑:完全忘记 perl 版本 -_- 旁注:我无法升级 perl,因为我需要使用 5.8 的库:/
C:\> perl -version
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 50 registered patches, see perl -V for more detail)
Copyright 1987-2006, Larry Wall
Binary build 820 [274739] provided by ActiveState http://www.ActiveState.com
Built Jan 23 2007 15:57:46