Модульность и взаимосвязь модулей

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Damange
Сообщения: 11
Зарегистрирован: 2010.05.17, 16:30
Откуда: Нижневартовск
Контактная информация:

Модульность и взаимосвязь модулей

Сообщение Damange » 2011.04.11, 13:41

Добрый день.
В голове уже больше недели крутится мысль, которой я не могу найти решения.

Попробую поделиться с вами мыслями, и при помощи коллективного разума познать истину.

Рассмотрим абстрактный движок:
Есть ядро сайта, есть модули. Все модули прекрасно работают друг без друга. Удаление файлов модуля или выключение модуля в админке приводит только к сокрытию данных, подгружаемых с этого модуля. У каждого модуля есть интерфейс доступа (может быть и научно, но сейчас раскрою суть): то, как с ним могут взаимодействовать другие модули.

К примеру - есть модуль блог, есть модуль форум. По отдельности - они и так хороши. Но если их включить вместе, то:
в блоге при создании нового поста - создается тема на форуме (в определённом разделе) с частью поста из блога
так же в блоге у поста появляется надстройка - "обсуждение на форуме" , и при желании - обсуждение переносится на форум.

В форуме же появляется кнопка "выделить сообщение в блог", которая создает новый пост в блоге, используя текст.


Пусть пример и надуманный, но как реализовать подобную взаимосвязь модулей: что бы модули были одновременно и независимыми и могли дополнять друг друга новым функционалом.

Какие пути я вижу:
1. Структура модулей
1.1 Модуль правится каждый раз, после разработки нового модуля. В нем прописываются те методы, которые могут вызваны удаленно, а так же таблицы БД для связи.
-очень плохое решение. При увеличении числа модулей число правок растет в геометрической прогрессии. А что если у нас 50 модулей? надо внести 50^2 правок?

1.2 Модуль после создания консервируется. Сам модуль не трогается. Что бы связать два модуля между собой - создается третий модуль, в котором описывается взаимосвязь между ними (как физически так и на уровне БД).
-решение чуть лучше. но то же не фонтан

1.3 ???

2. Обращение к другим модулям
Опять же вопрос. Если у нас один модуль не знает ничего про другие, как ему сказать что в этом месте надо что то вывести?
Напрашивается:
2.1 Система хуков (функция или метод какого то класса, который будет вызываться в данном месте). При создании связки двух модулей регистрируется хук. И в нужном месте (view | controller) вызывается хук.

Абстрактный пример:
Есть БД с контактами. По умолчанию - есть только ФИО. Данные о email, icq, skype, адресе - добавляются отдельными модулями.
Есть 3 интерфейса - форма поиска, результат поиска и форма добавления.
В первой регистрируем hook_contact_search, в котором описано что нужно подгрузить поля с другими данными.
Во второй - hook_contact_search_result, в котором описано что надо выводить таблицу с определенным набором колонок.... и т д...

Хуки могут быть автогенерируемыми из админки, то есть - подключили модули, нажали "обновить связи" и все стало хорошо.

А что... это идея...
2.2 Интерфейс пользователя всегда автогенириуемый из админки. При добавлении нового модуля происходит перегенерация моделей и отображений. Тогда это позволит снизить нагрузку (при большом числе модулей и хуков система будет терять в производительности). Но возникает проблема - при непрерывной работе пользователей в момент обновления структуры могут появиться не связанные данные.


ps. В голове за неделю скопилась каша. Как делать модульность подобного рода - пока не представляю. Взываю к коллективному разуму...
pss. Ох уж эти заказчики.
psss. Если кто то знаком с Ruby | Django - есть ли там нечто подобное?

arser
Сообщения: 36
Зарегистрирован: 2011.03.22, 15:55

Re: Модульность и взаимосвязь модулей

Сообщение arser » 2011.04.11, 14:22

Damange писал(а):2.2 Интерфейс пользователя всегда автогенириуемый из админки. При добавлении нового модуля происходит перегенерация моделей и отображений.
Это как? Можно какой-то пример.

Также имхо пункты 1) и 2) взаимоисключающие. Модули или не имеют никакой жесткой связи и цепляются друг к другу через хуки, или все-таки это связь задана явно, тогда вызов методов просто хардкодится или в самих модулях или в "третем" модуле, что по-сути дела не меняет.

Как раз сейчас заканчиваю каркас для чего-то подобного. Сделал все через хуки. На первый взгляд это должно быть медленно, но если вы посмотрите, то "замедлителей" в этой связке особо то и нету... зато очень гибко.

Плюс выделил некоторые однотипные модули отдельно, я знаю что они в любом случаи будут нужны на сайте в каком-то месте, и запускаю их уже напрямую через "менеджер" без всяких хуков, оптимизировав запросы к БД и т.д. Например, нужен ли запуск модуля может проверять не сам объект модуля, а некий менеджер, таким образом мы не создаем объекты модулей, которые возможно нам и не нужны прямо сейчас.

Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Модульность и взаимосвязь модулей

Сообщение because » 2011.04.11, 22:40

к чему такая сложность, нужно чтобы один модуль что-то делал для другого. реализуем метод в отдельном контроллере, и готово. все равно в каждом модуле будут разные действия по взаимодействию.почему 50^2 правок непонятно ) ну наращивается/изменяется функционал у какого-то модуля, так это вполне нормально.
RTFM !

Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Модульность и взаимосвязь модулей

Сообщение mitaichik » 2011.04.15, 05:40

pss. Ох уж эти заказчики.
Заказчики просят тебя написать второй битрикс? Перегенерация моделей, представлений - ИМХО, бред. Точнее звучит очень заманчиво, но трудная задача. Даже в том же битриксе видел строки пердставлениях "if(module_loaded('catalog')) выводим такие-то поля" Этих модулей то не так уж много, лучше просто заранее продумать более менее четкую картину всего что пригодиться, и плясать от туда.

Ответить