Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Стандартизированый модульный интерфейс |
Автор: DiverD 4.3.2007, 02:15 |
Попробую описать свой вопрос, нужна написать стандартизированый модульный интерфейс , на основе которога писались бы модули. Т.e. у нас есть general.pl который подгружает модули из lib "mods" при этом не нужна править сам general.pl в зависимости от работы модуля, иными словами можна взять за пример скажем 3d studio max, т.е. у нас установлен дистриб, вот скачали мы плагин который улучшает наложение шейдеров, заинсталили его, запустив 3d max плагин этот уже в деле. ps: даже не знаю с чего начать, но идея дика заинтересовала. |
Автор: tishaishii 4.3.2007, 04:45 |
Какой-то сумбур в вопросе. Не так часто и быстро. Объясни подробнее. |
Автор: DiverD 4.3.2007, 13:59 |
Ну вот пару ссылок нашел: http://en.wikipedia.org/wiki/Abstract_factory_pattern http://www.rsdn.ru/article/patterns/AbstractFactory.xml ну вот что та нашел... |
Автор: nitr 4.3.2007, 14:39 |
DiverD, поиск на форуме неплохой, недавно работу с плагинами обсуждали |
Автор: shamber 4.3.2007, 20:51 |
DiverD, http://forum.vingrad.ru/s/7b321a7f2286cfb7a741af77f6115e6e/topic-137537.html, правда до совсем готового решения там далеко ![]() ![]() |
Автор: Zuzu 7.3.2007, 11:57 | ||
Такого счастья хочешь или тебе нужна реальная Абстрактная Фабрика ![]() Скрипт написан около трех лет назад (с тех пор я про него просто забыл - он просто работает ![]() |
Автор: tishaishii 8.3.2007, 08:25 | ||
Я бы лучше:
Добавлено @ 08:32 Или, тогда уж, *main::can=*UNIVERSAL::can; |
Автор: DiverD 9.3.2007, 11:48 |
thnx, попробую потом отпишу |
Автор: Zuzu 9.3.2007, 14:04 |
DiverD, не заморачивайся Абстрактной Фабрикой! Web-оно в 99% случаев требует более простых (более легких и более быстрых в реализации) решений. Если хочешь посмотреть что "полегче" - начни отсюда: http://ooad.asf.ru/Patterns_title.aspx?IdKat=9 Все эти решения, в какой-то мере, наверно каждый у себя использовал. P.S. Если ты знаком с Шаблонами Проектирования, эта ссылка покажется тебе очень легким чтивом. Тогда уж, извини. |
Автор: Zuzu 9.3.2007, 16:37 | ||
tishaishii, спасибо за комментарии. Видимо реально настало время провести Refactoring (улучшение кода) для моего, уже давно работающего, программного обеспечения. ![]() Про use lib. Не особо много хостинговых серверов я знаю, но на всех из мне известных есть правильно возведенная $ENV{DOCUMENT_ROOT} и оно работает. И под Perl 5.6 и под 5.8. Естественно, предпологается, что index.cgi запускается из-под web-сервера, поэтому наличие/отсутсвие $ENV{DOCUMENT_ROOT} просто не проверяется. Да и использовать FindBin не было особого желания. По твоему коду есть два мелких комментария. 1. В большинстве случаев метод new() есть. Поэтому вызов дополнительного can на проверку наличия этого метода не совсем оправдан. Я предпочту просто попытаться его вызвать (раз уж нужно будет это сделать потом) и отловить ошибку в случае проблем. 2. $module->new($cgi)->$method; У sub execute() есть еще одна особенность. Она не должна выдавать ошибок, которые к ней, к execute, не относятся. Т.е. если есть ошибка в модуле или его вызвали неверно, сказать об этом разработчику и указать, по возможности, не на себя, а на тот модуль, который эту ошибку вызвал. Во-первых, у тебя нет проверки на "объекность" модуля (у меня ее тоже не было, кстати), поэтому эта строка может вызвать ошибку времени выполнения (прямо в этой строке, в sub execute {} ), хотя реально "ответсвинен за ошибку" тот модуль, который мы вызывали (пытаемся вызвать). Во-вторых, ИМХО, такая реализация менее читаема. Если ты подразумевал такой строчкой реализацию механизма распределенного управления (distributed control) (вместо централизованного управления - см. М. Фаулер, UML-2, основы, главу 4, про диаграммы последовательностей), то такая реализация к нему не приводит. Все равно сначала вычисляется new(), ссылка на объект возвращается в execute() и оттуда снова выполняется $method. Постарался учесть это все в коде, который привожу ниже (только sub execute). Несмотря на то, что сразу поставил на рабочий проект, отладить по-нормальному просто не было времени.
|
Автор: tishaishii 9.3.2007, 18:03 |
Ой, не знаю про что ты написал. Там куча каких-то умных формулировок. Но я однозначно против eval всуе: eval { $anObj = new $module ($cgi); }; И так и не понял, откуда берётся метод can у любого модуля. Ну нет у него такого метода по-умолчанию. |
Автор: DiverD 10.3.2007, 15:06 |
Zuzu не я не для веба пишу, решил написать бота работающего по средсвам irc, что бы к ниму можна было писать плагины ( модули ) в определенном стандарте, что бы скажем кидал эти модули в папку plugins и при старте бота они автоматом подгружались и можны было с ними работать.. Посморел ваши реализации немнгога доганяю но не до конца, попробую перед сном посидеть сегодня с ручкой, может что нить надумаю. ps: по идеи не сложна, в голове что та крутиться но выдать не могу=)) |
Автор: shamber 10.3.2007, 15:58 |
DiverD, не парься для IRC есть такая тема с поддержкой плагинов http://search.cpan.org/~bingos/POE-Component-IRC-5.22/lib/POE/Component/IRC.pm |
Автор: DiverD 11.3.2007, 00:52 |
я знаю про POE и другой CPAN но мне не нужны модули=) |
Автор: DiverD 12.3.2007, 00:08 |
Zuzu ясн=) проста именно программно немножка не понимаю, пытаюсь представить этокий конструтор в голове но не сильн получается |