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, care funcționează și este testat, nu se editează pentru asta.

Fiecare modificare adusă codului care funcționează 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.

Unealta lui Go pentru asta este interfața: o funcție care depinde de o interfață nu trebuie schimbată niciodată atunci când un tip nou o implementează.


Instrucțiunea switch care nu se mai oprește din creștere

Acest calculator de arii folosește un switch pe felul formei. Funcționează — până sosește 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 felul formei

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

Prompt
Scrie un program Go cu o funcție totalArea care calculează aria combinată a formelor folosind un switch pe un câmp Kind (cerc și dreptunghi stocate într-o singură structură cu lățime, înălțime, rază). Afișează aria totală a câtorva forme, ca punct de plecare greșit pentru principiul Open/Closed.
Ieșire: program Go și rezultatul capturat

Extinderea 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 sunt formele.

Acum privește principiul în acțiune: 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 Go în stilul Open/Closed: o interfață Shape cu o metodă Area, tipuri separate Circle și Rectangle care își calculează fiecare propria arie și o funcție totalArea care însumează orice slice de Shape fără switch. Afișează totalul.
Ieșire: program Go și rezultatul capturat

Adaugi o formă nouă, nu atingi nimic

Triangle este cod pur nou: un tip și metoda sa Area(). totalArea, Circle și Rectangle sunt exact cum erau — deschise pentru extindere, închise pentru modificare.

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