POO | ¿Qué es la abstracción y como utilizarla?

arte abstracto
En este artículo desarrollaremos código
Puedes consultar el código de esta practica en el siguiente repositorio de github.

¿Qué es la abstracción?

La abstracción es la acción de aislar los componentes esenciales de un objeto de aquellos que no lo son. En programación orientada a objetos, esto nos permitirá reducir la complejidad de nuestro código para hacerlo más mantenible y fácil de entender. Pero sobre todo nos dará la capacidad de reutilizar código. Con lo que ahorraremos mucho tiempo a la hora de desarrollar.

Cómo sabemos. Para crear un objeto debemos de realizar una clase en la que declararemos los atributos y métodos que lo definan. Sin embargo debemos de tener en cuenta si estos son propiamente características unicas del objeto o por el contrario, son características que pueden definir perfectamente a otros objetos.

Si los atributos y métodos pueden definir a otros objetos. Entonces no deberían ser incluidos directamente en la clase de nuestro objeto si no que deberemos definirlos en una clase abstracta.

Vayamos con el ejemplo.

 

Ejemplo

Supongamos que queremos definir cuatro animales. Un gato, un perro, un pato, un delfín. Sin aplicar la abstracción, nuestras clases en un diagrama UML quedarían así:

uml animales sin abstraccion

Como podemos observar en este modelo, estamos repitiendo atributos y métodos que bien pudimos haber heredado de una clase abstracta sin tener que escribirlos directamente en nuestras clases. Esto afecta la manutención y calidad de nuestro código, pues como sabemos. Entre más complejo sea un sistema, más propenso se volverá a fallar.

Entonces aplicaremos la abstracción a nuestro modelo definiendo la clase abstracta Animal.

uml abstraccion animal

En Python, implementaremos nuestra clase abstracta Animal de la siguiente manera:

				
					from abc import ABC, abstractmethod

class Animal(ABC):
    
    __nombre = None
    __patas = None
    __sonido = None

    @abstractmethod
    def presentarse(self):
        pass

    @abstractmethod
    def emitirSonido(self):
        pass
    
    @abstractmethod
    def comer():
        pass

    @abstractmethod
    def caminar():
        pass
    
    @abstractmethod
    def volar():
        pass
   
    @abstractmethod
    def nadar():
        pass
				
			

Escribimos las clases hijas de Animal. Aquí solo pondré el ejemplo de la clase Perro. Las otras tres clases se implementan de manera similar.

				
					class Perro(Animal):

    Animal.__nombre = 'Perro'
    Animal.__patas = 4
    Animal.__sonido = 'Guau guau'

    def presentarse(self):
        print("Hola. Soy un " + self.__nombre)

    def emitirSonido(self):
        print(self.__sonido)

    def comer(self):
        print(self.__nombre + ': ¡Yumi! Estoy comiendo :D')

    def caminar(self):
        print(self.__nombre + ': Estoy caminando.')

    def volar(self):
        print(self.__nombre + ': Estoy volando.')

    def nadar(self):
        print(self.__nombre + ': Estoy nadando.')

				
			

Instanciamos a nuestro animal. En este caso al perro. Este luego se presentara con nosotros.

				
					animal = Perro()
animal.presentarse()
# Hola. Soy un Perro.
				
			

 

Principio de segregación de interfaces

Sin embargo el modelo anterior tampoco es correcto. Si somos observadores veremos que nuestra clase Perro está forzado a implementar métodos que no le corresponden.

				
					animal = Perro()
animal.volar()
# Perro: Estoy volando.
				
			

perro volador

El principio de segregación de interfaces es una de las cinco recomendaciones para la programación orientada a objetos conocidas como SOLID.

Este principio nos indica que una clase no debe depender nunca de métodos que no utiliza. Para esto, es mejor segregar un clase general en múltiples clases con un propósito más específico.

Por lo que deberemos de modificar de nuevo nuestro modelo. Lo haremos de la siguiente manera.

 

uml solid

 

De esta manera evitamos darle propiedades a un objeto que no le corresponden.

 

Conclusión

Con esto espero que haya quedado claro lo que es la abstracción en la programación orientada a objetos.  Dejo a continuación el acceso al repositorio de github en el que podrás revisar estos ejemplos. El nombre del archivo es abstraction.py

Enlace al repositorio

Compartir:
Share on facebook
Facebook
Share on twitter
Twitter
Share on pinterest
Pinterest
Share on linkedin
LinkedIn
Entradas relacionadas
pastel herencia programacion
POO | Entendiendo la herencia de clases

En este artículo desarrollaremos código Puedes consultar el código de esta practica en el siguiente repositorio de github. Generalmente cuando pensamos en herencia. Pensamos en