Introducción
A la hora de programar, los lenguajes de programación pueden seguir distintas filosofías o paradigmas de programación, según la realidad que pretenden modelar y el tipo de problemas que pretenden solucionar.
La realidad que nos rodea está repleta de objetos como sillas, mesas, coches, entre otros, que pueden plantear problemas que pueden solucionarse mediante programación. Con el fin de representar esta realidad, el paradigma de Programación Orientada a Objetos (POO) hace especial hincapié en el diseño y la manipulación de objetos como elementos fundamentales para diseñar la solución para cualquier programa. A continuación, se describirán los principios y conceptos fundamentales de este paradigma.
Conceptos fundamentales
A hora de modelar la solución a un problema de la vida real, es necesario trabajar con objetos tan diversos como una silla o una mesa que pueden formar parte del problema. Por tanto, es necesario describir formalmente estos objetos, pero no todas sus características, sino las que son más importantes para el programa.
Abstracción
Supongamos que se quiere implementar un programa en el que intervengan personas. Lo primero que se debe hacer es modelar el concepto de Persona. Los elementos básicos que pueden definir a dicha persona pueden ser de dos tipos: atributos y acciones. Los atributos son las características o variables que la definen, como podrían ser su nombre y edad. Las acciones serían los métodos que actuarían sobre dichos atributos.
Elementos básicos
Tipo | Persona |
---|---|
Atributos | nombre edad |
Acciones | preguntarNombre cumplirAños |
Una persona puede tener más características como el sexo o el DNI. Sin embargo, haciendo un proceso de abstracción, es necesario determinar cuáles son los atributos y acciones mínimas que son necesarios para el programa a implementar. En esta figura podría verse el esquema general de un tipo Persona. Considerando esta definición o esquema general de lo que sería una Persona en un programa, en POO se correspondería con el concepto de clase.
Concepto de clase
Hasta ahora, para la gestión de datos en Python, se han usado tipos de datos primitivos como int, float o string. Estos permiten representar un tipo de dato sencillo como es el caso de un entero o una cadena de texto. Sin embargo, hay situaciones en las que es necesario modelar tipos de datos más complejos que se forman como composición de otros datos más simples. Para ello, se puede recurrir al concepto de estructuras de datos más complejas como vectores o matrices. Estas normalmente suelen ser homogéneas, es decir, contienen el mismo tipo de datos, todos los valores son numéricos o todos son cadenas de texto, por ejemplo. También, existe la posibilidad de que sean heterogéneas, es decir, pueden combinarse valores enteros, con valores reales y/o cadenas texto, por ejemplo.
Si además de trabajar sobre distintos tipos de datos, se añaden operaciones que permitieran manipular dichos datos, se estaría ante la definición de un Tipo Abstracto de Datos. Por lo tanto, el concepto de clase es un tipo de abstracto de datos, es decir, un nuevo tipo, aparte de los básicos ya conocidos como enteros o cadenas de texto.
Resumiendo, una clase representa una entidad cuyos atributos serán implementados mediante las variables de dicha clase y las acciones que pueda llevar a cabo mediante un conjunto funciones. Puede considerarse como un Tipo Abstracto de Datos, que incluye los datos o variables sobre los que operar y las acciones o métodos que se pueden realizar sobre dichos datos. Un ejemplo de implementación en Python de la clase Persona vista anteriormente sería:
#CÓDIGO FUENTE DE LA CLASE PERSONA
class Persona(object):
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def preguntarNombre(self):
return self.nombre
def cumplirAños (self):
self.edad += 1
La función preguntarNombre
permite consultar el atributo nombre de cada objeto Persona implementado, mientras que la función cumplirAños
permite actualizar el valor de la variable edad de cada objeto Persona. De esta forma se aplica el principio de encapsulación, otro de los pilares de la POO. Los datos edad
y nombre
están protegidos, no se accede a ellos directamente, solo a través de métodos especialmente diseñados para su consulta y manipulación.
Además, cabe destacar el método __init__
que recibe el nombre de método constructor o método de inicialización de atributos (edad y nombre) de un objeto.
Concepto de objeto
Así, una clase es un nuevo tipo de datos, igual que ya se había visto anteriormente el tipo boolean o int, que de forma abstracta representan un valor lógico o entero. Sin embargo, para poder operar sobre un valor concreto, era necesaria la definición de una variable. En POO existe el concepto análogo, que es el concepto de referencia a un objeto.
Razonando por analogía, la forma de crear una variable es darle un nombre y un valor inicial. La forma de crear un objeto es la misma, y consiste en darle un nombre a la referencia y asignar los valores de todos sus atributos.
nombreVariable = valorInicial
nombreReferencia = valores iniciales atributos
Como un objeto tiene varios atributos, no habrá un único valor inicial sino varios. Por esta razón, el método constructor es el encargado de inicializar todos los atributos a la vez.
pepe = Persona(nombre = “José”, edad = “20”) #inicialización de un objeto
Una clase se define solamente una vez, sin embargo, se crearán tantos objetos, es decir, tantas personas, como se requieran en un programa.
Una de las características principales de los objetos es su estado. El estado representa la situación actual de sus atributos, es decir, el valor de sus variables. El estado de un objeto es dinámico. Así, una persona hoy puede tener 20 años, y mañana 21, es decir, su estado puede evolucionar con el tiempo.
Para invocar cualquier acción o método de un objeto, en Python, se utilizará la referencia creada junto al operador punto “.”. Así, si se quiere que una persona cumpla un año más o preguntar cómo se llama, simplemente es necesario invocar los métodos de esta forma:
pepe.cumplirAños()
print(pepe.preguntarNombre())
Relaciones entre objetos/clases
Las clases y objetos no son elementos estancos que existen sin más. Al igual que en la vida real, los objetos interacción entre sí estableciéndose relaciones. Existen distintos tipos de relaciones que se puede caracterizar por distintos tipos de predicados.
1 | Relaciones de asociación
Se identifican por predicados del tipo: “tiene uno o varios...”
Representan una relación estructural entre objetos, es decir, una relación que perdura en el tiempo. Un ejemplo sería un coche tiene varias ruedas. El coche puede representarse como una clase que puede tener atributos marca y matrícula, y una rueda puede representarse como una clase con atributos como marca, presión, y diámetro.
2 | Relaciones de dependencia
Se identifican por predicados del tipo: “usa/conoce a uno o varios...”
Representan una relación temporal entre objetos. Un ejemplo sería una persona usa un bolígrafo. Al contrario que el ejemplo anterior, el coche siempre tiene ruedas, sin embargo, una persona no siempre tiene un bolígrafo consigo, simplemente lo usa cuando es necesario y pierde su relación tras usarlo.
3 | Relaciones de herencia
La herencia es otro de los pilares básicos de la POO. Las relaciones de herencia se identifican por predicados del tipo: “es un ...”
Representan relaciones en las que los objetos comparten características y comportamientos, es decir, métodos y atributos, aunque también haya ciertas diferencias entre ellos que los hacen únicos.
Un ejemplo sería las clases Animal, Pez y Perro. El pez es un tipo de animal y el perro es un tipo de animal, por lo que tendrán cosas en común, por ejemplo, ambos tienen una edad o se les puede poner un nombre. Sin embargo, hay características que no son comunes, como la forma de moverse, uno nada y el otro camina.
La herencia es, además, la base de polimorfismo, otro de los pilares de la POO. Permite, por ejemplo, que una matriz de la clase Animal pueda contener varios objetos tanto de la clase Pez o de la clase Perro.
Cada una de estas relaciones tiene su propia implementación en el lenguaje de programación en el que se trabaje.
Saber más
Python.org. Definición de clases: e.digitall.org.es/python-clases
Microsoft Company. ¿Qué es la POO?: e.digitall.org.es/poo