Короче говоря, я пытаюсь смоделировать топологию сети, используя объекты для каждого экземпляра в сети. Кроме того, у меня есть класс менеджера верхнего уровня, ответственный за управление этими объектами и выполнение проверок целостности. Файловая структура выглядит следующим образом (я пропустил большую часть объектных файлов, так как все они имеют примерно одинаковую структуру):
Manager.pm
Constants.pm
Classes/
+- Machine.pm
+- Node.pm
+- Object.pm
+- Switch.pm
Проработав несколько лет в ООП, я фанат повторного использования кода и т. д., поэтому я настроил наследование между этими объектами, дерево наследования (в этом примере) выглядит так:
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
package Switch;
, а вы на 5.8. В 5.8 был основной модуль под названиемSwitch
(злополучный оператор case Дамиана), так что это плохая идея. - person cdarke   schedule 14.09.2012