ewgraFramework

Sender

Новичок
ewgraFramework

Буду рад ответить на любые вопросы по поводу текста ниже. Хочу проверить на прочность и жизнеспособность свой framework. Так сказать развести дискуссию и попробовать отстоять свое решение перед судом общественности. Хотелось бы в целом услышать мнение, а также увидеть вопросы из разряда: "А можно ли..."


Основа

Данный framework я разрабатывал руководствуясь следующими желаниями:
1. MCV в том понимании, в котором представлял я его себе представлял. То есть мой продукт должен представлять собой три части: Model, Controller, View. При этом в идеале мы можем менять каждую часть и остальные две части не потребуют изменений.
2. Практически все сущности движка должны храниться в базе данных. То есть при изменении каких-то параметров, добавлении новых страниц и т.п. не будет необходимости менять программный код.
3. Организация страниц. Страница должна представлять из себя набор опубликованных на странице модулей. Странице назначается необходимый View, файлы, языкозависимые данные и т.п.

Исходя из этих трех желаний у меня получился следующий framework. Дальше перечислены основные столбы, на которых держится framework.

Событийно-ориентированный
То есть любое движение в системе происходит по событиям, которыми управляет EventDispatcher (диспетчер событий).
На событие может подписаться любой объект. Причем он может подписаться в трех «ипостасях». Первая – это подписывающийся объект выступает в качестве «Источника данных» (Provider). Вторая – «Приемник данных» (Receiver). Третья – «Простейший подписчик» (Easy).
Соответственно EventDispatcher при команде события Fire обойдет всех Providers и будет передавать результаты Receivers. Easy подписчики же просто выполняются EventDispatcher’ом без передачи результата куда-либо.
Если во время подписки объекта событие на данный момент не объявлено, то EventDispatcher будет подписывать на это событие как кандидата. Как только какой-то объект зарегистрирует событие, то EventDispatcher автоматически переведет всех кандидатов в разряд подписавшихся.

Единое хранилище данных
В системе присутствует DataCollector, который тесно связан с View. Он подписан на событие OnData как приемник данных. Нетрудно догадаться что он же подписан как источник данных на событие OnView. Все модули системы и особо важные классы (например Page) подписаны на OnData как источники данных. Таким образом все модули не зависят от конкретного View. А просто скидывают данные в коллектор. Который потом сам транспортирует их во View.

Различные View без смены кода модулей
На данный момент реализованы следующие связки View-DataCollector:
XMLDataCollector – XSLTView
ArrayDataCollector – JSONView, AjaxView, ExcelView, Native (в тесте)
RedirectDataCollector – RedirectView

Организация «Страниц, файлов и модулей»
Страница представляет из себя структуру к которой прикреплены различные файлы отображения (css, js, файлы отображения для модулей и т.п.). Каждый View сам знает как надо использовать эти данные и куда их необходимо вставить чтобы получить трбуемый результат. Также к странице крепятся языкозависимые фразы. На странице публикуются модули в различный секциях Layout’а. Каждый Layout сам знает где ему достать данные для секции. Например применительно к XSLT это будет следующим образом выглядеть:
<!-- [SECTION 2] Контент -->
<xsl:for-each select="/DOCUMENT/*[@section=2]">
<xsl:sort select="@position"/>
<xsl:apply-templates select="."/>
</xsl:for-each>
(применительно к NativeView и им подобным все немного сложнее, но страницу сформировать получилось).
Такой организацией достигается: «мы собираем страницу из блоков/модулей», не меняя по сути view-файлы
 

Sender

Новичок
zerkms
Сайта пока что нету. Хотелось сначала поговорить в рамках сообщества клуба
 

korchasa

LIMB infected
Что делают easy?
Как определяется(например, на конкретной странице) список провайдеров и ресиверов?
Кто может порождать события?
 

atv

Новичок
1. Цели создания фрэймворка? Основные отличия от существующих решений? Плюсы, минусы...

2.
То есть мой продукт должен представлять собой три части: Model, Controller, View.
А авторизация, логирование и отладка у тебя к какой части относятся?

3.
Причем он может подписаться в трех «ипостасях».
Это лишнее уточнение, продиктованное схемой "EventDispatcher при команде события Fire обойдет всех Providers и будет передавать результаты Receivers." И схема эта не удобная.

Я так понимаю, эта схема относиться к событиям приложения. Так чем не устраивает схема "Providers бросил событие, а Receivers, кому надо, обработали его".

4. События объектов есть?
 

Sender

Новичок
Апокалипсис
чтобы его пощупать, надо целиком поднимать тестовый сайт
скачать framework можно отсюда: http://slil.ru/25464579
Прокомментируй тогда и сам код, хотя скорее всего он покажется кучей несвязанных файлов, но все равно интересно

-~{}~ 12.02.08 17:59:

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

-~{}~ 12.02.08 18:01:

korchasa
Порождать события - да кто угодно. Достаточно зарегистрировать событие из этого объекта
 

korchasa

LIMB infected
Схема деревянная. Убей этих провайдеров и ресиверов. Пусть обработчик события получает объект его породивший. И уже сам решает что с ним делать.
 

Sender

Новичок
atv
1. Цели создания
Ну во-первых опыт. Во-вторых событийно-ориентированные я не видел ( хотя смотрел я мало ). Ну и в принципе тех "столбов" на которые я поставил "своё" я не встречал.

2. авторизация, логирование и отладка у тебя к какой части относятся?
Авторизация - явный Controller. Логирование практически тоже. Отладка (показ лога, тайминга и т.п. ) целиком строится на логировании. Эти контроллеры делают запросы в модель (например чтобы узнать есть ли такой пользователь ) и т.п.

3. Мысль понял. В принципе можно модулями бросать события: Provider_{EventName}, и Receiver'у указывать слушать эти события. Это имелось ввиду? Если да, то подумаю на досуге, в принципе наверное это будет гораздо лучше. Правда когда я разрабатывал эту систему событий, то что-то мне помешало это реализовать. Не помню уже что...


4. События объектов есть?
каждый объект вправе регистрировать события. Событие никак не связано с объектом. Он может зарегистрировать событие, и не подписаться даже на него. А может подписаться как источник данных и т.п.

-~{}~ 12.02.08 18:27:

Автор оригинала: korchasa
Схема деревянная. Убей этих провайдеров и ресиверов. Пусть обработчик события получает объект его породивший. И уже сам решает что с ним делать.
Ммм... То есть мы должны наделить обработчика знаниями об объекте породившем это событие?
 

korchasa

LIMB infected
ИМХО, лучше наделить его, чем EventDispatcher'а, а то он полноват станет. Это сейчас типов объектов три, а сколько потом будет?
 

Sender

Новичок
korchasa
EventDispatcher также ничего не знает об объектах, он просто передает данные от источников приемникам. Не более того.
Типов объектов больше не станет. По крайней мере я не смог придумать ситуацию когда придется вводить еще какие-то типы
 

korchasa

LIMB infected
Автор оригинала: Sender
korchasa
EventDispatcher также ничего не знает об объектах, он просто передает данные от источников приемникам. Не более того.
Он эти данные как-то получает от провайдеров? Он эти данные как-то отдает ресиверам?
Данные у вас передаются массивами?
Как быть со связными сущностями? Они будут тоже передаваться массивами? А если мне их поменять надо?
Как быть в ситуациях когда у объектов есть приватные данные? Например есть книга. У нее есть флаг присутствия в библиотеке. Он соответствует единичке в определенном поле. В каждом получателе, который интересуется наличием книги, придется вводить константы 0 и 1?

Автор оригинала: Sender Типов объектов больше не станет. По крайней мере я не смог придумать ситуацию когда придется вводить еще какие-то типы
Скажите сколько функционала реализовано на этом фреймворке.
 

StUV

Rotaredom
Sender
есть ли проекты, реализованные на этом фреймворке?
 

HEm

Сетевой бобер
2. Практически все сущности движка должны храниться в базе данных. То есть при изменении каких-то параметров, добавлении новых страниц и т.п. не будет необходимости менять программный код.

Не понял связи между этими двумя предложениями.
 

Sender

Новичок
atv
>PHP_Application и PRADO смотрел?
нет. Посмотрю на выходных


StUV
Локомотив для разработки - delpress.ru. Всего на нем крутится три сайта пока что. Один закрытый, второй вообще пара страниц с контентом.


HEm
Грубо говоря. Хотим мы добавить новую страницу, на которой надо опубликовать уже существующие модули. Для этого в код вообще не придеться лезти.
 
Сверху