En els temps del fum generat per les empreses d'intel·ligència artificial i els seus propagandistes, aprendre programació continua sent més necessari que mai. En aquesta quarta part del curs de programació a Python amb Linux seguirem explicant com entendre el paradigma de Programació orientada a Objectes. Recordeu que l'enllaç a la lliçó anterior és al final del post.
Encara que els agents i models d'Intel·ligència Artificial siguin capaços d'entendre i escriure codi, encara és necessari que un humà sigui capaç de donar-los instruccions detallades del que ha de fer. Per això no només cal entendre el problema que es vol resoldre amb laplicació sinó també dissenyar la solució tenint en compte les característiques del llenguatge.
A veure si deixem clar això amb una analogia.
Els obrers construeixen els gratacels. Abans de començar la construcció, però, calen arquitectes que dissenyin els plànols, enginyers que facin els càlculs estructurals i dissenyin les connexions elèctriques, de gas i aigua. Quan l'edifici estigui acabat altres persones han de determinar el disseny d'interiors. Per descomptat que potser treballadors d'experiència podrien fer una feina competent, sempre que no es presentin complicacions. Però, a la pràctica ningú vol apostar-hi.
La realitat és que el vibe coding dóna millors resultats com més detallades són les instruccions i que grans empreses han patit interrupcions de servei i esborrat bases de dades irreemplaçables per agents d'Intel·ligència Artificial massa emprenedors amb instruccions insuficients.
Curs de programació a Python amb Linux
Havíem vist als articles anteriors que el model de Programació Orientada a Objectes es basa en 4 pilars: objectes, classes, mètodes i atributs. Les classes són les plantilles on es modelen els objectes o entitats sobre les quals treballem. Aquestes plantilles indiquen els atributs que tindran els objectes mentre que els mètodes marquen el comportament de lobjecte.
Als diferents elements creats amb el motlle establert a les classes se l'anomenen instàncies. Per exemple, dins de la classe Sistemes Operatius tenim les instàncies: Linux, Windows, macOS. Ara bé, és possible que ens interessi crear classes que es diferenciïn poc de classes ja creades. No cal tornar a escriure codi ja que podem aprofitar una característica de la Programació Orientada a Objectes coneguda com a herència.
Vegem el programa següent amb una classe agregada.
El motiu pel qual no enganxo el codi directament a l'article és, com ja vaig explicar, és que la plataforma que fem servir per publicar el bloc no suporta la indentació. Aquesta pràctica consisteix a afegir espais o tabulacions (nota això o tabulacions ja que no es poden barrejar) fent que el codi sigui més fàcil d'entendre.
Amb la indentació és més fàcil estructurar el codi de manera jeràrquica diferenciant blocs del codi com bucles, funcions o classes. A més, si no indentes adequadament els programes a Python no funciona.
Ara anem a lanàlisi del programa línia per línia.
class Sistemas:
Com vam veure, aquest programa crea la plantilla sobre la qual es crearan les instàncies de sistemes operatius.
def __init__(self, nombre, version, derivada):
Aquí estem construint la classe. La primera part és un mètode automatitzat que s'utilitza cada vegada que se'n crea una. El que hi ha entre parèntesis són els paràmetres que tindrà l'objecte. Self es fa servir sempre i fa referència a l'objecte. En tots els casos va primer. Els altres paràmetres són els que establim a classes anteriors, el nom de la distribució Linux, la versió i de quina distribució és derivada.
self.nombre = nombre
self.version = version
self.derivada = derivada
Aquestes línies es fan servir per crear els atributs de l'objecte. Són variables específiques de l'objecte que actuen com a variables dins del mateix i els conservaran per quan es necessitin.
def mostrar_info(self):
Aquest mètode defineix com es mostrarà la informació dels atributs de lobjecte. El paràmetre self indica que només heu d'utilitzar els paràmetres desats com a atributs.
print(f"Nombre: {self.nombre}")
print(f"Versión: {self.version}")
print(f"Derivada: {self.derivada}")
Aquestes 3 línies indiquen que la manera de mostrar la informació dels atributs és imprimint-les en pantalla.
class SistemaConPeso(Sistemas):
Aquí és on es modifica el nostre programa respecte a l'anterior. Agreguem una nova classe estesa construïda a partir de l'anterior. Per això, al nom de la classe se li afegeix el nom de la classe anterior entre parèntesis.
def __init__(self, nombre, version, derivada, peso):
Est és constructor de la classe filla, gairebé igual al que vam veure abans però afegint el paràmetre pes.
super().__init__(nombre, version, derivada)
Per no repetir codi us indiquem al programa amb la instrucció super que la tasca d'ocupar-se de nom, versió i derivada és de la classe pare.
self.peso = peso
Encara ens havíem d'ocupar de guardar l'atribut pes.
def mostrar_info(self):
Com del que es tracta és de no escriure codi de més, en lloc de crear una nova funció que mostri la dada addicional modificarem la que ja teníem.
super().mostrar_info()
Truca al mètode de la classe pare per establir com s'han de mostrar els atributs desats en aquesta classe.
print(f"Peso: {self.peso}
Afegeix informació sobre com s'han de mostrar les dades de la classe actual.
sistema = SistemaConPeso("Linux Mint", "22", "Ubuntu", "3GB")
Crea l'objecte on es desarà la informació amb el nou paràmetre agregat i el desa a la variable sistema.
sistema.mostrar_info()
Truca al mètode encarregat de mostrar la informació
Per descomptat, aquest programa no té usos pràctics reals. No tindria cap sentit haver d'introduir els valors dels atributs al codi ja que es necessitaria un programador cada vegada que cal modificar alguna cosa. Com vam veure a l'exemple del 3 en ratlla, Python pot rebre i desar informació ingressada per l'usuari mitjançant el teclat. També podeu fer-ho llegint fitxers o interactuar amb bases de dades.
Però va tenir la seva utilitat per fer més clars conceptes claus de la programació orientada a objectes com ara classes, atributs, constructors, mètodes, herència i polimorfisme. Prometo que en el proper article acabo de parlar de la Programació Orientada a Objectes i començo a parlar de com es fan les coses a Python