Особенно потому, что это идея в первую очередь адресуется ему как создателю НРельсов.
Я тут посмотрел Lift (фиговенький передов книги по нему) и нашел его идеи по рендеренгу (точнее его подход к реализации паттерна MVC) вполне милым, логичным для ФЯ и (что самое важное) легко реализуемым на базе макросов немерла.
В качестве средства упрощения работы с БД можно использовать Nemerle on rails созданный Ziaw. Рельсы по всей видимости нужно еще доводить до ума, но как основа они точно потянут.
Остается только движок рендеренга HTML/XML-я и JSON. JSON опять же уже смастерил Ziaw.
Так вот чтобы получить действительно законченные Nemerle on rails нужно смастерить движок рендеренга HTML/XML.
Предлагаю повторить Lift (естественно, с учетом особенностей немерла).
Идея рендерера Lift очень проста. В качестве шаблонов используется чистых XML. Места в которых на сервере нужно вставить динамический контент помечаются специальными тегами. Например, если мы хотим в середине страницы вывести некий динамический контент, то можно оформить страничку так:
Собственно вся идея заключается в размещении тегов-заместителей (плэйсхолдеров) вроде <lift:Menu.builder /> для указанию движку рендеренга мест в которые нужно вставить динамический контент.
В теге <lift:Menu.builder /> значение Menu.builder — это имя метода представления который и генерирует динамический контент. Другими словами это что-то вроде активных тегов JSP или Руби. Не трудно развить эту идею и передавать параметры таким тегам (в виде атрибутов тегов).
Метод вызываемый таким образом должен всего лишь возвращать XML в определенном форммте. Для нас это будет формат XElement (т.е. LinqToXml).
Этот метод волен пользоваться любыми средствами формирования тегов, но основным средством будет Nemerle.Xml — DSL позволяющий придать человеческое лицо LinqToXml-ю.
Очень важной особенностью таких тегов является то, что они могут появляться не только в шаблонах, но и том ХМЛ-е который возвращается методами заполняющими плэйсхолдеры (вроде упомянутого Menu.builder). Принцип действия очень похож на раскрытие макросов немерла. Движок раскрывает одни плэйсхолдер подставляя вместо него содержимое сгенерированное указанным методом. Если в содержимом так же появляются плэйсхолдеры, то движок так же происходит их раскрытие. И так до тех пор пока в результате не получится ХМЛ не содержащий ни одного активного тега.
Собственно последняя особенность и определяет рекурсивный дизайн и устраняет необходимость дублирования кода.
Кто-то может спросить — "А где же здесь контролер?" — и я отвечу — здесь его нет и здесь он не нужен. Но это не значит, что его не будет совсем. Контроллер остается для: формирования сложных структур данных (тех что трудно получить одним запросом), для кэширования, для организации навигации и т.п. В случае когда контроллер формирует сложные наборы данных имеет смысл использовать модель Model <-> View Model, т.е. контроллер перепаковывает данные в View Model и далее во View используется уже эта копия. Это позволит формализовать трансформацию данных модели в данные которые удобно отображать пользователю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Кто-то может спросить — "А где же здесь контролер?" — и я отвечу — здесь его нет и здесь он не нужен. Но это не значит, что его не будет совсем. Контроллер остается для: формирования сложных структур данных (тех что трудно получить одним запросом), для кэширования, для организации навигации и т.п. В случае когда контроллер формирует сложные наборы данных имеет смысл использовать модель Model <-> View Model, т.е. контроллер перепаковывает данные в View Model и далее во View используется уже эта копия. Это позволит формализовать трансформацию данных модели в данные которые удобно отображать пользователю.
Все это подозрительно напоминает АСН.НЕТ веб формс, хотя там и более простая схема. Ну, собственно, и проблемы там будут точно такие же. Что будет представлять собой Menu.builder? Закрытый метод, блек бокс. А это-то и плохо. Когда завтра нужно будет сделать такое же меню, но "с перламутровыми пуговицами", то, не имея возможности изменить код Menu.builder, этот самый Menu.builder будет просто выбрасываться и переделываться ручками.
Здравствуйте, VladD2, Вы писали:
VD>Я тут посмотрел Lift (фиговенький передов книги по нему) и нашел его идеи по рендеренгу (точнее его подход к реализации паттерна MVC) вполне милым, логичным для ФЯ и (что самое важное) легко реализуемым на базе макросов немерла.
Его подход имеет каноническое название — MVP с активной view. Хотя они его преподносят как революционный view first
VD>Так вот чтобы получить действительно законченные Nemerle on rails нужно смастерить движок рендеренга HTML/XML.
Тут я промолчу. У нрельс есть проблемы и есть некоторые вещи, которые я бы хотел добавить, но движок рендеринга от лифта оставит от рельс только DSL миграций Ибо MVC там уже будет лишней сущностью и все, что написано для него пойдет лесом.
VD>Предлагаю повторить Lift (естественно, с учетом особенностей немерла).
VD>В теге <lift:Menu.builder /> значение Menu.builder — это имя метода представления который и генерирует динамический контент. Другими словами это что-то вроде активных тегов JSP или Руби. Не трудно развить эту идею и передавать параметры таким тегам (в виде атрибутов тегов).
Нет, это скомпиленный в сборку код там, где мог бы быть текстовый динамический шаблон.
VD>Метод вызываемый таким образом должен всего лишь возвращать XML в определенном форммте. Для нас это будет формат XElement (т.е. LinqToXml). VD>Этот метод волен пользоваться любыми средствами формирования тегов, но основным средством будет Nemerle.Xml — DSL позволяющий придать человеческое лицо LinqToXml-ю. VD>Очень важной особенностью таких тегов является то, что они могут появляться не только в шаблонах, но и том ХМЛ-е который возвращается методами заполняющими плэйсхолдеры (вроде упомянутого Menu.builder). Принцип действия очень похож на раскрытие макросов немерла. Движок раскрывает одни плэйсхолдер подставляя вместо него содержимое сгенерированное указанным методом. Если в содержимом так же появляются плэйсхолдеры, то движок так же происходит их раскрытие. И так до тех пор пока в результате не получится ХМЛ не содержащий ни одного активного тега.
VD>Собственно последняя особенность и определяет рекурсивный дизайн и устраняет необходимость дублирования кода.
Сначала надо показать эту необходимость в других сценариях. Например в спарке.
VD>Кто-то может спросить — "А где же здесь контролер?" — и я отвечу — здесь его нет и здесь он не нужен. Но это не значит, что его не будет совсем.
Контроллера нет, потому, что это MVP. Вместо него появилась куча презентеров.
VD>Контроллер остается для: формирования сложных структур данных (тех что трудно получить одним запросом), для кэширования, для организации навигации и т.п. В случае когда контроллер формирует сложные наборы данных имеет смысл использовать модель Model <-> View Model, т.е. контроллер перепаковывает данные в View Model и далее во View используется уже эта копия. Это позволит формализовать трансформацию данных модели в данные которые удобно отображать пользователю.
Для кэширования и навигации используются фильтры и АОП. Контроллерами называть это как-то странно.
Я считаю, что MVP неудачно вписывается в веб, настолько, насколько MVC неудобен в десктопе.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, VladD2, Вы писали:
VD>>Кто-то может спросить — "А где же здесь контролер?" — и я отвечу — здесь его нет и здесь он не нужен. Но это не значит, что его не будет совсем. Контроллер остается для: формирования сложных структур данных (тех что трудно получить одним запросом), для кэширования, для организации навигации и т.п. В случае когда контроллер формирует сложные наборы данных имеет смысл использовать модель Model <-> View Model, т.е. контроллер перепаковывает данные в View Model и далее во View используется уже эта копия. Это позволит формализовать трансформацию данных модели в данные которые удобно отображать пользователю.
ВВ>Все это подозрительно напоминает АСН.НЕТ веб формс, хотя там и более простая схема. Ну, собственно, и проблемы там будут точно такие же. Что будет представлять собой Menu.builder? Закрытый метод, блек бокс. А это-то и плохо. Когда завтра нужно будет сделать такое же меню, но "с перламутровыми пуговицами", то, не имея возможности изменить код Menu.builder, этот самый Menu.builder будет просто выбрасываться и переделываться ручками.
Ну в теории можно трансформировать его вывод. Но для этого придется делать DOM на все, что выдается, имхо не взлетит с проблемами производительности.
2Влад: я настоятельно рекомендую взять для примера html (например отсюда) и произвести тест производительности. Построение dom по нему, модификация пары элементов через linq to xml и вывод в стрим. Учтем то, что это еще довольно скромный html. Если займет больше 5ms — в топку.
Здравствуйте, Ziaw, Вы писали:
Z>Ну в теории можно трансформировать его вывод. Но для этого придется делать DOM на все, что выдается, имхо не взлетит с проблемами производительности.
Трансформировать плохо, т.к. основная идея этого Menu.builder в инкапсуляции всей работы по генерации меню. А тут мы и инкапсуляцию нарушаем — т.е. для трансформации тебе нужно в точности знать структуру дерева, которое формируется, и малейшей изменение билдера может привести к тому, что отвалится весь твой код — ну и бенефитов в итоге как-то не остается.
С ХСЛТ такая схема хорошо работает. Там Menu.builder будет набором достаточно гранулярных шаблонов, и мне достаточно будет лишь снаружи, не меняя самого билдера, перекрыть какой-то один шаблон. Возможно, есть другие шаблонизаторы, позволяющие подобное — тут я не знаю. Но мне кажется, думать надо скорее в таком направлении.
А "классическая" инкапсуляция генерации ХТМЛ-я на манер веб-формс — ИМХО зло в квадрате.
Очень рекомендую посмотреть вот на эту штуку http://knockoutjs.com/
Идеология реактивный MVVM.
Собственно это идеальный подход к ГУИ вообще и к веб ГУИ в частности.
Сделав такой ДСЛ на немерле все станет сщвсем просто и статически типизированно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Все это подозрительно напоминает АСН.НЕТ веб формс, хотя там и более простая схема. Ну, собственно, и проблемы там будут точно такие же.
Во-первых, как-то не очень похоже. Во-вторых, в АСН.НЕТ есть только одна проблема. Они пытаются эмулировать виндовые интерактивные формы. При этом делят состояние между клиентом и сервером. В результате все портит вью-стэйт.
Другого ничего плохого я не вижу.
ВВ>Что будет представлять собой Menu.builder? Закрытый метод, блек бокс.
Что значит закрытый? Функция будет. Банальная функция.
ВВ>А это-то и плохо. Когда завтра нужно будет сделать такое же меню, но "с перламутровыми пуговицами", то, не имея возможности изменить код Menu.builder, этот самый Menu.builder будет просто выбрасываться и переделываться ручками.
Бред какой-то. Это значит я уже не могу сделать универсальную функцию?
Ты точно все хорошо прочитал? Там весь цемис заключается в том, что можно в составе выходного ХМЛ-я возвращать такие же теги. Опиши пуговицы тегом. И потом, когда надо, махни реализацию тега пуговицы так чтобы она стала перламутровой.
Плюс можно же ввести параметры у тегов. Через них и передать нужные настройки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Ну в теории можно трансформировать его вывод. Но для этого придется делать DOM на все, что выдается, имхо не взлетит с проблемами производительности.
Все нормально взлетает. Дом (в виде XLinq) шуршит с очень приличной скоростью.
Z>2Влад: я настоятельно рекомендую взять для примера html (например отсюда) и произвести тест производительности. Построение dom по нему, модификация пары элементов через linq to xml и вывод в стрим. Учтем то, что это еще довольно скромный html. Если займет больше 5ms — в топку.
Да что там тестировать. Это будут единицы миллисекунд. Чтение с диска займет больше времени.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>2Влад: я настоятельно рекомендую взять для примера html (например отсюда) и произвести тест производительности. Построение dom по нему, модификация пары элементов через linq to xml и вывод в стрим. Учтем то, что это еще довольно скромный html. Если займет больше 5ms — в топку.
Ты заставил убить меня пол часа на причесывание этой долбанной страницы под ХМЛ .
Здравствуйте, Воронков Василий, Вы писали:
ВВ>С ХСЛТ такая схема хорошо работает. Там Menu.builder будет набором достаточно гранулярных шаблонов, и мне достаточно будет лишь снаружи, не меняя самого билдера, перекрыть какой-то один шаблон. Возможно, есть другие шаблонизаторы, позволяющие подобное — тут я не знаю. Но мне кажется, думать надо скорее в таком направлении.
Блин, а почему это у нас то должно отличаться? Это и будет похоже на ХСЛТ, только вместо языка на базе ХМЛ будет немерл с макросом ХмлЛитерала. И создать набор гранулярных функций проблемы не составит.
Можно даже аналог ХСЛТ-шного матча сделать, так чтобы функции вызывались в зависимости от контента.
Здравствуйте, VladD2, Вы писали:
VD>Все привет, особенно Ziaw.
VD>Особенно потому, что это идея в первую очередь адресуется ему как создателю НРельсов.
VD>Я тут посмотрел Lift (фиговенький передов книги по нему) и нашел его идеи по рендеренгу (точнее его подход к реализации паттерна MVC) вполне милым, логичным для ФЯ и (что самое важное) легко реализуемым на базе макросов немерла.
VD>В качестве средства упрощения работы с БД можно использовать Nemerle on rails созданный Ziaw. Рельсы по всей видимости нужно еще доводить до ума, но как основа они точно потянут.
VD>Остается только движок рендеренга HTML/XML-я и JSON. JSON опять же уже смастерил Ziaw.
VD>Так вот чтобы получить действительно законченные Nemerle on rails нужно смастерить движок рендеренга HTML/XML.
VD>Предлагаю повторить Lift (естественно, с учетом особенностей немерла).
VD>Идея рендерера Lift очень проста. В качестве шаблонов используется чистых XML. Места в которых на сервере нужно вставить динамический контент помечаются специальными тегами. Например, если мы хотим в середине страницы вывести некий динамический контент, то можно оформить страничку так: VD>
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Ziaw, Вы писали:
Z>>2Влад: я настоятельно рекомендую взять для примера html (например отсюда) и произвести тест производительности. Построение dom по нему, модификация пары элементов через linq to xml и вывод в стрим. Учтем то, что это еще довольно скромный html. Если займет больше 5ms — в топку.
VD>Ты заставил убить меня пол часа на причесывание этой долбанной страницы под ХМЛ .
Ну так допили до нужного уровня, например засунь все img в <div class='img'> и выведи результат в memorystream. Только тогда все получится похоже на правду. Для сравнения, подобная вьюха на руби будет рендериться 3-5ms.
Здравствуйте, VladD2, Вы писали:
ВВ>>Все это подозрительно напоминает АСН.НЕТ веб формс, хотя там и более простая схема. Ну, собственно, и проблемы там будут точно такие же.
VD>Во-первых, как-то не очень похоже. Во-вторых, в АСН.НЕТ есть только одна проблема. Они пытаются эмулировать виндовые интерактивные формы. При этом делят состояние между клиентом и сервером. В результате все портит вью-стэйт. VD>Другого ничего плохого я не вижу.
К сожалению, не только. Плоха сама идея инкапсуляции генерации ХТМЛ-я. Она просто не работает как нужно.
VD>Ты точно все хорошо прочитал? Там весь цемис заключается в том, что можно в составе выходного ХМЛ-я возвращать такие же теги. Опиши пуговицы тегом. И потом, когда надо, махни реализацию тега пуговицы так чтобы она стала перламутровой. VD>Плюс можно же ввести параметры у тегов. Через них и передать нужные настройки.
Ты говоришь с позиций теоретика. На словах-то все хорошо, да. В реальности же такой подход не заводится. Ибо это по сути тот же веб-контрол. Который скрывает всю работу с ХТМЛ и предоставляет явные точки для ее настройки. Да, да, те же параметры у тегов. Это означает, что если разработчик не предусмотрел какой-то из вариантов расширения, то весь его "контрол" идет лесом. Ну вот предположим, что мне нужно переопределить логику генерации какого-нибудь грида и мержить некоторые столбцы или же строки запрятать в tbody и динамически их прятать/показывать.
Всех возможных сценариев использования не продумаешь.
Ты пойми, люди уже пытались сделать так, как ты говоришь. И это не взлетело. Формирование ХТМЛ-я не должно инкапсулироваться вообще. Должна быть возможность вмешаться в его формирование и переопределить его как полностью, так и частично.
Здравствуйте, VladD2, Вы писали:
VD>Блин, а почему это у нас то должно отличаться? Это и будет похоже на ХСЛТ, только вместо языка на базе ХМЛ будет немерл с макросом ХмлЛитерала. И создать набор гранулярных функций проблемы не составит.
При написании веб-контролов никто тоже в общем не мешает разбить генерацию на несколько виртуальных функций, которые можно переопределять. На практике такого почему-то не делают.
В твоем варианте дело скорее всего тоже закончится тем, что все будут лепить в рамках одной функции.
Нужен подход, который будет вообще не давать так писать.
ВВ>>А "классическая" инкапсуляция генерации ХТМЛ-я на манер веб-формс — ИМХО зло в квадрате. VD>Откровенно говоря не вижу в чем это зло и чем оно отличается от того же ХСЛТ.
Плохо тем, что нужен полный контроль генерируемого ХТМЛ и возможность его переопределения на любой стадии.
Здравствуйте, dotneter, Вы писали:
D>Создает один контролер называем это GodController, все акшены склодируем в нем. D>Делаем обертку и получаем
D><% H(c => c.Menu()) %>
Грязи меньше, но она есть. И есть возможность загнать в ХТМЛ необрабтанную строку. А это потенциальная уязвимость.
Так зачем нам нужен этот кривой подход? Что он дает?
D>Если прикрутить Т4, можно сократить до D><% Menu() %>
Зачем нам убогий T4? У нас есть макросы. С ними мы можем тупо написать:
<ИмяМетода/>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Ну так допили до нужного уровня, например засунь все img в <div class='img'> и выведи результат в memorystream.
Ну, заведомо будет быстрее. Там на чтение с диска уходит основное время. Но для нас этого за глаза хватит. Это 1000 запросов в секунду не напрягаясь без кэширования.
Z>Только тогда все получится похоже на правду. Для сравнения, подобная вьюха на руби будет рендериться 3-5ms.
Откуда данные?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.