Treci la conținutul principal

Un singur motiv de schimbare

Principiul responsabilității unice (Single Responsibility Principle) este S-ul din SOLID, cele cinci reguli pentru a proiecta cod care rămâne ușor de schimbat. El spune: un tip trebuie să aibă o singură sarcină — și deci un singur motiv de schimbare.

Când un tip salvează comenzi și trimite emailuri, el se schimbă atunci când se schimbă stocarea și atunci când se schimbă textul emailului. Două sarcini, două motive, risc dublu de a strica un lucru în timp ce îl atingi pe celălalt.

În Go regula se aplică structurilor, metodelor lor și pachetelor: păstrează fiecare parte concentrată pe o singură sarcină.


Prea multe sarcini într-un singur tip

Acest procesator de comenzi funcționează — dar el stochează comanda, scrie textul confirmării și îl „trimite”, toate într-o singură metodă. Testarea separată a textului emailului este imposibilă, iar refolosirea părții de stocare în altă parte înseamnă să cari după tine și codul de email.

Un singur tip care face totul

Process() amestecă două sarcini: stocarea și notificarea. Orice schimbare la oricare dintre ele înseamnă modificarea — și retestarea — aceluiași tip.

Prompt
Scrie un program Go cu o structură OrderProcessor a cărei metodă Process face două lucruri deodată: afișează că a fost salvată comanda în stocare și afișează textul emailului de confirmare pentru client. Procesează o comandă ca să arăți că funcționează, ca punct de plecare pentru discuția despre Single Responsibility.
Ieșire: program Go și rezultatul capturat

O singură sarcină pentru fiecare tip

Soluția: câte un tip pentru fiecare sarcină. OrderStore doar stochează, EmailSender doar trimite. O funcție mică le coordonează.

Rezultatul afișat este același — dar acum fiecare parte poate fi schimbată, testată și refolosită separat.

Împărțit în două tipuri

Același comportament, dar separat: store-ul nu știe nimic despre emailuri, sender-ul nu știe nimic despre stocare. Funcția processOrder doar le leagă între ele.

Prompt
Refactorizează procesarea comenzilor în două tipuri Go, cu câte o singură sarcină fiecare: un OrderStore cu o metodă Save care afișează pasul de stocare și un EmailSender cu o metodă SendConfirmation care afișează emailul. Adaugă o funcție processOrder care le apelează pe amândouă. Procesează o comandă și arată aceeași ieșire ca înainte.
Ieșire: program Go și rezultatul capturat

Câștigul: refolosire fără teamă

Fiindcă sender-ul este un tip de sine stătător, el trimite și o notificare de expediere — fără niciun cod de stocare implicat. Iar store-ul arhivează o comandă fără să compună vreun email. Fiecare tip a crescut în interiorul sarcinii sale unice.

Prompt
Folosind tipurile separate OrderStore și EmailSender în Go, arată câștigul principiului responsabilității unice: trimite o notificare de expediere cu același sender fără să atingi stocarea și arhivează o comandă cu store-ul fără să trimiți niciun email. Afișează fiecare acțiune.
Ieșire: program Go și rezultatul capturat