Treci la conținutul principal

Un singur motiv de schimbare

Principiul responsabilității unice este S-ul din SOLID, cele cinci reguli pentru proiectarea unui cod care rămâne ușor de schimbat. El spune: o clasă 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ă depozitul și atunci când se schimbă textul e-mailului. Două sarcini, două motive, risc dublu de a strica un lucru în timp ce atingi celălalt.

În PHP regula se aplică la clase, la metodele lor și la fișiere întregi: păstrează fiecare dintre ele concentrat pe o singură sarcină.


Prea multe sarcini într-o singură clasă

Acest procesor de comenzi funcționează — dar salvează 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 salvare în altă parte înseamnă să cari după tine și codul de e-mail.

O clasă care face totul

process() amestecă două sarcini: salvarea și notificarea. Orice schimbare a oricăreia dintre ele înseamnă modificarea — și retestarea — aceleiași clase.

Prompt
Scrie un script PHP cu o clasă OrderProcessor a cărei metodă process face două lucruri în același timp: afișează că comanda a fost salvată în depozit ș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 principiul responsabilității unice.
Ieșire: script PHP

O singură sarcină pentru fiecare clasă

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

Ieșirea este aceeași — dar acum fiecare parte poate fi schimbată, testată și refolosită separat.

Împărțire în două clase

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

Prompt
Refactorizează procesarea comenzilor în două clase PHP cu câte o singură sarcină fiecare: o clasă OrderStore cu o metodă save care afișează pasul de salvare ș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 comandă și arată aceeași ieșire ca înainte.
Ieșire: script PHP

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

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

Prompt
Folosind clasele separate OrderStore și EmailSender în PHP, arată câștigul adus de responsabilitatea unică: trimite o notificare de expediere cu același expeditor, fără a atinge depozitul, și arhivează o comandă cu ajutorul depozitului, fără a trimite niciun e-mail. Afișează fiecare acțiune.
Ieșire: script PHP