Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Архитектура server-side приложения (https://javascript.ru/forum/offtopic/28553-arkhitektura-server-side-prilozheniya.html)

x-yuri 06.07.2012 03:23

Цитата:

Сообщение от B~Vladi
Наблюдая за другими проектами, мне понравился способ, при котором страница, на которую пришел запрос, сама вытягивает нужные ей данные.

за какими именно проектами?

Цитата:

Сообщение от B~Vladi
Исходя из этого требования, становится понятно, что первый и третий варианты не подходят - придется дублировать агрегацию данных
для шаблонов и AJAX-запросов. В первом варианте шаблон сам агрегирует нужные ему данные. Во втором этим занимается отдельное приложение. А кто будет это делать для AJAX? Не круто.

неочевидно, приведи пример

Цитата:

Сообщение от B~Vladi
1. Шаблон напрямую обращается к источникам данных (базе, например).
2. Шаблон дергает некую ручку (приложение), которое обращается к данным, формирует их в нужном формате и возвращает.
3. Приложение (а не шаблон), получает нужные данные из источников и передаёт их одной пачкой в шаблон.

т.е. твой объединенный объединенный вариант - 3-ий вариант, который в зависимости от шаблона "получает нужные данные из источников и передаёт их одной пачкой в шаблон"? Так это чистый 3-ий вариант, получаемые данные определяются шаблоном в любом случае.

Цитата:

Сообщение от B~Vladi
Эмм, это уже лишнее. Всё-таки окружения разные, значит и код должен быть разным.

почему нет? Я слышал такой аргумент в пользу nodejs, собственно вот

Цитата:

Сообщение от B~Vladi
Если определение этих наборов переложить на контроллер - он будет сильно разрастаться. Поэтому я и разделил на несколько контроллеров и назвал их сервисы.

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

я думал, ты на сервисы разбил в связи с ограничением количества одновременных запросов на домен. Ну т.е. по инерции, после статики (или они тоже отдельные сервисы?). Вообще создается впечатление, что роутер у тебя будет внешне-внутренним, в результате...

Цитата:

Сообщение от B~Vladi
Если такая терминология подходит, предлагаю переходить на неё. Если нет - объясни какие моменты считаешь нелогичными/непонятными.

вы какую-то свою терминологию (а может и реализацию) придумываете, вас трудно понимать. Самый распространенный вариант - контоллеры и экшены. Экшены - действия, контроллеры - группы действий. И url часто имеет вид: /[controller[/action[/id]]], например /users/delete/1 или /users

Цитата:

Сообщение от devote
Реализация у меня такова, кратко:
1. Шаблон, выступает в качестве client-side/virtual-client-side приложения, никак не связанного c View и ни с чем другим. Собственно он дергает ручки контролера.
2. Контролер, занимается перенаправлением требований от client-side и не более того, то-есть client-side дергает ручку контрола, контрол дергает нужную модель, на основе запроса.
3. модель, собственно занимается формированием данных, обработкой запросов и т.д. Формирует данные и отдает их уже выходному view.
4. View, собственно отвечает за то в каком виде отдать клиентской части данные, в формате JSON ( тоесть по запросу AJAX ) либо уже сформированное view представление.

Цитата:

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

подожди, ты сравниваешь веб- и десктопные приложения? B~Vladi тебя не об этом спрашивал. И меня этот вопрос тоже интересует (в чем отличие твоей реализации?), потому что я не вкурил её, реализацию... :(

DjDiablo, я все еще помню, что ты обещал помочь с тестированием разобраться :\

p.s. карма напомнила ситуацию в Зимбабве

B~Vladi 06.07.2012 10:10

Цитата:

Сообщение от x-yuri
за какими именно проектами?

Раньше мне попадалось что-то подобное, но сейчас не вспомню конкретно. Сейчас - Яндекс.Маркет, например. Хотя там нельзя сказать, что данные запрашиваются из шаблона, но и не из контроллера или ещё чего-то.

В любом случае это именно тот подход: "страница, на которую пришел запрос, сама вытягивает нужные ей данные."

Цитата:

Сообщение от x-yuri
неочевидно, приведи пример

В первом примере для генерации страницы агрегированием будет заниматься шаблон. Для AJAX-запросов какой-нибудь сервис/контроллер/как хотите.
Во втором примере вроде бы всё очевидно: для страницы данные формируются в одну пачку, для AJAX-запроса придется писать свой сервис/контроллер/как хотите

Цитата:

Сообщение от x-yuri
Так это чистый 3-ий вариант, получаемые данные определяются шаблоном в любом случае.

Ну не совсем. В третьем варианте контроллер обращается к источникам, а в объединенном дергаются ручки.

Цитата:

Сообщение от x-yuri
очень смутно представляю, что и как будет разрастаться...

Реализация получения данных в контроллере будет разрастаться.

Цитата:

Сообщение от x-yuri
почему нет?

Возможно в каких-то частных случаях - да (либа там какая-нибудь), а так нет. То же XSL-преобразование. API везде разное ==> разный код.

Цитата:

Сообщение от x-yuri
я думал, ты на сервисы разбил в связи с ограничением количества одновременных запросов на домен.

Не не, всё на один хост/порт уходит с клиента. А статика да, на разные. Но она отдается nginx-ом, так что в контексте разговора нам не интересна.

Цитата:

Сообщение от x-yuri
роутер у тебя будет внешне-внутренним, в результате...

Ну наверно, не до конца понял это определение. Предлагаешь делать по аналогии с express?

Цитата:

Сообщение от x-yuri
И url часто имеет вид: /[controller[/action[/id]]], например /users/delete/1 или /users

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



Вообще, забудьте про "объединенный вариант". Сейчас я склоняюсь к модели, в которой шаблон будет асинхронно дергать ручки и обрабатывать от них ответ. Соответствующий шаблонизатор скоро научится это делать.

Цитата:

Сообщение от x-yuri
карма напомнила ситуацию в Зимбабве

Кстати, да, даешь инфляцию в интернетах! :D

x-yuri 09.07.2012 02:24

Цитата:

Сообщение от B~Vladi
Возможно в каких-то частных случаях - да (либа там какая-нибудь), а так нет. То же XSL-преобразование. API везде разное ==> разный код.

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

Цитата:

Сообщение от B~Vladi
Ну наверно, не до конца понял это определение. Предлагаешь делать по аналогии с express?

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

какие проблемы я вижу?

1) говрят, в процессе рендеринга шаблона, может выясниться, что другой блок надо перерендерить. Мне никаких конкретных примеров в голову не приходит.

Разве что несколько другой вариант, когда блок может потребовать подключить далее по тексту страницы нужные js-файлы или вставить нужный js-код (вариант, когда теги скрипт указаны перед </body>). Но это вроде решаемо.

Т.е. если обобщить: рендеринг блоков может влиять друг на друга, и должна быть возможность это как-то решать

2) как будут исключения/ошибки обрабатываться?

больше ничего не приходит в голову...

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

ну и не надо забывать, что есть POST (действие) и GET (вывод), т.е. не на каждый запрос надо рендерить шаблон.

B~Vladi 09.07.2012 12:18

Цитата:

Сообщение от x-yuri
Но это вроде решаемо.

Ну у меня решаемо.
Цитата:

Сообщение от x-yuri
как будут исключения/ошибки обрабатываться?

На каком уровне?
Цитата:

Сообщение от x-yuri
Вопрос в том, в чем преимущества активного шаблона и когда его использовать.

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

Сообщение от x-yuri
Возможно, для основного контента страницы больше подходит пассивный шаблон, а для дополнительных (меню, баннеры, и т.д.) - активный...

Возможно. Остается найти такой шаблонизатор, который бы позволял рендерить шаблон в обоих режимах.

x-yuri 10.07.2012 01:45

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

Цитата:

Сообщение от B~Vladi
На каком уровне?

вот и я о том же. Произошла ошибка при подключении какого-то блока в шаблоне. Как и где обработать эту ошибку?

Цитата:

Сообщение от B~Vladi
Ну и данные будут запрашиваться только те, что требуются в конкретной ситуации, ничего лишнего.

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

Цитата:

Сообщение от B~Vladi
Возможно. Остается найти такой шаблонизатор, который бы позволял рендерить шаблон в обоих режимах.

php :)

B~Vladi 10.07.2012 09:33

Цитата:

Сообщение от x-yuri
php

:D как же я мог забыть об этом шаблонизаторе...

Раз уж речь пошла о шаблонизаторах, стоит говорить на примере какого-то конкретного. Предлагаю TSN, так как он будет использоваться у меня. Ну и в контексте NodeJS.

Цитата:

Сообщение от x-yuri
если шаблон будет напрямую обращаться к параметрам запроса, не нравится мне такой вариант

Чем?

Цитата:

Сообщение от x-yuri
Произошла ошибка при подключении какого-то блока в шаблоне. Как и где обработать эту ошибку?

Ну в любом случае это баг, его надо править. Отловить в контроллере это можно, отдав страницу 500 ну и с записью в лог, отправкой e-mail, sms, что угодно :)
Я считаю надо делать так.

Цитата:

Сообщение от x-yuri
Класс-вид, соответствующий шаблону, вполне может выполнять активные функции шаблона.

В этом случае при поддержке придется править и код класса и шаблон. Тогда как можно править только шаблон.

x-yuri 10.07.2012 10:26

Цитата:

Сообщение от B~Vladi
Чем?

слишком много знать будет, шаблон

Цитата:

Сообщение от B~Vladi
Ну в любом случае это баг, его надо править. Отловить в контроллере это можно, отдав страницу 500 ну и с записью в лог, отправкой e-mail, sms, что угодно

а как насчет обработки ошибки в пределах блока? Т.е. если произошла ошибка при отображении блока, это не привело к тому, что вся страница не отобразилась

Цитата:

Сообщение от B~Vladi
Ну и данные будут запрашиваться только те, что требуются в конкретной ситуации, ничего лишнего.

кстати, откуда вообще берутся мысли про какие-то лишние данные в случае с пассивным шаблоном?

и расскажи подробнее, как происходит обработка запроса. А то я вот придумал ситуацию, но не знаю, возможно ли такое при твоем подходе: запускается рендеринг шаблона и когда дело доходит до основного контента выясняется, что 404 Not Found. Т.е. весь этот рендеринг выше был ненужным, чего хотелось бы избежать

Цитата:

Сообщение от B~Vladi
В этом случае при поддержке придется править и код класса и шаблон. Тогда как можно править только шаблон.

ну вот ты сам чуть выше рассказывал, почему ты придумал сервисы... Я не очень вкурил идею с сервисами, но зато с шаблонами вроде бы все очевидно: шаблон определяет как рендерятся данные (пассивная составляющая) и как получаются данные (активная). Для первого больше подходит язык разметки, для второго - язык программирования. Да, если шаблон небольшой - неплохо было бы объединить все в одном файле. Но с другой стороны это может мешать наследованию (шаблонов).

B~Vladi 10.07.2012 11:34

Цитата:

Сообщение от x-yuri
слишком много знать будет, шаблон

Как бы да, но проблем я тут почему-то не вижу. Можешь привести пример, где это вызвало бы проблемы/неудобства?

Цитата:

Сообщение от x-yuri
а как насчет обработки ошибки в пределах блока? Т.е. если произошла ошибка при отображении блока, это не привело к тому, что вся страница не отобразилась

Полностью согласен, блок не должен показываться, но я пока не знаю как это решить у меня. Но решать как-то надо. Будем думать.

Цитата:

Сообщение от x-yuri
откуда вообще берутся мысли про какие-то лишние данные в случае с пассивным шаблоном?

Очень просто. Для пассивных шаблонов данные максимально соответствуют структуре представления. Если изменится view - нужно будет менять данные. Если будет несколько подобных view - либо для каждого агрегировать отдельный набор данных, либо использовать одни, но при этом может получится так, что для какого-то представления будут передаваться ненужные данные.
Ну и при поддержке нужно будет синхронизировать шаблон с логикой агрегации данных, а это лишний геморрой. Его не будет в активных шаблонах.

