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.
Ieșire: script PHP
<?php
class OrderProcessor {
// process face două lucruri: salvează ȘI notifică.
public function process(string $order, string $customer): void {
echo "salvez comanda în depozit: $order\n";
echo "trimit e-mail către $customer:\n";
echo " Mulțumim! Comanda ta $order a fost primită.\n";
}
}
$p = new OrderProcessor();
$p->process("#1042 (2 books)", "[email protected]");
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ă.
Ieșire: script PHP
<?php
// OrderStore are o singură sarcină: salvarea comenzilor.
class OrderStore {
public function save(string $order): void {
echo "salvez comanda în depozit: $order\n";
}
}
// EmailSender are o singură sarcină: trimiterea e-mailurilor.
class EmailSender {
public function sendConfirmation(string $customer, string $order): void {
echo "trimit e-mail către $customer:\n";
echo " Mulțumim! Comanda ta $order a fost primită.\n";
}
}
function processOrder(string $order, string $customer): void {
$store = new OrderStore();
$sender = new EmailSender();
$store->save($order);
$sender->sendConfirmation($customer, $order);
}
processOrder("#1042 (2 books)", "[email protected]");
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.
Ieșire: script PHP
<?php
class OrderStore {
public function save(string $order): void {
echo "salvez comanda în depozit: $order\n";
}
public function archive(string $order): void {
echo "mut comanda în arhivă: $order\n";
}
}
class EmailSender {
public function sendConfirmation(string $customer, string $order): void {
echo "e-mail către $customer: comanda $order a fost primită\n";
}
public function sendShippingNotice(string $customer, string $order): void {
echo "e-mail către $customer: comanda $order a fost expediată\n";
}
}
$store = new OrderStore();
$sender = new EmailSender();
// Fiecare clasă crește în interiorul propriei sarcini.
$sender->sendShippingNotice("[email protected]", "#1042");
$store->archive("#0997");