Швидке введення в чисту архітектуру

У проекті з відкритим кодом, в якому я почав брати участь, мені було представлено поняття «чистої архітектури».

По-перше, це було досить переважно, але після деякого прочитання це мало сенс. Я думав, що це може бути корисно для інших, якщо я запишу свої думки.

Зміст

  • Наочні уявлення
  • Концепція - представлена ​​крапками
  • Приклад коду
  • Ресурси

Наочні уявлення

Я думаю, що завжди добре починати з певної візуалізації.

Ось найпоширеніші фотографії цього поняття.

Концепція - представлена ​​крапками

Видано з джерела та кредиту: Маттіа Баттістон, згідно з CC BY 4.0

Цінність, яку вона може надати

  • Ефективна стратегія тестування, яка відповідає піраміді тестування
  • Фреймворки ізольовані в окремих модулях. Коли (не якщо) ми передумаємо, нам потрібно змінитись лише в одному місці. Додаток має варіанти використання, а не прив’язаний до системи CRUD
  • Кричача архітектура, вона також кричить про призначення. Коли ви дивитесь на структуру пакету, ви відчуваєте, що робить програма, а не бачите технічні деталі
  • Вся бізнес-логіка використовується у варіанті використання, тому її легко знайти і ніде не дублювати
  • Важко зробити неправильну річ, оскільки модулі застосовують залежності компіляції. Якщо ви намагаєтеся використовувати щось, що вам не судилося, програма не компілюється
  • Він завжди готовий до розгортання, залишаючи проводку об’єкта остаточно. Або, використовуючи прапори функцій, ми отримуємо всі переваги безперервної інтеграції
  • Кілька робіт над історіями, завдяки чому різні пари можуть легко одночасно працювати над однією історією, щоб швидше її закінчити
  • Хороший моноліт з чіткими випадками використання, які можна розділити на мікросервіси пізніше, як тільки ви дізнаєтесь про них більше

Суб'єкти

  • Представляйте об’єкт домену
  • Застосовувати лише логіку, яка застосовується загалом до цілої сутності (наприклад, перевірка формату імені хосту)
  • Звичайні об’єкти: без каркасів, без анотацій

Використовуйте кейси

  • Представляйте свої ділові дії: це те, що ви можете робити з додатком. Очікуйте один варіант використання для кожної ділової дії
  • Чиста бізнес-логіка, простий код (за винятком, можливо, деяких бібліотек utils)
  • У випадку використання невідомо, хто його ініціював, і як будуть представлені результати (наприклад, може бути на веб-сторінці, або - повернуто як JSON, або просто зареєстровано тощо).
  • Викидає бізнес-винятки

Інтерфейси / адаптери

  • Отримувати та зберігати дані з багатьох джерел (до бази даних, мережевих пристроїв, файлової системи, сторонніх виробників тощо).
  • Визначте інтерфейси для даних, необхідних їм для застосування певної логіки. Один або кілька постачальників даних реалізують інтерфейс, але у випадку використання не відомо, звідки дані надходять
  • Реалізуйте інтерфейси, визначені варіантом використання
  • Існують способи взаємодії з додатком, які зазвичай включають механізм доставки (наприклад, API REST, заплановані завдання, графічний інтерфейс, інші системи)
  • Створіть варіант використання та перетворіть результат у відповідний формат для механізму доставки
  • контролер для MVC

Зовнішні інтерфейси

  • Використовуйте будь-яку структуру, яка є найбільш підходящою (вони все одно будуть ізольовані тут)

Приклад коду

Подивіться структуру на GitHub.

Перш за все, важливо розуміти, що чиста архітектура - це сукупність принципів організації. Отже, все відкрито для особистих змін, доки основні ідеї залишаються незмінними. Пов’язане сховище є форкою оригінального проекту, який навів мені цю ідею дизайну архітектури. Не соромтеся ознайомитись і з оригінальним проектом, оскільки він відображає подальші вдосконалення.

Папка webminer структурована на основні шари:

  1. суб’єктів
  2. справи_використання
  3. інтерфейси_адаптери
  4. зовнішні_інтерфейси

Він повинен відображати дуже базовий підхід до зразка дизайну.

  • Починаючи з entities, ви можете бачити, що основною моделлю цього проекту єarxiv_document
  • У наступній папці use_casesпоказано наш варіант використання, а саме запит на сторінку arxiv
  • Після цього ми проходимо по interface_adaptersпапці, яка надає адаптери для запитів процесів у програмі REST або для серіалізації
  • Кінцевим і останнім шаром є external_interfaces. Тут ми використовуємо колбовий сервер для реалізації функціональності REST

Всі ці шари залежать від основних шарів, але не навпаки.

Одне важливе зауваження: це не на 100% правильно реалізовано у сховищі.

Чому? Оскільки випадки використання насправді різні. Насправді основним варіантом використання є надання структурованих даних. Інший варіант використання - отримання даних зі сторінки arxiv.

Ви помітили цю помилку в архітектурі? Якщо так, вітаю! Ви не тільки привнесли в цю статтю достатньо цікавості, але ймовірно, ви досить добре розумієте принципи, щоб побудувати власну справу та застосувати ці концепції в дійсності!

Ви згодні? Якщо ні, то чому? Дякуємо, що прочитали мою статтю! Не соромтеся залишати будь-які відгуки!

Ресурси

Ось кілька статей, які я знайшов корисними для розуміння поняття «чистої архітектури»:

  • //8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
  • //www.codingblocks.net/podcast/clean-architecture-make-your-architecture-scream/
  • //github.com/mattia-battiston/clean-architecture-example
  • //medium.com/@tiagoflores_23976/how-choose-the-approvable-ios-architecture-mvc-mvp-mvvm-viper-or-clean-architecture-2d1e9b87d48
  • //de.slideshare.net/HimanshuDudhat1/mvp-clean-architecture
  • //softwareengineering.stackexchange.com/questions/336677/what-is-the-difference-between-mvp-and-clean-architecture
  • //інженерія.21buttons.com/clean-architecture-in-django-d326a4ab86a9
  • //gist.github.com/ygrenzinger/14812a56b9221c9feca0b3621518635b
  • //medium.freecodecamp.org/how-to-write-robust-apps-consistently-with-the-clean-architecture-9bdca93e17b
  • //marconijr.com/posts/clean-architecture-practice/

Даніель - ступінь магістра права. студент з бізнес-права, працює інженером-програмістом та організатором технічних заходів у Відні. Нині його особисті зусилля спрямовані на машинне навчання.

Підключитися:

  • LinkedIn
  • Github
  • Середній
  • Twitter
  • Steemit
  • Хешнод