Найти тему

Архитектура и паттерны проектирования.

Настало время поговорить про интимные вещи, а именно про архитектуру и паттерны.

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

Как будет орагинзована работа с данными? Какие сервисы будут задействованы? Как между собой будут общаться различные модули ПО и какие модули в принципе там будут? Всё это решается на этапе проектирвоания системы.

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

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

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

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

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

-2

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

Например, как получать данные из базы данных? Можно напрямую отправлять sql запросы, это же всегда работало. Но система становится сложнее и запросы могут начать повторяться. Где их хранить и как? Система должна быть отказоустойчивой и надо как-то ловить ошибки, при общении с базой данных. Где их ловить? Можно каждый вызов обернуть в try catch и проблем арешена. НО! Что если мы забудем где-то этот try catch или если нам нужна единая логика поведения системы при возникновении этих ошибок? Как это всё централизовать?

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

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

Архитектурные принципы и Паттерны проектирования - безумно полезные штуки, которые сэкономят много времени в будущем и сделают процесс разработки приятнее. Но всегда стоит помнить, что паттерны и принципы - это лишь СОВЕТЫ, как можно решить ту или иную типовую задачу. Не надо считать их стандартом и пихать везде, только потому что они вам нравятся. Никто не осудит если вы не придерживаетесь SOLID, а вывели собственные принципы, так как они эффективнее для решения ваших задач.

Полезные ссылки для самых маленьких:

Список основных паттернов проектирования:
http://design-pattern.ru/
Паттерны для самых маленьких:
https://refactoring.guru/ru
Верхнеуровневая архитектура ПО:
https://spark.ru/startup/1cloud/blog/42506/kratko-o-t..
Пошаговое создание архитектуры:
https://habr.com/ru/post/276593/
SOLID для самых маленьких:
https://habr.com/ru/post/413707/
GRASP для самых маленьких:
https://habr.com/ru/post/38323/

Полезные ссылки для больших:

Архитектура копроративных приложений:
http://www.ooart.ru/uploads/book/arhitektura_korporat..
JWT авторизация и аутентификация:
https://habr.com/ru/post/340146/
Чистая архитектура. Искусство разработки программного обеспечения:
https://litportal.ru/avtory/robert-s-martin/kniga-chi..
Луковая архитектура:
https://habr.com/ru/post/344164/
Дизайн WebAPI:
https://pages.apigee.com/web-api-design-register.html..