El desenvolupament de software és una disciplina que combina creativitat, lògica i una adaptació contínua a noves tecnologies i metodologies. Entre aquestes, la Programació Orientada a Objectes (POO) destaca com una base essencial per construir software robust, mantenible i escalable.
En aquest article aprofundirem en com la integració conscient d’aquest paradigma contribueix a les bones pràctiques en el desenvolupament de software.
Programació Orientada a Objectes (POO)
La POO és un paradigma de programació que utilitza objectes i classes com a elements fonamentals per a la construcció de software. A més, promou una estructura de codi més organitzada i reutilitzable, facilitant la gestió de projectes complexos. Adoptar la POO condueix a un codi modular, on els canvis en una part del sistema tenen un impacte mínim en la resta, millorant la mantenibilitat i l’escalabilitat.

Els 4 pilars de la Programació Orientada a Objectes
- Abstracció: Facilita la comprensió i la reducció de la complexitat en centrar-se en els aspectes essencials dels objectes, separant-los dels detalls menys rellevants.
- Encapsulament: Oculta els detalls interns i només exposa les característiques i comportaments necessaris d’un objecte, protegint l’estat intern contra accessos no autoritzats.
- Herència: Permet crear noves classes (subclasses) a partir de classes existents (superclasses), evitant la duplicació de codi.
- Polimorfisme: Permet que objectes de diferents classes responguin de manera diferent a les mateixes operacions.
Abstracció
En la POO, l’abstracció s’utilitza per crear models simplificats de sistemes reals o conceptuals. Això permet definir classes que representen tipus d’objectes abstractes amb propietats i comportaments comuns, sense especificar tots els detalls particulars.
Per exemple, en un sistema de gestió de vehicles per a una empresa de lloguer, pots tenir una abstracció “Vehicle” que engloba característiques i comportaments comuns a tots els vehicles:
- Abstracció: Vehícle.
- Atributs essencials: marca, model, color, tipus de combustible, matrícula
- Comportaments (mètodes): arrencar(), aturar(), aceleracr(), frenar().
Aquesta abstracció ignora els detalls específics de cada tipus de vehicle, permetent tractar-los de manera uniforme i simplificant el desenvolupament.
Encapsulament
L’encapsulament fa referència a la pràctica d’amagar els detalls interns de la implementació d’una classe i exposar només les característiques i comportaments necessaris d’un objecte cap a l’exterior. Aquest concepte és essencial per aconseguir un alt grau de seguretat i protecció en les interaccions amb els objectes, permetent que els desenvolupadors limitin l’accés als estats interns dels objectes i controlin com s’hi accedeix o es modifica la informació.
En essència, l’encapsulament permet a una classe agrupar les seves variables (atributs) i funcions (mètodes) relacionades, mantenint amagats alguns detalls interns i exposant només allò necessari per a l’ús extern. Això s’aconsegueix mitjançant l’ús de modificadors d’accés com privat, protegit i públic, que defineixen la visibilitat dels membres d’una classe.
Per exemple, en una classe CompteBancari, podríem tenir atributs privats com saldo i mètodes públics com depositar() i retirar(). L’atribut saldo no és accessible directament des de fora de la classe, protegint així la integritat de les dades. Només es pot interactuar amb ell a través dels mètodes depositar() i retirar(), que implementen les regles necessàries per assegurar que el saldo mai sigui negatiu.
A continuació, es mostra un exemple en Python de la classe CuentaBancaria (exemple en castellà):

