Treci la conținutul principal

Deschis pentru extindere, închis pentru modificare

Principiul Deschis/închis 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 editare a unui cod funcțional este o șansă 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.

Instrumentul PHP pentru asta este interfața: o funcție care depinde de o interfață nu are nevoie niciodată de modificări atunci când o clasă nouă o implementează.


Switch-ul care nu se oprește niciodată din creștere

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

Un switch pe felul formei

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

Prompt
Scrie un script PHP cu o funcție totalArea care calculează aria combinată a unor forme folosind un switch pe o proprietate kind (circle și rectangle stocate într-o singură clasă cu width, height, radius). Afișează aria totală a câtorva forme, ca punct de plecare greșit pentru principiul Deschis/închis.
Ieșire: script PHP

Extinde prin intermediul unei interfețe

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

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

Fiecare formă își calculează propria arie

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

Prompt
Refactorizează formele în PHP în stilul Deschis/închis: 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ă oricâte obiecte Shape fără switch. Afișează totalul.
Ieșire: script PHP

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

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

Prompt
Extinde exemplul PHP cu interfața Shape printr-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: script PHP
Add a new shape, touch nothing