De POO a SOLID explicado con Pokémon - Los cuatro principios de POO
Tags: oop, javascript, solid
Published: 2020-08-26 21:40:13

###### Guía para entender los cuatro principios de POO.
#### JavaScript - Los cuatro principios de POO

En un post anterior hablamos sobre el paradigma de **[POO](https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f)** aplicándolo a **JavaScript**, de esta manera dimos el primer paso para poder comprender **SOLID**.

Con anterior hablamos sobre el paradigma de **[POO](https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f)** aplicándolo a **JavaScript**, de esta manera dimos el primer paso para poder comprender **SOLID**. Si te perdiste el post anterior puedes consultarlo en el menú de arriba.

Retomando nuestra aventura **Pokémon** procederemos a entender los principios de **[POO](https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f)**, para entrar en materia nos preguntaremos lo siguiente.

> **🔖 Nota:** Todos los ejemplos de código utilizados están basados en **JavaScript** usando las especificaciones más actuales hasta el momento.

***

## 🤔 ¿Cuáles son los principios de POO?

Todo lo que es **[POO](https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f)** es posible simplificarlos en cuatro grandes principios que permiten fundamentar dicho paradigma.

![Fig. 1: Los cuatro principios de POO.](https://cdn-images-1.medium.com/max/1600/1*hXFebLehdhsUEP94jXIh7Q.png)


## 📕 Encapsulamiento

Su propósito es que nadie se meta donde no le llaman, cada objeto es responsable de su propia información, estados los cuales solo pueden ser modificados por sus propios métodos, por lo cual sus atributos internos no tienen que ser accesibles desde fuera.

> **🔖 Nota:** Cuando un atributo de un **objeto** no es accesible desde fuera en **[POO](https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f)** esto se conoce como privacidad.

Utilizando como base la clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)** que creamos en un **[POST](https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f)** anterior procederemos a implementar el principio de encapsulamiento.

{% gist https://gist.github.com/konami12/880e68a7d31d402044e9d608d27e27e3 %}


**¡Genial!** nuestra clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)** está utilizando **privacidad** para que algunos de sus **atributos** no san accesibles desde fuera y así es cómo funciona el principio de **encapsulamiento😱**.

> **🔖 Nota:** Todas las **métodos** y **atributos** que no tienen el # son por defecto públicos, esto quiere decir que pueden ser consultados desde afuera de la **clase**.

***

## 📗 Abstracción

Hace pensar que los **objetos** son similares a cajas negras, ya que sabremos cómo interactuar con ellos, pero no conocemos su comportamiento interno, esto trae como consecuencia la capacidad de modificar el comportamiento de un objeto sin afectar a quienes lo utilicen.

Siguiendo con el tema de **Pokémon**, imaginemos el funcionamiento de una **Pokédex** el cual está **abstraído** del usuario, pues basta solamente con saber cómo interactuar con él para realizar ciertas acciones, pero no tenemos ni la remota idea de cómo funciona internamente.

{% gist 
 https://gist.github.com/konami12/334d521826f3e358d895b2f263d5c6ac %}

**¡Genial!** ya contamos con una nueva clase llamada **Pokédex** con la que podemos consultar la información de un **Pokémon**, como podemos apreciar en el ejemplo sin importar el origen de la **data** el método **getInfo** siempre muestra la información solicitada, por lo que la manera de interactuar con dicho método no cambia solo la clase padre es la que conoce sus cambios  y es así como funciona el principio de **Abstracción**.

***

## 📘 Herencia

Es la capacidad que permite crear **objetos** a partir de otros ya existentes, los **métodos** y **atributos** del **objeto** padre (**Super Clase**) pasan a ser parte de los **objetos** hijos (**Sub-Clase**) los cuales son creados a partir de la **Super Clase**, la herencia se basa en la reutilización de código.

Imaginemos que se necesita crear un nuevo **objeto** que permita definir a **Pokémons** de **Tipo Fuego**, pero este nuevo **objeto** tiene que contar con las características de la clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)**.

{% gist 
 https://gist.github.com/konami12/13becf910978de7bcc60af4028e56ab5
 %}

**¡Genial!** la clase **TypeFire** entra a juego nos permite crear **Pokémons** de tipo fuego y al mismo tiempo cuenta con todos los métodos y propiedades de la clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)**, además estamos reutilizando código😱 y así es cómo funciona el principio de **Herencia**.

> **🔖 Nota:** Recordemos que la clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)** cuenta con atributos privados los cuales no pueden ser consultados directamente por la clase **TypeFire** pero puede consultarlos gracias a los métodos que tienen acceso a dichos a tributos.

***

## 📙 Polimorfismo

Es la capacidad que tiene un **objeto** de presentar diferentes comportamientos al momento de realizar una acción, el **polimorfismo** se presenta cuando se aplica el principio de **Herencia**.

Utilizaremos nuevamente la clase **TypeFire** ya que con anterioridad le aplicamos el principio de **Herencia**, la clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)** tiene un método **attack** con un comportamiento establecido, pero al utilizarlo dentro de la clase **TypeFire** su comportamiento tiene que cambiar.


{% gist https://gist.github.com/konami12/0558683cccdef34ac5663a0e89b1b15a %}

**¡Genial!** la clase **TypeFire** define un nuevo comportamiento para el método **attack** proveniente de la clase **[Pokémon](https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375)**, de esta manera las dos clases comparten el método y cada una define un comportamiento diferente y así es como funciona el **Polimorfismo**.


> **🔖 Nota:** Al igual que la herencia no podemos tener accesos a métodos y atributos privados.

***

## 🤔 Conclusiones

Aprendimos los cuatro principios que le dan fundamento al **[Paradigma de POO](https://medium.com/@jmz12/javascript-el-paradigma-de-poo-b04d19b6322c)**, sabes cómo aplicarlos en nuestros desarrollos, es importante saber que JavaScript no cuenta con una implementación al 100 del paradigma de **[Paradigma de POO](https://medium.com/@jmz12/javascript-el-paradigma-de-poo-b04d19b6322c)** pero parece que busca dar el paso.

Hemos dado un paso más para poder entender los cinco principios de **SOLID** ya que hasta este punto podríamos decir que entendemos las bases de **POO**, por lo que en el siguiente Articulo hablaremos de **SOLID😱**.