Treci la conținutul principal

Un singur motiv de schimbare

Principiul responsabilității unice este litera S din SOLID, cele cinci reguli pentru proiectarea unui cod care rămâne ușor de schimbat. El spune: un tip trebuie să aibă o singură sarcină — și, prin urmare, doar un singur motiv de schimbare.

Când o clasă salvează comenzi și trimite e-mailuri, ea se schimbă atunci când se schimbă stocarea și atunci când se schimbă textul e-mailului. Două sarcini, două motive, risc dublu de a strica un lucru în timp ce îl modifici pe celălalt.

În TypeScript regula se aplică la clase, la metodele lor și la module: păstrează fiecare element concentrat pe o singură sarcină.


Prea multe sarcini într-un singur tip

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

Un tip care face totul

process() amestecă două sarcini: stocarea și notificarea. Orice schimbare la una dintre ele înseamnă editarea — și retestarea — aceleiași clase.

Prompt
Scrie un program TypeScript cu o clasă OrderProcessor a cărei metodă process face două sarcini deodată: afișează că a fost salvată comanda în stocare și afișează textul e-mailului de confirmare pentru client. Procesează o singură comandă pentru a arăta că funcționează, ca punct de plecare pentru discuția despre responsabilitatea unică.
Ieșire: program TypeScript și rezultatul capturat

O singură sarcină per tip

Soluția: o clasă pentru fiecare sarcină. OrderStore doar stochează, EmailSender doar trimite. O funcție mică le coordonează.

Rezultatul este același — dar acum fiecare parte poate fi schimbată, testată și refolosită pe cont propriu.

Împărțit în două tipuri

Același comportament, separat: depozitul nu știe nimic despre e-mailuri, expeditorul nu știe nimic despre stocare. Funcția processOrder doar le leagă.

Prompt
Refactorizează procesarea comenzilor în două clase TypeScript, fiecare cu o singură sarcină: o clasă OrderStore cu o metodă save care afișează pasul de stocare și o clasă EmailSender cu o metodă sendConfirmation care afișează e-mailul. Adaugă o funcție processOrder care le apelează pe amândouă. Procesează o singură comandă și arată același rezultat ca înainte.
Ieșire: program TypeScript și rezultatul capturat

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

Pentru că expeditorul este o clasă de sine stătătoare, el trimite și o notificare de livrare — fără niciun cod de stocare implicat. Iar depozitul arhivează o comandă fără să compună vreun e-mail. Fiecare clasă a crescut în interiorul sarcinii ei unice.

Prompt
Folosind clasele separate OrderStore și EmailSender în TypeScript, arată câștigul responsabilității unice: trimite o notificare de livrare cu același expeditor fără a atinge stocarea și arhivează o comandă cu depozitul fără a trimite niciun e-mail. Afișează fiecare acțiune.
Ieșire: program TypeScript și rezultatul capturat