RSS

Комментарии

Основное отличие GraphQL от REST API заключается в их структуре и подходе к доступу и манипулированию данными.

GraphQL использует единый, гибкий endpoint и язык запросов для запроса конкретных данных. Клиент может выбрать все данные одним запросом, даже если они будут располагаться в разных источниках. Это позволяет избежать избыточной или недостаточной выборки данных, сокращая объём ненужной информации, передаваемой между клиентом и сервером.

REST API используют несколько endpoints, представляющих ресурсы, со стандартными методами HTTP для выполнения операций. Из-за жёсткой структуры REST API нужно постоянно прописывать путь к данным, которые хочет получить клиент, делая выборку.

Таким образом, GraphQL упрощает разработку на стороне сервера и позволяет легче управлять версионированием и развёртыванием, в то время как REST API более прост и подходит для небольших проектов
Ясно, спасибо. А чем GraphQL отличается от rest?
Выбор между gRPC и GraphQL зависит от конкретных требований проекта к производительности, поддержке платформ, сложности запросов и особенностей архитектуры приложения.

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

GraphQL предлагает гибкие запросы и эффективную передачу данных, оптимален для сложных и детализированных API. Подходит для запросов к базам данных со множеством записей, когда нужно извлекать только необходимые данные в определённых форматах.

При необходимости эти технологии можно комбинировать в гибридных API, используя сильные стороны каждого подхода. Например, можно добавить GraphQL слой поверх существующего REST API или применять gRPC для внутреннего обмена данными, оставляя REST API для внешних клиентов
А что лучше grpc или GraphQL?
Почему хорошо использовать GraphQL

— Гибкость. GraphQL не накладывает ограничений на типы запросов, что позволяет использовать его как для традиционных CRUD-операций (create, read, update, delete), так и для запросов, которые содержат несколько типов данных.

— Определение схемы. GraphQL автоматически создаёт схему для API. А за счёт иерархической организации кода и объектных отношений снижается его сложность.

— Оптимизация запросов. GraphQL позволяет клиентам запрашивать только ту информацию, что им нужна. Это уменьшает время ответа от сервера и количество данных, которые нужно передавать по сети.

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

— Расширяемость. GraphQL позволяет разработчикам расширять схему API и добавлять новые типы данных. При этом есть возможность повторного использования существующего кода и источников данных, чтобы избежать случаев избыточного кода.
Все равно не мого понять. Почему хорошо использовать GraphQL, многие об этом говорят в том числе и наши ИТ-отдел но не понятно в чем именно суть, зачем нужно?
На самом деле объяснить GraphQL можно намного проще:

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

— schemas (схемы),
— resolvers (преобразователи),
— queries (запросы),
— mutations (мутации).

Схемы. GraphQL использует строгую систему типов, в которой все типы данных записываются на языке определения схем GraphQL (SDL). Типизированные схемы определяют формы данных, которые могут запрашиваться в API, а также взаимосвязи между типами и операциями, доступными пользователю.

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

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

При запуске поля запроса система генерирует вызов соответствующего преобразователя для получения следующего значения. Если поле выдает скалярное значение (например, строку или число), выполнение завершается. Если оно содержит объектное значение, запрос включает дополнительные значения для этого объекта. Этот процесс продолжается до тех пор, пока не останутся только скалярные поля. Преобразователи также упрощают форматирование информации и помогают системе объединять информацию из различных источников.

Запросы. Их отправляют клиенты на сервер. Он определяет, какие данные клиент хочет получить. Запросы определяются в типе, который представляет собой специальный объект в коде, определяющий точку входа верхнего уровня для каждого запроса, который клиенты могут выполнять. Каждый тип запроса также определяет имя и вид возвращаемого значения для каждой точки входа.

Когда поступает запрос, GraphQL проверяет его на соответствие определениям схемы и, предполагая, что запрос корректен, выполняет его. Структура обычно отражает структуру данных ответа, что делает требования к виду информации более понятными.

Мутации. Это операции, которые создают, обновляют или удаляют данные на сервере. Они аналогичны операциям POST, PUT, PATCH и DELETE в RESTful API. Хотя пользователи могут получать доступ к некоторым запросам без аутентификации, мутации всегда требуют ее наличия (например, с помощью токена). Аналогично запросам, мутации в GraphQL проверяются на соответствие схеме и ее определениям. Как только мутация проверена и запущена, сервер возвращает ответ в формате JSON (текстовый формат на JavaScript).

