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 este editat 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 Python pentru asta este protocolul: o clasă construită pe typing.Protocol care enumeră metodele pe care trebuie să le aibă un tip. Orice clasă cu metode potrivite respectă automat protocolul — nu se declară nimic — așa că o funcție care depinde de un protocol nu trebuie modificată niciodată când se adaugă o clasă nouă.


Instrucțiunea match care crește la nesfârșit

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

Un match pe tipul formei

total_area 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 Python cu o funcție total_area care calculează aria combinată a formelor folosind un match pe un câmp kind (cercul și dreptunghiul stocate într-o singură clasă de date (dataclass) cu width, height, radius). Afișează aria totală a câtorva forme, ca punct de plecare greșit pentru principiul deschis/închis.
Ieșire: program Python complet

Extindere printr-un protocol

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

Acum privește principiul în acțiune: o formă complet nouă, Triangle, se adaugă, iar total_area nu este atinsă. Extindere fără modificare.

Fiecare formă își calculează propria arie

total_area depinde doar de protocolul Shape. match a dispărut — și odată cu el, nevoia de a mai edita vreodată această funcție.

Prompt
Refactorizează formele în Python în stilul deschis/închis: un protocol Shape cu o metodă area, clase de date (dataclass) separate Circle și Rectangle care își calculează fiecare propria arie și o funcție total_area care adună orice listă de forme fără match. Afișează totalul.
Ieșire: program Python complet

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

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

Prompt
Extinde exemplul Python cu protocolul Shape cu o clasă de date (dataclass) complet nouă, Triangle, care implementează area, fără a modifica total_area, Circle sau Rectangle. Afișează noul total, inclusiv triunghiul, pentru a arăta extinderea fără modificare.
Ieșire: program Python complet
Add a new shape, touch nothing