En aquest exemple, el balanç del compte està encapsulat i protegit de modificacions i accessos directes. Els mètodes depositar()
i retirar()
ofereixen una interfície controlada per canviar el balanç, mentre que obtener_balance()
permet accedir-hi sense modificar-lo.
Herència
L’herència és un concepte clau en la programació orientada a objectes (POO) que permet que una classe (anomenada subclasse o classe derivada) hereti atributs i mètodes d’una altra classe (anomenada superclasse o classe base). Aquest mecanisme facilita la reutilització de codi i la creació de relacions jeràrquiques entre classes, permetent als desenvolupadors construir estructures d’objectes complexes de manera eficient i organitzada.
Així doncs, l’herència promou el principi de “no repetir codi”, ja que permet que les noves classes adoptin característiques existents d’altres classes sense haver de reescriure-les. A més, ofereix una forma d’implementar polimorfisme i especialització a través de la sobrescriptura de mètodes, on les subclasses poden modificar o ampliar els comportaments heretats segons calgui.
Per exemple, imagina una jerarquia de classes on tens una superclasse Vehículo amb propietats generals com marca, model i mètodes com arrancar() o detener(). A partir d’aquesta classe base, podries derivar subclasses més específiques com Coche, Motocicleta o Camión, cadascuna amb atributs i comportaments addicionals propis d’aquell tipus de vehicle, però compartint també els atributs i comportaments comuns definits a la superclasse Vehículo.
Aquest exemple, on estenem l’abstracció Vehículo per crear subclasses com Coche, està definit en Python (exemple en castellà) de la següent manera:

Com es pot observar, aquí Coche hereta de Vehículo i afegeix un nou atribut (num_puertas). A més, pot sobrescriure mètodes (com arrancar()
) per comportar-se de manera específica.
Polimorfisme
Quan parlem de polimorfisme, ens referim a la capacitat d’un objecte per assumir diverses formes. En el context de la POO, això significa que un objecte d’una superclasse pot representar-se com un objecte d’una subclasse, i que els mètodes amb el mateix nom poden comportar-se de manera diferent segons l’objecte que els invoqui. Això permet als programadors utilitzar una interfície comuna per a diferents tipus subjacents d’objectes, augmentant la flexibilitat i la capacitat de reutilització del codi.
Hi ha principalment dos tipus de polimorfisme en la POO: el polimorfisme en temps d’execució (també conegut com polimorfisme dinàmic) i el polimorfisme en temps de compilació (polimorfisme estàtic).
El polimorfisme en temps d’execució s’aconsegueix mitjançant l’ús de la herència i la sobrescriptura de mètodes (per exemple, quan una classe derivada redefineix un mètode de la seva classe base), mentre que el polimorfisme en temps de compilació s’aconsegueix mitjançant la sobrecàrrega de mètodes i operadors.
Vegem un exemple pràctic en Python on s’utilitza el polimorfisme per interactuar amb diferents tipus de vehicles (exemple en castellà):

Aquí, probar_vehiculo és una funció que pot acceptar qualsevol objecte que sigui un subtipus de Vehículo. Depenent del tipus d’objecte passat a la funció, s’invocarà el mètode arrancar() corresponent, demostrant polimorfisme.
Conclusions
La Programació Orientada a Objectes (POO) ha demostrat ser un enfocament molt valuós en el desenvolupament de software, oferint una estructura que no només reflecteix el món real de manera més natural, sinó que també facilita la creació, manteniment i escalabilitat d’aplicacions complexes. A través dels seus quatre pilars, la POO permet als desenvolupadors dissenyar sistemes robustos, flexibles i reutilitzables.
Adoptar la POO permet als equips de desenvolupament millorar significativament la qualitat i la vida útil dels seus sistemes de software. Aquest enfocament no només organitza millor el codi i en facilita la comprensió i la depuració, sinó que també fa que el procés d’adaptació a nous requisits sigui més senzill i menys propens a errors.
Amb el seu èmfasi en la modularitat, la reutilització i l’abstracció, la POO es manté com una metodologia essencial per construir software d’alta qualitat, mantenint alhora l’agilitat necessària per adaptar-se a un món tecnològic en constant evolució.
Vols continuar llegint sobre programació? No et perdis aquests recursos!
- El paradigma de la programació funcional: principis, avantatges i aplicacions
- Bones pràctiques en el desenvolupament de software
- Guia per trobar el llenguatge de programació ideal
- Com triar el millor repositori de codi per al teu projecte
- Analista de dades: habilitats i eines imprescindibles per triomfar en l’anàlisi de dades
A Block&Capital, especialistes en selecció de personal, treballem per crear oportunitats on el creixement i l’èxit siguin a l’abast de tothom. Si estàs preparat per fer un pas endavant en la teva carrera professional, no dubtis a contactar amb nosaltres.
Últims posts