В чем преимущества GraphQL

Скорость. GraphQL работает намного быстрее, чем другие коммуникационные API. Он позволяет сократить количество запросов, выбирая только нужные поля.

Совместимость со сложными системами и микросервисами. Сервер инструмента используется для получения данных из существующих систем и представления их в формате ответов. Это наиболее подходящий формат для устаревших инфраструктур или сторонних API, которые огромны по размеру и сложны в обслуживании и обработке. Когда нужно переходить от монолитного серверного приложения к архитектуре микросервисов, GraphQL помогает управлять взаимодействием между несколькими микросервисами. Он объединяет их в одну схему.

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

Определение формы данных. При отправлении запросов сервер возвращает ответ в простой, безопасной и предсказуемой форме. Это облегчает написание конкретного запроса в соответствии с требованиями.

Строгая типизация. GraphQL — это язык со строгой типизацией, в котором каждый уровень запроса соответствует определенному типу. А каждый тип описывает набор доступных полей. Он похож на SQL и предоставляет описательные сообщения об ошибках перед выполнением запроса.

Нет необходимости в обновлении. В GraphQL результирующий набор или возвращаемые данные очень специфичны в соответствии с запросом клиента, поэтому серверу просто их обобщить. Добавление новых функций продукта или полей на сервер не влияет на работу существующих клиентов. Можно использовать старый сервер — поля могут быть устаревшими, но при этом будут продолжать работать.
Преимущества и недостатки GraphQL

Сопоставление плюсов и минусов поможет решить, нужен ли GraphQL вашему проекту – или лучше обойтись REST API.

Преимущества GraphQL:
— Клиент может получать только те данные, которые ему нужны.
— Типизация и автоматическая валидация позволяет клиентам легко понять, какие данные и типы доступны в API, и точно формулировать запросы.
— Клиенты не зависят от серверных изменений в структуре данных.

Недостатки GraphQL:
— Возможные проблемы с производительностью. Поддержка иерархических запросов с глубокими уровнями вложенности могут привести к проблемам с производительностью. Для их предотвращения стоит внедрить лимиты на количество вложенных уровней или ограничение частоты запросов.
— Для небольших и простых приложений функциональность GraphQL может быть излишней.
— GraphQL не поддерживает кэширование на уровне HTTP. Это может привести к увеличению нагрузки на сервер, так как каждый запрос будет выполняться заново, а не извлекаться из кэша.
1. Не правильно предполагаете — просто некй экшен может просто отдавать статику, а значит ему не надо дергать модель. Или же наоборот — он отвечает на некий ajax запрос, или режим работы апи — тогда он не рендериит ничего, а отдает данные например в виде json. так же в контроллере вполне может происходить некая предвариительная проверка / валидация форм…

2. Это было относительно недостатков раздела 1, где описано кто что делает и как все плохо из-за этого. Просто тут имхо на не совсем мелком проекте хотябы без хелперов никуда, иначе появится дублирование кода или базовые классы будут сильно обрастать функционалом — имеются ввиду базовый контроллер / модель / въюха

3. Никакой ошибки там нет. Без модели конечно сложно пример придумать в чистом MVC, но думаю тоже найдется если подумать.

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

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

3.3. Касательно функциональных модулей — я пишу о том же, абсолютно о том же.

4. Вы пишите что больше и этого уже достаточно. Если говорить об урл, то при текущих серверах это пренебрежимо мало и не стоит это относить к недостаткам. Я же писал о том как было ранее — получили данные из БД, они как правило в виде обычного массива, далее оперируют этим массивом. Если передавать массив и он большой, то по умолчанию он будет копироваться и да, будет кушать память. Сейчас же это скорее будет некая коллекция и передаваться будет в виде объекта, а он по умолчанию не будет копироваться и кушать память

4.1. В MVC контроллер не должен разбирать урл. Урл должен разбираться до контроллера, либо как-то напрямую, но лучше в неком классе Request и уже на основе этого урла разобранного как-раз и будет подключаться и вызываться некий метод некого контроллера
1. Controller -> Model -> View — это я написал упрощенный вариант последовательности, конечно, если вдаваться в подробности, то цепочка будет иметь вид CMCVC.

«Контроллер получает запрос, что-то с ним делает, на основании его подключает или не подключает модели, получает или не получает данные и далее может отдать их сразу или вызвать рендер представления» — могу сделать вывод, что у Вас часть логики работы приложения лежит в контроллере (исходя из того, что у Вас контроллер получает или не получает данные), а википедия говорит, что это наиболее распространенная ошибка.

2. Я написал исключительно свое мнение о применении MVC в своем проекте, где использовал MVC в чистом виде. Я ни слова не сказал как его обычно применяют при реализации «среднестатистических проектов». К чему это утверждение я не понимаю.

3. Я пишу о функциональных модулях программы. Функциональный модуль — это некий логически завешенная часть программы, реализующая какую нибудь самостоятельную функцию. Например, функциональный модуль отвечающий за комментарии пользователей. Такой модуль включает в себя элементы контроллера (загрузка параметров для комментариев), элементы модели (загрузка данных из СУБД и применение параметров определенных контролером) и элементы отображения (механизм визуализации комментариев).

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

4. «но не на так много как вы описываете» я и не пишу, что на много больше, я пишу что больше.

Мне не понятно как выбор подхода (функциональный или объектно ориентированный) влияет на объем памяти, необходимый для хранения данных? Например, одним из параметров программы (в моем проекте) является URL, как известно это обычная строка. В MVC контроллер разбирает URL и распределяет его части в переменные (URL «server/ru/blog/» загружается в 3 переменные/свойства $server, $language и $category). Далее модель будет оперировать исключительно этими переменными.

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

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

1. Вы пишите Controller -> Model -> View — это в корни не верно, модель никакого отношения к представлениям вообще не имеет — там только логика и данные. Контроллер получает запрос, что-то с ним делает, на основании его подключает или не подключает модели, получает или не получает данные и далее может отдать их сразу или вызвать рендер представления — это в упрощенном виде, т.к. здесь еще могут быть ACL или еще неке действия связанные с другими частями приложения

2. Вы упускаете тот факт, что MVC в чистом виде сейчас редко где встретишь. Почти везде есть помощники / поведения / блоки и т.д., а так же все это подкреплено всякими реестрами / репозитариями / событиями и т.д…

3. На модули делить очень даже просто — MVC будет внутри модуля и к слову сказать — совершенно не обязательно, чтобы у модуля к примеру был свой контроллер, он вполне себе может существовать и без него, или без модели

4. На счет расходов ресурсов — подозреваю что если использовать mvc это будет кушать больше ресурсов чем тот подход, который вы описывали, но не на так много как вы описываете. MVC это ООП — а в ООП в основном оперируют объектами, а они в свою очередь передаются по ссылке — поэтому никаких дополнительных расходов ресурсов особо не происходит. Но при грамотном построении архитектуры, когда проект разрастается, его намного проще поддерживать и развивать
Мой путь к MVC

Некоторое время назад, мной было принято решение сделать свой блог. Повозившись какое-то время с WordPress пришел к выводу, что «там рыбы нет» (и сегодня, глядя на статистику запросов к сайту считаю, что отказ от WordPress было правильным решением). В общем, проанализировав совокупность внешних факторов (мои знания, необходимое время на разработку, доп. затраты на обслуживание и т. д.) решил все разработать самостоятельно, с нуля. И т. к. теперь у меня руки были развязаны (в выборе механизмов программной организации), решил опробовать «на себе» широко разрекламированную концепцию MVC (в предыдущих проектах я использовал модульный подход).

Мое понимание MVC

Т. к. в найденной мной технической документации используются весьма заумные формулировки (типа «использует модель и представление для реализации необходимой реакции»), считаю необходимым написать свое понимание концепции MVC (чтобы не возникало недоразумений).
Итак, согласно концепции MVC, приложение должно состоять из 3-х фундаментальных логических частей: controller (контроллер), model (модель), view (представление/отображение). Блок controller – преобразует действия пользователя (в данном контексте, пользователь – не обязательно человек) во входящие параметры для Model и передает управление в Model. Блок model – реализует всю логику работы программы и подготавливает данные для отображения. Блок view – визуализирует результаты работы программы. Каждое действие пользователя всегда запускает цепочку controller->model->view.
Распишем функции каждого блока более подробно, controller:

— загружает переменные окружения (POST/GET переменные, параметры командной строки, URL параметры и т. д.);
— выполняет первичную обработку переменных окружения (проверка типов переменных, их наличие, установка значений по умолчанию и т. д.);
— реализует механизмы контроля за внештатными ситуациями;
— реализует механизмы логгирования (не аутентификации, а ведение журналов).

Model:

— выполняет конечную проверку входящих параметров (допустимость значений, диапазонов и т. д.);
— реализует взаимодействие с системами хранения данных (базы данных, файлы, SOAP и т. д.);
— реализует логику работы программы;
— подготавливает данные для визуализации.

View:

— организует механизмы визуализации результатов работы программы.

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

Недостатки концепции MVC
1. Необходимость использования большего количества ресурсов. Сложность обусловлена тем, что все три фундаментальных блока являются абсолютно независимыми и взаимодействуют между собой исключительно путем передачи данных. Controller должен всегда загрузить (и при необходимости создать) все возможные комбинации переменных и передать их в Model. Model, в свою очередь, должен загрузить все данные для визуализации и передать их во View. Например, в модульном подходе, модуль может напрямую обрабатывать переменные окружения и визуализировать данные без загрузки их в отдельные секции памяти.
2. Усложнен механизм разделения программы на модули. В концепции MVC наличие трех блоков (Model, View, Controller) прописано жестко. Соответственно каждый функциональный модуль должен состоять из трех блоков, что в свою очередь, несколько усложняет архитектуру функциональных модулей программы.
3. Усложнен процесс расширения функционала. Проблема очень схожа с вышеописанной. Недостаточно просто написать функциональный модуль и подключить его в одном месте программы. Каждый функциональный модуль должен состоять из трех частей, и каждая из этих частей должна быть подключена в соответствующем блоке.

Преимущества концепции MVC
1. Единая концепция системы. Несомненным плюсом MVC является единая глобальная архитектура приложения. Даже в сложных системах, разработчики (как те, которые разрабатывали систему, так и вновь присоединившиеся) могут легко ориентироваться в программных блоках. Например, если возникла ошибка в логике обработки данных, разработчик сразу отбрасывает 2-блока программы (controller и view) и занимается исследованием 3-го (model). Я не раз удивлялся, насколько сильно упростилась локализация проблем.
2. Упрощен механизм отладки приложения. Т. к. весь механизм визуализации теперь сконцентрирован в одном программном блоке, упростились механизмы опционального вывода графических элементов. Я не могу оценить насколько это утверждение применимо в программировании классических приложений, но в Web программировании эта архитектурная особенность стала несомненным плюсом.

Выводы
Общее впечатление, от использования концепции MVC получилось положительным. Те сложности, которые обратили на себя мое внимание — они больше психологические (вот всегда было так, а теперь по другому). В тоже время, для меня остался открытым вопрос, насколько можно применить концепцию MVC при разработке обычных приложений (например, для Windows). На вскидку вроде можно, но не факт, что это будет оптимально.
Ну и самый главный вопрос: стану ли я использовать концепцию MVC, в следующих своих проектах? Ответ: думаю да.
​Удобно и красиво, как и со всеми паттернами к стати. Деление ролей по MVC красиво и удобно потому, что стратегически выгодно в больших проектах с насыщенным графическим интерфейсом. Оно, скажем так, отвечает тому как видит систему разработчик. Позволяет хорошо локализовать изменения в этих отдельных сущностях так, что вероятность их одновременного изменения ниже. Давайте на вскидку рассмотрим основные причины изменений которые видны в ДСТ Платформ:

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

— Изменение логики интерфейса — больше меняется представление, потом контроллер, модель еще меньше.

— Исправление ошибок — прежде всего их проще найти, во-вторых упрощается тестирование.

— Большие структурные изменения — их становится проще спланировать, разбить на этапы.

Проект становится более управляемым и предсказуемым, а это одна из основных целей проектирования.
​MVC — это архитектурный паттерн, который разделяет приложение на три логических компонента: модель, представление и контроллер.

Основная идея паттерна MVC в том, что у каждого раздела кода есть своя цель. Часть кода содержит данные приложения, другая отвечает за то, каким его видит пользователь, последняя управляет его работой.

— Код модели Model хранит данные и связанную с ними логику, а также закрепляет структуру приложения. Например, если программист создаёт приложение для списка дел, код модели будет по шаблону определять основные компоненты приложения: что такое «задача» и что такое «список».

— Код внешнего вида приложения, View, состоит из функций, которые отвечают за интерфейс и способы взаимодействия пользователя с ним. Представления создают на основе данных, собранных из модели. В случае приложения со списком дел View определяет, как выглядят задачи.

— Код контроллера, Controller, связывает модель и представление. Он получает на вход пользовательский ввод, интерпретирует его и информирует о необходимых изменениях. Например, отправляет команды для обновления состояния, такие как сохранение документа. В приложении со списком дел контроллер определяет, как пользователь добавляет задачу или помечает ее как выполненную.

Проще говоря — MVC — подход к проектированию приложения, который предполагает выделение кода в блоки типов модель, представление и контроллер. Контроллер обрабатывает входящие запросы. Модель достаёт из базы данных информацию, нужную для выполнения конкретных запросов. Представление определяет результат запроса, который получает пользователь.

Таким образом DST Platform становиться логичным и понятным для почти любого разработчика, что достаточно важно т.к. нет привязки к чему то одному.
​MVC — это архитектурный паттерн, который разделяет приложение на три логических компонента: модель, представление и контроллер.

Основная идея паттерна MVC в том, что у каждого раздела кода есть своя цель. Часть кода содержит данные приложения, другая отвечает за то, каким его видит пользователь, последняя управляет его работой.

— Код модели Model хранит данные и связанную с ними логику, а также закрепляет структуру приложения. Например, если программист создаёт приложение для списка дел, код модели будет по шаблону определять основные компоненты приложения: что такое «задача» и что такое «список».

— Код внешнего вида приложения, View, состоит из функций, которые отвечают за интерфейс и способы взаимодействия пользователя с ним. Представления создают на основе данных, собранных из модели. В случае приложения со списком дел View определяет, как выглядят задачи.

— Код контроллера, Controller, связывает модель и представление. Он получает на вход пользовательский ввод, интерпретирует его и информирует о необходимых изменениях. Например, отправляет команды для обновления состояния, такие как сохранение документа. В приложении со списком дел контроллер определяет, как пользователь добавляет задачу или помечает ее как выполненную.

Проще говоря — MVC — подход к проектированию приложения, который предполагает выделение кода в блоки типов модель, представление и контроллер. Контроллер обрабатывает входящие запросы. Модель достаёт из базы данных информацию, нужную для выполнения конкретных запросов. Представление определяет результат запроса, который получает пользователь.

Таким образом DST Platform становиться логичным и понятным для почти любого разработчика, что достаточно важно т.к. нет привязки к чему то одному.
Паттерн MVC позволяет писать независимые друг от друга блоки кода. Их можно менять отдельно, не затрагивая остальные. Так можно облегчить себе работу, разрабатывая только один программный компонент — независимо от остальных. Например, переписывать способ отображения данных, не трогая способ их обработки.

Это особенно актуально для больших команд. MVC структурирует код и упрощает тестирование, поддержку: с этим паттерном модернизировать можно отдельные блоки, а не всё приложение целиком. Модель позволяет разделить обязанности: пока один программист пишет обработчик данных, другой занят их отображением. В DST Platform это здорово экономит время: каждый работает над своей задачей, не нужно вникать в чужой код, а изменения в одном блоке не влияют на другой.
Паттерн MVC позволяет писать независимые друг от друга блоки кода. Их можно менять отдельно, не затрагивая остальные. Так можно облегчить себе работу, разрабатывая только один программный компонент — независимо от остальных. Например, переписывать способ отображения данных, не трогая способ их обработки.

Это особенно актуально для больших команд. MVC структурирует код и упрощает тестирование, поддержку: с этим паттерном модернизировать можно отдельные блоки, а не всё приложение целиком. Модель позволяет разделить обязанности: пока один программист пишет обработчик данных, другой занят их отображением. В DST Platform это здорово экономит время: каждый работает над своей задачей, не нужно вникать в чужой код, а изменения в одном блоке не влияют на другой.
Ну если просто то MVC помогает грамотно организовать собственный код — по функциям каждого конкретного блока. Это повышает его читаемость. Вам будет проще к нему возвращаться и дорабатывать, а другим разработчикам — легче его понять.
Ну если просто то MVC помогает грамотно организовать собственный код — по функциям каждого конкретного блока. Это повышает его читаемость. Вам будет проще к нему возвращаться и дорабатывать, а другим разработчикам — легче его понять.
Хотелось бы по подробней узнать, зачем использовать паттерн MVC в DST Platform? Какие вообще преимущества и минусы MVC. Также было здорово понять MVC в реальной веб-разработке: как работает контроллер?

Заявка на услуги DST

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

Адрес

Ижевск, ул. Воткинское шоссе 170 Е.
Региональный оператор Сколково. Технопарк Нобель

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон