ru:https://highload.today/blogs/eto-dolzhen-znat-kazhdyj-razrabotchik-zachem-nuzhna-arhitektura-po-i-kakie-problemy-ona-reshaet/ ua:https://highload.today/uk/blogs/tse-maye-znati-kozhnij-rozrobnik-navishho-potribna-arhitektura-pz-ta-yaki-problemi-vona-virishuye/
logo

Это должен знать каждый разработчик: зачем нужна архитектура ПО и какие проблемы она решает

Богдан Пархоменко BLOG

Full-Stack Node.js Developer в NIX

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

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

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

Причина — код становится слишком связанным, как клубок нитей. Удачно подобранная архитектура поможет избежать подобных проблем. Для упрощения ситуации следует именно на уровне архитектуры «распутать» этот клубок.

Следовательно, упомянутые трудности делятся на следующие группы:

  • Политики

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

  • Детали
  • Онлайн-курс Frontend-разробник.
    Курс на якому ти напишеш свій чистий код на JavaScript, попрацюєш із різними видами верстки, а також адаптаціями проектів під будь-які екрани. .
    Зарееструватися

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

Архитектура по своей сути сконцентрирована именно на распределении политик и деталей.

Чтобы определить, к какой группе принадлежит код, подумайте: диктует ли код правила, как что-то в приложении должно работать? Если да, то это политика. Если код — просто реализация того, что должно работать, это детали. К ним относятся, например, фреймворки NestJS и Express.js или библиотеки npm типа Redux.

Многоуровневая архитектура

В такой архитектуре обычно есть две зоны ответственности, которые не пересекаются.

Доменный уровень

Здесь сосредоточены политики:

  • бизнес-логика;
  • правила;
  • сущности;
  • English For Tech: Speaking&Listening.
    Після курсу ви зможете найкраще презентувати свої досягнення, обговорювати проекти та вирішувати повсякденні завдання англійською мовою. Отримайте знижку 10% за промокодом TCENG.
    Дізнатись про курс
  • сервисы;
  • события.

В отличие от библиотек, они неизменны в программном обеспечении. То есть их нельзя заменить на что-то другое, не изменив суть самого продукта.

Инфраструктурный уровень

Эта прослойка архитектуры предназначена для деталей.

Это могут быть:

  • контроллеры;
  • роуты;
  • базы данных;
  • кэш;
  • Курс UX/UI дизайнер сайтів і застосунків з Alice K.
    Курс від практикуючої UI/UX дизайнерки, після якого ви знатимете все про UI/UX дизайн .
    Реєстрація на курс
  • сервисы для внешних API;
  • ОRМ.

Именно они заставляют код работать так, как того требуют политики. Детали на этом уровне можно заменять аналогами.

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

Правило зависимости

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

Все дело в правиле зависимости: что-то объявленное во внешнем круге не должно упоминаться в коде внутренним кругом. Это правило сохраняется и при большем количестве уровней.

В любом случае код должен указывать только внутрь диаграммы с внешних уровней на внутренние. Таким образом код доменного уровня не может зависеть от кода инфраструктуры. При этом код инфраструктурного уровня может зависеть от кода домена.

Порты и адаптеры

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

Онлайн курс з промт інжинірингу та ефективної роботи з ШІ.
Курс-інтенсив для отримання навичок роботи з ChatGPT та іншими інструментами ШІ для професійних та особистих задач, котрі допоможуть як новачку, так і професіоналу.
Записатися на курс

Параллельно на внешнем уровне создаем адаптеры или конкретные классы и реализации, используя те же интерфейсы. Остается только соединить все это на внешнем уровне. Рассмотрим пример, как это сделать.

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

В результате можно написать интерфейс для сервиса. Он будет использовать только интерфейс, и реализации на этом уровне нигде не будет. Интерфейс можно представить в качестве одного фрагмента мозаики:

Далее описываем, как отправляется письмо с помощью определенной библиотеки. Каждую такую ​​реализацию тоже можно представить как кусок мозаики:

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

Что нам дает правильно подобранная архитектура

Простота тестирования

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

Розмовна англійська.
Після цього курсу ви зможете спілкуватись з іноземцями і цікаво розкажете про себе.
Приєднатися

Но перед тем, как заходить слишком далеко, спросите себя: сможете ли «поиздеваться» над написанным кодом? Если вы ссылаетесь на интерфейсы, следите за кодом и делаете его по всем принципам и архитектуре, то ответ «да». А ведь код легко протестировать. В противном случае ответ будет отрицательным.

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

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

Гибкость кода

В случае изменения политики можно влиять на детали, ведь они зависят от политики. Но изменение деталей никогда не должно влиять на политику.

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

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


Совет напоследок — всегда ищите баланс. Если вы, например, создаете простой скрипт для парсинга одной новостной страницы, вряд ли вам понадобится гибкость архитектуры в полном объеме. Написание таких механизмов займет больше времени, чем работа над скриптом.

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

Курс QA.
Найпростіший шлях розпочати кар'єру в ІТ та ще й з гарантованим працевлаштуванням.
Інформація про курс

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Системний гейм дизайнер.
Це курс, де ти почнеш концептити ігри.
Записатися

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров марта

PHP Developer в ScrumLaunch
Всего просмотровВсего просмотров
1898
#1
Всего просмотровВсего просмотров
1898
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
111
#2
Всего просмотровВсего просмотров
111
Career Consultant в GoIT
Всего просмотровВсего просмотров
93
#3
Всего просмотровВсего просмотров
93
CEO & Founder в Trustee
Всего просмотровВсего просмотров
92
#4
Всего просмотровВсего просмотров
92
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: