![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
DiverD |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
Попробую описать свой вопрос, нужна написать стандартизированый модульный интерфейс , на основе которога писались бы модули. Т.e. у нас есть general.pl который подгружает модули из lib "mods" при этом не нужна править сам general.pl в зависимости от работы модуля, иными словами можна взять за пример скажем 3d studio max, т.е. у нас установлен дистриб, вот скачали мы плагин который улучшает наложение шейдеров, заинсталили его, запустив 3d max плагин этот уже в деле. ps: даже не знаю с чего начать, но идея дика заинтересовала. --------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Какой-то сумбур в вопросе.
Не так часто и быстро. Объясни подробнее. |
|||
|
||||
DiverD |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
Ну вот пару ссылок нашел:
http://en.wikipedia.org/wiki/Abstract_factory_pattern http://www.rsdn.ru/article/patterns/AbstractFactory.xml ну вот что та нашел... --------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
DiverD, поиск на форуме неплохой, недавно работу с плагинами обсуждали
|
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
||||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Такого счастья хочешь или тебе нужна реальная Абстрактная Фабрика ![]() Скрипт написан около трех лет назад (с тех пор я про него просто забыл - он просто работает ![]() --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Я бы лучше:
Добавлено @ 08:32 Или, тогда уж, *main::can=*UNIVERSAL::can; Это сообщение отредактировал(а) tishaishii - 8.3.2007, 08:29 |
|||
|
||||
DiverD |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
thnx, попробую потом отпишу
--------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
DiverD, не заморачивайся Абстрактной Фабрикой! Web-оно в 99% случаев требует более простых (более легких и более быстрых в реализации) решений.
Если хочешь посмотреть что "полегче" - начни отсюда: http://ooad.asf.ru/Patterns_title.aspx?IdKat=9 Все эти решения, в какой-то мере, наверно каждый у себя использовал. P.S. Если ты знаком с Шаблонами Проектирования, эта ссылка покажется тебе очень легким чтивом. Тогда уж, извини. --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
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 |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Ой, не знаю про что ты написал. Там куча каких-то умных формулировок.
Но я однозначно против eval всуе: eval { $anObj = new $module ($cgi); }; И так и не понял, откуда берётся метод can у любого модуля. Ну нет у него такого метода по-умолчанию. |
|||
|
||||
DiverD |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
Zuzu не я не для веба пишу, решил написать бота работающего по средсвам irc, что бы к ниму можна было писать плагины ( модули ) в определенном стандарте, что бы скажем кидал эти модули в папку plugins и при старте бота они автоматом подгружались и можны было с ними работать..
Посморел ваши реализации немнгога доганяю но не до конца, попробую перед сном посидеть сегодня с ручкой, может что нить надумаю. ps: по идеи не сложна, в голове что та крутиться но выдать не могу=)) --------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
DiverD, не парься для IRC есть такая тема с поддержкой плагинов POE::COMPONENT::IRC
|
|||
|
||||
DiverD |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
я знаю про POE и другой CPAN но мне не нужны модули=)
--------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
Zuzu |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Забудем про парадигмы управления (описанные, в частности, М.Фаулером). Оно нам на самом деле здесь ни к чему. Извини, на самом деле слегка скатился во флэйм. Просто я, когда "игрался" с реализациями (на Perl) механизмов распределенного управления, допустил аналогичную ошибку. Вот и понесло...
Все модули, которые находятся в каталоге mod - объектно-ориентированные. По сути, это классы. Или, в терминах Perl, процедура new() каждого пакета (package) возвращает ссылку, приведенную (blessed) к этому пакету. Я думаю, очевидно, что в этом случае порожденный объект будет иметь (по крайней мере) еще и методы "родительского" класса UNIVERSAL, который является родительским классом по-умолчанию (perldoc perltoot, UNIVERSAL: The Root of All Objects). Поэтому вызов метода can() корректен для любого объекта. Если не секрет, почему тебя смущает eval {} ? Были какие-то случаи? Я всегда считал eval - этаким механизмом перехвата ошибок. Об этом, в частности, написано в документации. (perldoc -f eval) Меня в твоем коде больше смущает вызов функции, как процедуры пакета ( &UNIVERSAL::can($module, 'new')) ), для проверки наличия new() как метода создаваемого объекта. Т.е. проверяется именно наличие процедуры new() в пакете $module. При этом: Во-превых, происходит (может у меня в голове?) некое торможение из-за одновременного использования двух различных стилей (процедурного и объектно-ориентированного) для, по идее, одной сущности - нашего вызываемого метода из нашего объекта. Как говорится, либо объекты, либо процедуры. Лично я стараюсь без особой необходимости не мешать их друг с другом. Во-вторых, про объектно-ориентированную суть $module мы так ничего и не узнаем. Добавлено @ 11:32 Все достаточно просто. 1. Есть каталоги mod - для модулей www - для кортя сервера 2. В каталог mod помещаются файлы, названные одноименно с именем пакета (класса)
3. В каталог www помещается файл-контроллер (index.cgi) 4. Вызов нужного модуля происходит при "нажатии" на ссылку типа: index.cgi?module=order&method=show 5. Желающие могут "завернуть URL" с помощью .htaccess (чтобы спрятать внутренний механизм реализации, например) 6. Чтобы предотвратить вызов (контроллером) "неправильных" методов из "неправильных" объектов, они распологаются либо не в каталоге mod, либо имя файла не совпадает с именем пакета. ![]() Это сообщение отредактировал(а) Zuzu - 11.3.2007, 14:24 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
DiverD |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
Zuzu
ясн=) проста именно программно немножка не понимаю, пытаюсь представить этокий конструтор в голове но не сильн получается --------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |