Puneți controlerele și modelele pe o dietă de Sébastien Carceles Dev on Rails Medium

Sau cum să decuplați codul de afaceri și codul cadru folosind Interactors.

puneți

Proiectul tău este în creștere. Încetul cu încetul, controlorii și modelele sunt responsabile de desfășurarea operațiunilor comerciale. Se murdăresc. Codul de afaceri se amestecă cu codul cadru.

Acesta este un fenomen numit „controlori de grăsime/modele de grăsime” și este un indicator clar că proiectul va deveni rapid dificil de întreținut și amplificat.

Cu toate acestea, știm că:

  • operatorul ar trebui să proceseze numai solicitările clienților
  • modelul trebuie să aibă grijă doar de persistența datelor

Cod similar se găsește în multe proiecte. În exemplul de mai sus, acțiunea de creare a controlerului acumulează responsabilitățile:

  • instituie o companie
  • utilizați un serviciu terță parte
  • îmbogăți Compania
  • gestionați erorile în caz de eșec al serviciului terță parte sau validarea datelor
  • notifică un manager prin e-mail în caz de succes
  • răspunde la utilizator

Această problemă, care poate fi rezumată prin „Văd-problema-dar-unde-am-să-pun-codul-meu-atunci?”, Este abordată de mai multe modele de proiectare. Când vorbim despre operațiuni comerciale (și o operațiune comercială este alcătuită de obicei dintr-o serie de instrucțiuni mai mult sau mai puțin complexe), cel mai simplu și mai eficient model este probabil Interactorul. Este posibil să îl cunoașteți deja sub numele de Business Objects sau Service Objects.

Acest model propune izolarea unei operațiuni de afaceri într-o clasă Ruby pură, cu un nume echivoc (adică care exprimă operația efectuată bine). Rolul său este de a efectua această operațiune de afaceri și nimic altceva.

Aici, de exemplu, putem crea un interactor numit CreateCompany, al cărui rol este de a crea o companie. Pentru a face acest lucru, va efectua pașii enumerați mai sus și va gestiona cazurile limită.

Acest lucru simplifică controlerul, care devine clientul acestei clase:

Phew, deja respirăm mai bine.

Am putea crea clasa CreateCompany de la zero. Ar trebui să definim un cadru comun pentru toți interacționatorii noștri, adică un API comun, astfel încât toți interacționarii proiectului să se folosească și să se comporte în același mod.