Посадіть свої контролери та моделі на дієту від Sébastien Carceles Dev on Rails Medium

Або як розділити бізнес-код та фреймворк-код за допомогою Interactors.

посадіть

Ваш проект зростає. Потроху контролери та моделі відповідають за здійснення ділових операцій. Вони брудняться. Бізнес-код поєднується з фреймворком.

Це явище, яке називається "контролери жиру/моделі жиру", і це чіткий показник того, що проект швидко стане важким у підтримці та масштабуванні.

Однак ми знаємо, що:

  • контролер повинен обробляти лише запити клієнтів
  • модель повинна дбати лише про збереження даних

Подібний код є у багатьох проектах. У наведеному вище прикладі дія створення контролера накопичує обов'язки:

  • створити інстанцію компанії
  • скористатися сторонньою службою
  • збагатити Компанію
  • керувати помилками у випадку відмови сторонньої служби або перевірки даних
  • повідомити менеджера електронною поштою у випадку успіху
  • відповісти користувачеві

Ця проблема, яка може бути узагальнена "Я бачу-проблему-але-де-я-маю-покласти-свій-код-тоді?", Вирішується кількома шаблонами проектування. Коли ми говоримо про ділові операції (а комерційна операція, як правило, складається з ряду більш-менш складних інструкцій), найпростішим та найефективнішим зразком є, мабуть, Інтерактор. Можливо, ви вже знаєте це як бізнес-об'єкти або сервісні об'єкти.

Цей шаблон пропонує виділити ділову операцію у чистому класі Ruby з двозначною назвою (тобто, що виражає добре виконану операцію). Його роль полягає у виконанні цієї ділової операції, і нічого іншого.

Ось, наприклад, ми можемо створити взаємодію на ім’я CreateCompany, роль якої, таким чином, полягає у створенні компанії. Для цього він виконуватиме перелічені вище кроки та керуватиме прикордонними справами.

Це спрощує контролер, який стає клієнтом цього класу:

Фу, ми вже краще дихаємо.

Ми могли б створити клас CreateCompany з нуля. Ми повинні визначити загальний фреймворк для всіх наших взаємодіїв, тобто загальний API, щоб усі інтерактори проекту використовували і поводились однаково.

Замість того, щоб забруднювати руки, давайте застосуємо інтерактивний камінь, тому що саме таку послугу він надає.

Існує лише одна концепція, яку слід зрозуміти, щоб використовувати інтерактор із цим самоцвітом: контекст. Контекст - це платформа для обміну між внутрішніми та зовнішніми елементами взаємодії. Він повернувся із викликом до інтерактора:

Саме він дозволяє дізнатися, чи добре пройшла страта:

Всередині інтерактора, щоб вказати на помилку та виконання переривання, просто використовуйте:

Нарешті, це дозволяє отримати дані, створені взаємодією, якщо це можливо:

З іншого боку, ми бачимо, що метод виклику - це серце взаємодії. Вона повинна виконувати вказівки, що становлять ділову операцію.

Однак його можна обрамити гачками:

  • до природного дзвінка до дзвінка
  • після дзвінка після дзвінка
  • навколо дзвонив навколо дзвінка

Ця структура дозволяє нам створити надзвичайно простий і читабельний інтерактор:

Коли ви визначаєте свої ділові операції таким чином, атомним та багаторазовим способом:

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

Очевидно, ви покращуєте ремонтопридатність коду.

А якщо ви хочете піти далі, інтерактор gem також пропонує вам спеціальний тип інтерактора: Організатор. Як випливає з назви, це дозволяє організовувати основні взаємодії, створюючи послідовність:

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

Відкрийте для себе відео реалізації цього шаблону дизайну:

ЛЕГКО та ШВИДКО вивчайте Ruby on Rails за допомогою французьких мовних ресурсів на Dev on Rails. Слідувати за вами:

Спеціальна акція для нашого курсу “Швидше вивчати рубін на рейках” на Udemy за 9,99 євро замість 49,99 євро (знижка 80%): https://www.udemy.com/apprendre-ruby-on-rails -quickly /? CouponCode = M3DIUM

За допомогою цього тренінгу вкладіть ОДИН день свого часу, щоб вивчити Ruby on Rails.

Щоб закріпитися в рамках реального проекту, в цьому курсі ми розробляємо справжній веб-додаток. Ви маєте посилання на вихідний код, якщо потрібно (опубліковано на GitHub, з однією гілкою на сеанс курсу).

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