一言で言えば、私はネットワーク内のすべてのインスタンスのオブジェクトを使用してネットワークトポロジをモデル化しようとしています。さらに、これらのオブジェクトの管理と整合性チェックの実行を担当するトップレベルのマネージャークラスを取得しました。ファイル構造は次のようになります(すべてのオブジェクトファイルはほぼ同じように構造化されているため、ほとんどのオブジェクトファイルを省略しました)。
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バージョンを完全に忘れた-_-補足:5.8でスタックしているライブラリが必要なため、perlをアップグレードできません:/
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