Длинное, про Хаскель - часть 3

Comments

Вопрос не по реализации, а по архитектуре. Если суть приложения составляет диалог, то почему протокол выбран без состояния? IMHO, это типичный случай необходимости сессии, см. протокол SSH, например.
Потому что за работу через HTTP мне деньги платят. Это же не абстрактная задачка, а часть работы. И клиентом, по большому счёту, должен быть браузер, а состояние передаётся в куках. Правда, как я и говорил, этот вариант решения я отбросил, но для общего образования выкладываю.
Эх, такие диалоги через HTTP не особо хороши. Протокол-то создавался не для этого. Но раз уж это нужно, я бы сделал состояние сессии частью состояния приложения. Видимо, это какой-то многошаговый диалог для заполнения форм типа онлайн тестов? Если это просто большая форма, почему бы не завести ресурс со своим URI на каждый шаг? GET для получения формы, PUT для выкладывания заполненных полей. И ещё один ресурс для транзакции отправки всей формы. GET для его получения, POST для подтверждения, DELETE для отката всего состояния. По мотивам RESTful реализаций состояния корзинок в интернет-магазинах.
Ну, во-1, ВСЁ общение пользователя с веб-сервером - подобного сорта диалог. Во-2, низкоуровневые детали - POST, GET, SHMET - меня сейчас не сильно интересуют.
Здесь я позволю себе не согласиться. Как раз конкретный язык программирования и внутренние структуры данных — это низкоуровневые детали, которые не так важны по сравению с логикой обработки запросов и подхода к разделению состояния приложения. Я бы хотел привести традиционные аргументы стиля REST, именно с архитектурной точки зрения. Знаком ли ты с ними (чтобы не повторяться)?
Откуда мне знать, что ты считаешь традиционным?
Меня интересует способ описания подобных диалогов в естественном для программиста виде. То, что написано в определении test, выглядит вполне естественно. Как конкретно будет представлено состояние, какими запросами оно будет передаваться - меня не волнует.
Стиль REST достаточно известен, равно как его плюсы и минусы. В оригинальном виде их можно найти в диссертации Филдинга. Если кратко, основные показатели качества программных систем определяются архитектурой системы, т. е. её высокоуровневой организацией: конфигурацией компонентов, их соединителей и данных в системе. Такая конфигурация позволяет реализовать тот или иной набор нефункциональных требований. В случае стиля REST речь идёт о масштабируемости, простоте, развиваемости, эффективности, надёжности. REST — это стиль многоуровневого клиент-серверного взаимодействия, без состояния сессии, с унифицированным интерфейсом, кэшированием и передачей кода по запросу. Показано, что для веб-приложений он даёт хорошее соотношение показателей качества архитектуры.

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

Для ЛЮБОЙ программы важны внешние интерфейсы. Именно поэтому надо делать так, чтобы внутренние детали писались легко и приятно. Дабы не уделять им слишком много внимания. Это я и пытаюсь делать.
Упс, я написал "в куках"? Это машинально, я имел в виду, разумеется, в hidden-полях или их аналогах.
Что же «рекламного» я сказал? Не привёл аргументов против того, что предлагаю?

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

Похоже, это культурная особенность хаскелистов — искать сложные решения простых проблем. Если решение не сложное, то оно не красивое, в противоположность питоновскому «простое лучше, чем сложное».
хорошее соотношение показателей качества архитектуры. - ты хоть сам понимаешь, что этот набор слов АБСОЛЮТНО бессмысленен?

В случае стиля REST речь идёт о масштабируемости, простоте, развиваемости, эффективности, надёжности.
- угу, сразу вспоминается ЛОРовский мем "PHP - это Глобально и Надёжно".

Все эти фразы замечательно звучат в телевизионной рекламе. И более нигде, так как информации в них ноль.

Ты привлекаешь много дополнительных средств там, где, казалось бы, можно всё сделать проще другим способом. Об этом способе я и хотел сказать. - так говори, твою мать! Как мне АВТОМАТИЧЕСКИ определить, какая часть состояния может пригодиться, а какая - нет?
Я предлагаю не ругаться. Это не так интересно, как обсуждать инженерные проблемы :) Согласен, что без нужного контекста часть моих слов лишена смысла. Иногда контекста или слишком мало, или слишком много, особенно когда не очень хорошо знаешь собеседника. Если дать мало контекста, то фразы будут выглядеть бессмыслицей, если слишком много — изложением банальных очевидных вещей. По поводу «рекламных» фраз, я предлагаю заглянуть в работу, о которой я говорил в начале обсуждения. Там приводятся определения архитектуры, требований к архитектуре, показателей качества.

