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.
Ieșire: program TypeScript și rezultatul capturat
class OrderProcessor {
// process face două sarcini: stocarea ȘI notificarea.
process(order: string, customer: string): void {
console.log("se salvează comanda în stocare:", order)
console.log("se trimite e-mail către " + customer + ":")
console.log(" Mulțumim! Comanda ta", order, "a fost primită.")
}
}
const processor = new OrderProcessor()
processor.process("#1042 (2 cărți)", "ana@example.com")
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ă.
Ieșire: program TypeScript și rezultatul capturat
// OrderStore are o singură sarcină: stocarea comenzilor.
class OrderStore {
save(order: string): void {
console.log("se salvează comanda în stocare:", order)
}
}
// EmailSender are o singură sarcină: trimiterea e-mailurilor.
class EmailSender {
sendConfirmation(customer: string, order: string): void {
console.log("se trimite e-mail către " + customer + ":")
console.log(" Mulțumim! Comanda ta", order, "a fost primită.")
}
}
function processOrder(order: string, customer: string): void {
const store = new OrderStore()
const sender = new EmailSender()
store.save(order)
sender.sendConfirmation(customer, order)
}
processOrder("#1042 (2 cărți)", "ana@example.com")
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.
Ieșire: program TypeScript și rezultatul capturat
class OrderStore {
save(order: string): void {
console.log("se salvează comanda în stocare:", order)
}
archive(order: string): void {
console.log("se mută comanda în arhivă:", order)
}
}
class EmailSender {
sendConfirmation(customer: string, order: string): void {
console.log("e-mail către " + customer + ": comanda", order, "a fost primită")
}
sendShippingNotice(customer: string, order: string): void {
console.log("e-mail către " + customer + ": comanda", order, "a fost livrată")
}
}
const store = new OrderStore()
const sender = new EmailSender()
// Fiecare clasă crește în interiorul propriei sarcini.
sender.sendShippingNotice("ana@example.com", "#1042")
store.archive("#0997")