Treci la conținutul principal

Deschis pentru extindere, închis pentru modificare

Principiul Open/Closed spune: codul trebuie să fie deschis pentru extindere — se poate adăuga comportament nou — dar închis pentru modificare — codul existent, funcțional și testat nu se editează pentru asta.

Fiecare modificare a unui cod care funcționează este o ocazie de a-l strica. Când adăugarea unei funcționalități înseamnă doar adăugarea de cod nou, codul vechi rămâne verificat.

Unealta TypeScript pentru asta este interfața: o funcție care depinde de o interfață nu trebuie schimbată niciodată când o clasă nouă o implementează.


Switch-ul care crește la nesfârșit

Acest calculator de arii folosește un switch pe tipul formei. Funcționează — până apare următoarea formă. Triunghi? Editezi switch-ul. Pentagon? Îl editezi din nou. Funcția nu este niciodată terminată, iar fiecare modificare pune în pericol formele care funcționau deja.

Un switch pe tipul formei

totalArea trebuie să cunoască fiecare tip de formă. Adăugarea uneia înseamnă modificarea acestei funcții testate — exact lucrul împotriva căruia avertizează principiul.

Prompt
Scrie un program TypeScript cu o funcție totalArea care calculează aria combinată a formelor folosind un switch pe un câmp kind (cerc și dreptunghi stocate într-un singur tip de obiect cu width, height și radius). Afișează aria totală a câtorva forme cu două zecimale, ca punct de plecare greșit pentru principiul Open/Closed.
Ieșire: program TypeScript și rezultatul capturat

Extinde printr-o interfață

Soluția: fiecare formă își cunoaște propria arie. Interfața Shape cere o singură metodă, area(), iar totalArea doar adună ce primește — nu îi mai pasă ce forme sunt.

Acum privește principiul la lucru: un Triangle complet nou se conectează, iar totalArea nu este atinsă. Extindere fără modificare.

Fiecare formă își calculează propria arie

totalArea depinde doar de interfața Shape. Switch-ul a dispărut — și odată cu el, nevoia de a mai edita vreodată această funcție.

Prompt
Refactorizează formele în TypeScript în stilul Open/Closed: o interfață Shape cu o metodă area, clase separate Circle și Rectangle care își calculează fiecare propria arie și o funcție totalArea care însumează orice tablou de Shape fără switch. Afișează totalul cu două zecimale.
Ieșire: program TypeScript și rezultatul capturat

Adaugă o formă nouă, fără să atingi nimic

Triangle este cod pur nou: o clasă și metoda ei area(). totalArea, Circle și Rectangle sunt exact cum erau — deschise pentru extindere, închise pentru modificare.

Prompt
Extinde exemplul cu interfața Shape din TypeScript cu o clasă Triangle complet nouă care implementează area, fără a modifica totalArea, Circle sau Rectangle. Afișează noul total, inclusiv triunghiul, pentru a arăta extinderea fără modificare.
Ieșire: program TypeScript și rezultatul capturat
Add a new shape, touch nothing