Цитата:

Сообщение от x-yuri
и расскажи подробнее, как происходит обработка запроса

На каком этапе(ах)?

Цитата:

Сообщение от x-yuri
А то я вот придумал ситуацию, но не знаю, возможно ли такое при твоем подходе: запускается рендеринг шаблона и когда дело доходит до основного контента выясняется, что 404 Not Found. Т.е. весь этот рендеринг выше был ненужным, чего хотелось бы избежать

Эта ситуация решена в примере: сначала рендерится основной контент. Если вдруг в этой части выясняется, что рендерить нечего - не рендерим. Основной шаблон, увидев что контента нет, выдаст содержимое страницы 404 из отдельного шаблона. При этом ничего лишнего отрендерено не будет.
Рядом можно посмотреть на примеры запросов данных, если интересно.

Цитата:

Сообщение от x-yuri
Для первого больше подходит язык разметки, для второго - язык программирования.

Согласен. У меня получится, что само получение данных инкапсулировано в коде, а из шаблона идет только вызов и обработка ответа. Получается всё на своих местах.

Цитата:

Сообщение от x-yuri
Но с другой стороны это может мешать наследованию (шаблонов).

Смотря как оно реализовано. Не могу представить такую ситуацию, может потому что у меня нет такого наследования, о котором ты говоришь.

B~Vladi 10.07.2012 22:32

Цитата:

Сообщение от B~Vladi
но я пока не знаю как это решить у меня. Но решать как-то надо. Будем думать.

Решено.

x-yuri 11.07.2012 10:19

Цитата:

Сообщение от B~Vladi
Как бы да, но проблем я тут почему-то не вижу. Можешь привести пример, где это вызвало бы проблемы/неудобства?

пример не могу. Просто на мой взгляд, ты переносишь слишком много обязанностей на шаблон, повышаешь связанность. С точки зрения unit-тестирования это скорее всего тоже неудобно.

Цитата:

Сообщение от B~Vladi
Полностью согласен, блок не должен показываться, но я пока не знаю как это решить у меня. Но решать как-то надо. Будем думать.

Цитата:

Сообщение от B~Vladi
Решено.

как?

Цитата:

Сообщение от B~Vladi
Очень просто. Для пассивных шаблонов данные максимально соответствуют структуре представления. Если изменится view - нужно будет менять данные. Если будет несколько подобных view - либо для каждого агрегировать отдельный набор данных, либо использовать одни, но при этом может получится так, что для какого-то представления будут передаваться ненужные данные.
Ну и при поддержке нужно будет синхронизировать шаблон с логикой агрегации данных, а это лишний геморрой. Его не будет в активных шаблонах.

можно пример?

Цитата:

Сообщение от B~Vladi
На каком этапе(ах)?

ну например, приходит запрос. Он передается в сервис, а потом в экшн сервиса? Кто запускает рендеринг шаблона, сервис? Или экшен? Есть отличие между обработкой GET- и POST-запросов?

Цитата:

Сообщение от B~Vladi
Рядом можно посмотреть на примеры запросов данных, если интересно.

вот я и говорю, что ты переносишь часть кода в язык разметки. Т.е. код записывается отчасти с помощью языка разметки. А язык разметки неудобен для написания кода. И это не то же самое, что в php. В php код может быть внутри разметки.

Цитата:

Сообщение от B~Vladi
Согласен. У меня получится, что само получение данных инкапсулировано в коде, а из шаблона идет только вызов и обработка ответа. Получается всё на своих местах.

с некоторым перекосом в сторону активности шаблона

Цитата:

Сообщение от B~Vladi
Смотря как оно реализовано. Не могу представить такую ситуацию, может потому что у меня нет такого наследования, о котором ты говоришь.

да, потому что у тебя наследование недекларативное. Декларативность - проще и надежнее (сложнее сделать ошибку), но менее гибка, если это необходимо...

кстати, есть все-таки две вещи, которых немного не хватает в mustache... :)


Часовой пояс GMT +3, время: 12:46.