На момент написания этой статьи я был разработчиком программного обеспечения в течение 15 лет, и я видел огромную проблему в индустрии программного обеспечения: чрезмерная инженерия (также известная как разработка, основанная на резюме / резюме). — использование слишком сложных технологий или конструкторских решений на всякий случай, что резко увеличивает затраты на разработку, но дает мало или ничего взамен.

Будь то Domain-Driven Design, микросервисы, Равномерный сорсинг, блокчейн, луковая архитектура… — большинству программ они не нужны или нужны только в нескольких местах. Большинство существующих приложений представляют собой не что иное, как CRUD, и простой CRUD должен быть нашим архитектурным выбором по умолчанию.

Что такое КРУД?

CRUD означает любое программное обеспечение, которое поддерживает операции создания, чтения, обновления и удаления. Звучит знакомо?

  • HashMap (в некоторых языках программирования называется словарем) — пожалуй, самая простая CRUD-система: put(key, value) соответствует операциям Create и Update, get(key) — операции Read, remove(key) — операциям Delete.
  • Сегодня мы чаще всего раскрываем наши сервисы с помощью HTTP, используя соглашения REST. Он работает точно так же: POST / соответствует Create, PUT /key или PATCH /key — Create или Update, GET /key — Read, DELETE /key —… Delete. Чем более похожим на HashMap будет ваш REST, тем проще может быть ваша система, например, избегайте POST /shopping-carts/{shoppingCartId}/add-product, если просто PUT или PATCH /shopping-carts/{shoppingCartId} достаточно"
  • Все базы данных (кроме только для добавления или только для чтения) работают по одному и тому же принципу, например для баз данных SQL: оператор INSERT соответствует Create, SELECT соответствует Read, UPDATE соответствует Update, а DELETE соответствует Delete.

Как реализовать CRUD-приложения?

Почти все существующие приложения идеально вписываются в модель CRUD. Это также чрезвычайно просто реализовать, например, с помощью популярной Java и Spring Boot:

  • база данных (одна или несколько) — вы можете использовать любой тип, но для большинства приложений достаточно популярной базы данных SQL, такой как PostgreSQL
  • доступ к базе данных — вы можете использовать популярный фреймворк Spring Data, он поддерживает множество типов баз данных (SQL, Mongo, Redis, Couchbase, Elasticsearch, Neo4j)
  • валидация — Весенняя валидация
  • обеспечение — Spring Security
  • представление данных миру как REST — Spring WebMVC REST плюс, опционально, SpringDoc
  • потребление данных на стороне внешнего интерфейса — вы можете написать внешний интерфейс вручную (например, в Angular или React), но во многих случаях (например, в панелях администрирования) библиотеки внешнего интерфейса на основе схемы JSON могут выполнять большую часть работы.

Вы можете легко адаптировать этот список, если используете другой стек (NodeJS, Python, .NET, Ruby, …). Этого достаточно для 99% вашего внутреннего кода!

Почему бы не пропустить Java (Python, NodeJS и т. д.) и не подключить интерфейс напрямую к базе данных?

Мы можем попробовать сделать это (это было популярно в 90-х и иногда называлось толстым клиентом), но, имея между ними полноценный язык программирования на стороне сервера, мы можем делать больше, например, мы можем выполнять сложные проверки ( например Spring Validation), мы можем осуществлять комплексный контроль безопасности (например, Spring Security), мы можем легко подключаться к другим системам, а позже мы можем легко добавить возможности Domain-Driven, микросервисов или Event Sourcing, если это необходимо.

Что делать, если CRUD недостаточно?

В некоторых случаях полезны такие идеи, как проектирование на основе домена, CQRS, Event Sourcing или микросервисы, однако вы можете легко добавить их в свое приложение в течение нескольких часов, сохраняя при этом «ядро» вашего приложения на основе CRUD, не переписывая все. , но это темы для других статей.

дальнейшее чтение