Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

"Модульность" проектов

244
28 июля 2009 года
UAS
2.0K / / 19.07.2006
Вообщем, встала задача в проекте реализовать модульность. Т.е. как, допустим, в WP - закинули лишь модуль в нужную папку и все работает.
Нужно это больше для моих нужд, так как сейчас снова засел за WEB-проекты.. Чтобы легче было разрабатывать фрагменты кода как для меня, так и для сторонних доработчиков.

Сейчас я это представляю как разделение модулей на специфичные категории. Т.е. часть работает как бы сама по себе на сайте (типа голосования, счетчики); часть берет инфу с сайта (например, создание меню); другие встраиваются в статьи; третьи вообще нигде не отображаются, кроме как в админке, но в коде должны исполняться (типа сбор инфы о юзере, etc.).
Далее завести функцию, например, register_module($module_name,$category). Ну и в коде будет участок, который будет выполнять все эти зарегистрированные модули в необходимом месте.
Для каждого типа модулей написать свой interface (т.е. все модули будут идти как классы, часть основных функций для работы будет уже реализована мной, т.е. остается только расширить необходимый класс), тем самым упростив жизнь как себе, так и сторонним людям.

Понимаю, что в моём вопросе уже есть ответ. Но перед тем как начать писать, хотелось бы послушать мнения других более опытных людей, чтобы потом не пришлось повторять чужих ошибок.
13
28 июля 2009 года
RussianSpy
3.0K / / 04.07.2006
Собственно, а в чем вопрос состоит?
244
28 июля 2009 года
UAS
2.0K / / 19.07.2006
Собственно, верно ли я рассуждаю и может кто знает методы поудобнее?
5
28 июля 2009 года
hardcase
4.5K / / 09.08.2005
Как-то уже давал ссылку на архитектуру плагинов, возможно будет полезна:
http://forum.codenet.ru/showpost.php?p=236902&postcount=2
353
28 июля 2009 года
Nixus
840 / / 04.01.2007
То, что описано, лишь вершина айсберга. Тут вообще сложно сделать что-либо не правильно. А вот когда встанет вопрос про взаимодейсвия модулей с ядром, ядра с модулями, и взаимодействия между модулями, появиться очень много проблем.
13
28 июля 2009 года
RussianSpy
3.0K / / 04.07.2006
Цитата: UAS
Собственно, верно ли я рассуждаю и может кто знает методы поудобнее?



Метод реализации модулей и плагинов напрямую зависит от того как реализовано основное ядро и какой функционал вообще закладывается в эти самые модули.

В нашей системе управления например взаимодействие модулей с ядром осуществляется через несколько общих буферов + API. Подключение же модуля - это уже каждый сам решает. Мы, например, написали инсталлятор и менеджер модулей - копируешь модуль в нужную директорию, но чтобы он заработал нужно его проинсталлировать. К тому же многие модули требуют свои собственные таблицы в БД, например.

Поэтому реализация подобных вещей как правило индивидуальна. Но стоит все же постараться предусмотреть возможные проблемы и заложить как можно большую гибкость. Хотя все равно всего не предусмотришь.

51K
28 июля 2009 года
Гладкий
5 / / 28.07.2009
я только начинаю изучать WEB coding
поясните пожалуста о чем идет речь..
модули вставляются в php?..
244
28 июля 2009 года
UAS
2.0K / / 19.07.2006
Спасибо всем за мнения и советы.
hardcase, спасибо за ссылку. На днях почитаю. Заодно английский вспомню))

Гладкий, как бы объяснить на примере.. Вот допустим используете вы QIP, а к нему есть плагин, который транслирует название исполняемой песни в Winamp/AIMP в статус QIP. Чтобы установить плагин требовалось всего лишь закопировать его в нужную папку plugins и, затем, активировать его в настройках программы. Вот тут примерно все так же)
276
30 июля 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: UAS
Вот допустим используете вы QIP, а к нему есть плагин, который транслирует название исполняемой песни в Winamp/AIMP в статус QIP. Чтобы установить плагин требовалось всего лишь закопировать его в нужную папку plugins и, затем, активировать его в настройках программы. Вот тут примерно все так же)



Я вот тоже не совсем понимал о чем речь :). А теперь появилась мысль. Не пинайте пожалуйста ежели велосипед придумываю.

1. Для простоты изясненеия розделяем систему на ядро и модули (хотя такое розделение будет условным так как ядро не что иное как главный модуль, к которому дописываются все остальлные). В свою очередь к каждому модулю можно дописывать дополнительные модули и т.д.

2. Ядро имеет набор интерфейсов и обращения ко всем сущностям поведение которых может менятся с добавлением новых модулей должно идти только через интерфейсы.

3. В ядре есть чтото типа реестра реализацыи для интерфейсов.
Ну тоесть есть у нас 2 интерфейса I1, I2. Есть реестр в виде массива
$reestr = array("I1"=>"Impl1", ""=>"Impl2");

4. Создание сущностей должно выглядеть примерно так
$o1 = new $reestr["I1"];
Может я тут накосячил, но есть в РНР такая возможность создать екземпляр класса по его названию.

В модуле понятно что будет дополнительный функционал, но, как уже говорилось выше, - главная проблема как его интегрировать. А для етого придется менять поведение сущностей ядра.

5. Для сущности, поведение которой придется поменять, в модуле пишем свой класс. Наследовать его от класса из ядра вижу нелогичным така как получим проблему при подключении двух модулей меняющих одну сущность. Просто имплементим соответственный интерфейс. Наш новый класс SuperImpl1 явлется чемто типа прокси. Он агрегирует в себе екземпляр класса Impl1 и в большинстве случаев будет просто повторять его повидение вызывая его методы, а там где нужно будет делать и чтото свое.

6. При подключении модуль должен запоминать старое состояние реэстра (нужно для агрегирования в новых классах екземпляров старых) и подменять название классов имплементацыи.

Реестр можно сделать в виде двухмерного масива. первое измерение = название интерфейса, второе измерение - уровень наслоения разными модулями. В каждой ячейке хранится пара строчек: Название класса имплементации и название модуля в котором оно реализовано. Таким образом модуль всегда сможет найти название прежней реализации етажом выше (по второму измерению). Модули также могут добавлять свои интерфейсы реализацыя для которых может быть изменена подмодулями и т.д.

Ну вот собственно и вся идея. Интересно выслушать Вашы мнения.

13
30 июля 2009 года
RussianSpy
3.0K / / 04.07.2006
Что за сущности такие? для чего?
276
30 июля 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: RussianSpy
Что за сущности такие? для чего?


Корявый пример со счетчиком на логировании. Есть сущность отвечающая за логирование. LogI, LogImpl соответственно интерфейс и реализацыя.
Изначально реализацыя не умеет щитать сколько раз и когда юзер логинился.
На странице логина написано чтото типа

 
Код:
$loginer = new $reestr['LogI']();
$loginer->login($name, $password);
делаем модуль который пишет в БД когда юзер логинился
В модуле будет примерно так;
Код:
// следующие 2 строчки выполняются при старте апликейшена в момент подключения нового модуля
$oldLoginerName = $reestr['LogI']; // тоесть LogImpl
$reestr['LogI'] = 'ExtLogger';

class ExtLogger implements LogI {

  private $oldLoginer

  public ExtLogger() {
    $oldLoginer = new $oldLoginerName();
  }

  public login($name, $pass) {
    $oldLogger->login($name, $pass)
    /// а тут пишем в БД когда он логинился
  }

}
Код написан условно и без интертрепатора.
Для создания проксей нужно использовать нечто умнее чем переопределения всех методов (в данном случае login)
13
30 июля 2009 года
RussianSpy
3.0K / / 04.07.2006
Вы слишком усложняете... Можно сделать гораздо проще... Гораздо. И быстрее.
276
30 июля 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: RussianSpy
Вы слишком усложняете... Можно сделать гораздо проще... Гораздо. И быстрее.


Согласен. Можно и ефективнее в плане быстродействия. Но сделать также гибко не так уж и просто ;)

13
30 июля 2009 года
RussianSpy
3.0K / / 04.07.2006
Вы идете слишком долгим и слишком сложным путем. Подумайте над тем что такое гибкость вообще и какие приложения считаются гибкими)) Думаю, решение само придет через время. А кому интересны подробности - стучите в аську.
63
30 июля 2009 года
Zorkus
2.6K / / 04.11.2006
Ну если говорить про гибкие архитектуры..позвольте мне отвлечься от веба..наверное, Eclipse RCP и архитектуры OSGi - хороший пример для изучения, анализа, и может быть и подражания :)
По крайней мере, я считаю ее мощной, поработав в проекте где использовались широко собственные business-level плагины для эклипса.
13
31 июля 2009 года
RussianSpy
3.0K / / 04.07.2006
Универсальных решений не существует. Каждое решение хорошо для своей сферы и плохо для другой. То что сработает для программирования микроконтроллеров далеко не всегда будет хорошо при проектировании среды разработки и наоборот. Поэтому если вы проектируете что-то вроде Eclipse - да имеет смысл изучить их опыт. Если же речь идет о CMS то тут лучше покопаться в исходниках аналогичных продуктов.
347
01 августа 2009 года
Maniak
319 / / 05.11.2005
почитал тему...и всеравно что то непонял: как в php можно осуществить модульность? может ктонибудь покажет простой примерчик? ато из поста Rebbit вообще ничего не понятно....:(
13
03 августа 2009 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Maniak
почитал тему...и всеравно что то непонял: как в php можно осуществить модульность? может ктонибудь покажет простой примерчик? ато из поста Rebbit вообще ничего не понятно....:(



так же или почти так же как в любом другом языке.

347
03 августа 2009 года
Maniak
319 / / 05.11.2005
...возможно, но я просто не понимаю а что могут сделать модули в php? например они могут изменить разметку сайта, повлиять там еще каким нибудь способом на функциональность или еще что?
просто ведь можно написать много разных скриптов (каждый со своим интерфейсом, но ессесно в условия одного сайта интерфейс обычно одинаков): счетчик там кокойнибудь, поле для голосования, контейнер для вывода главного меню и написать сканер так сказать этих скриптов, который сканирует их (находящихся в одной папке) и выводит в определенном месте страницы....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог