Treci la conținutul principal

Un singur motiv de schimbare

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

Când un tip salvează comenzi și trimite e-mailuri, el se schimbă când se schimbă stocarea și când se schimbă textul e-mailului. Două sarcini, două motive, de două ori mai mult risc să strici un lucru în timp ce îl modifici pe celălalt.

În Python regula se aplică claselor, metodelor lor și modulelor: păstrează fiecare dintre ele concentrată pe o singură sarcină.


Prea multe sarcini într-o singură clasă

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

O clasă care face totul

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

Prompt
Scrie un program Python cu o clasă OrderProcessor a cărei metodă process face două sarcini deodată: afișează că comanda a fost salvată în stocare și afișează un text de e-mail de confirmare pentru client. Procesează o comandă pentru a arăta că funcționează, ca punct de plecare pentru discuția despre Principiul responsabilității unice.
Ieșire: program Python complet

O singură sarcină pentru fiecare clasă

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

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

Împărțire în două clase

Același comportament, separat: stocarea nu știe nimic despre e-mailuri, expeditorul nu știe nimic despre stocare. Funcția process_order doar le conectează.

Prompt
Refactorizează procesarea comenzilor în două clase Python cu câte o singură sarcină: un OrderStore cu o metodă save care afișează pasul de stocare și un EmailSender cu o metodă send_confirmation care afișează e-mailul. Adaugă o funcție process_order care le apelează pe amândouă. Procesează o comandă și arată aceeași ieșire ca înainte.
Ieșire: program Python complet

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

Deoarece expeditorul este o clasă separată, el trimite și o notificare de expediere — fără niciun cod de stocare implicat. Iar stocarea arhivează o comandă fără să compună vreun e-mail. Fiecare clasă a crescut în interiorul singurei sale sarcini.

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