Насколько я тебя понимаю, ты изначально борешься не с тем, чтобы определять, какая часть состояния нужна, а с тем, чтобы не нагружать сеть передачей большого количества данных. И как решение вопроса, ты предлагаешь сократить количество пересылаемого состояния, отправляя лишь то, что в дальнейшем используешь в программе. Я предлагаю следующую вещь. Раз уж протокол, который тебе бы наиболее подошёл, является stateful, но ты ограничен протоколом HTTP, то можно реализовать хранение всего состояния на сервере, приняв его не за состояние сессии, а за долговременно хранимые на сервере данные приложения. Тогда передавать состояние в запросах становится ненужным и сеть не нагружается лишними данными. Возможный вариант реализации я описал выше.
Раз уж протокол, который тебе бы наиболее подошёл, является stateful, но ты ограничен протоколом HTTP, то можно реализовать хранение всего состояния на сервере, приняв его не за состояние сессии, а за долговременно хранимые на сервере данные приложения.

А ещё про REST говорил... Вечно вы, питонщики, отвечаете не на тот вопрос.
Эх, продолжаем обсуждение :) Мне кажется, что культурные различия — это если и не однозначно хорошо, то, по крайней мере, интересно и познавательно. Я отчасти поэтому интересуюсь Haskell. Другая часть — конечно любопытный функциональный язык, не похожий на намешанные Scheme или Scala… Но важнее всё же другая культура. Особенно заметно различие именно с Python. Я уже говорил про сложные, скажем, хитроумные решения в противовес простым и порой банальным. Есть множество других различий. Например, отношение к статической/динамической типизации. В любом случае, всё это познавательно.

Возвращаясь к состоянию и REST. Вот то самое решение, которое я описал в предыдущем комментарии, можно реализовать как я написал во втором комментарии, находясь в рамках ограничений REST. Т. е. думать о состоянии не как о состоянии сессии, а как о состоянии приложения и хранить его соответствующим образом (а не передавать). Для меня это вполне естественный способ реализации того, о чём мы ведём речь. Похожее можно наблюдать во многих протоколах. Наример, в управлении сетями, часть протоколов активно использует сессию, типа NetConf, а другая часть не делает этого, воспроизводя элементы состояния сессии в виде прикладного состояния, типа SNMP. Мне кажется, что общая структура взаимодействия в твоём решении не очень подходящая и что конкретный вариант с HTTP как прикладным протоколом (и всеми его методами) как конкретное воплощение REST здесь бы подошёл лучше.
Т. е. думать о состоянии не как о состоянии сессии, а как о состоянии приложения и хранить его соответствующим образом (а не передавать).

Обо ВСЁМ состоянии? Обо всей информации, поступающей от пользователя? No way, это полное отрицание буквы S. Со всеми вытекающими последствиями.

Мне кажется, что общая структура взаимодействия в твоём решении не очень подходящая

Не очень подходящая для чего? У меня впечатление, что ты имеешь в виду какую-то конкретную задачу, которая, видимо, мало интересует меня.

конкретный вариант с HTTP как прикладным протоколом

Да кому нафик интересно, какой там на самом деле протокол, главное, что stateless.
Да, конечно, всё зависит от задачи. Я предполагал что ты делаешь нечто, что сопоставимо с многоэкранными формами. Отсюда и решение в стиле REST — отнести состояние форм к части прикладного состояния: выделить для состояния отдельные URI, хранить его на сервере и т. д. Это вполне согласуется с REST. Там идёт речь не о запрете состояния вообще, а только состояния сессии, которое должно полностью поддерживаться на клиенте. Смысл ограничения — горизонтальное масштабирование серверов. Можно иметь N серверов, запросы между которыми разделяет load balancer. Опять же, при выходе из строя одного из них сессию не нужно восстанавливать на другом, потому что её просто нет. Ну и простота. Когда один и тот же URI значит одно и то же для любого пользователя в любое время (пока жив ресурс) — это делат вещи более очевидными. Можно сохранить URI, послать другому и т. д.

Post a comment

Already a Vox member? Sign in

migmit

About Me

migmit
Russian Federation
  • Powered by Vox