La importancia de la utilización de objetos en el diseño de un sistema
Published: 2021-09-09 03:20:59

# ¿Qué es POO?
Programación Orientada a Objetos (POO) es una forma de pensar acerca del software basado en abstracciones del mundo real, orientación por objeto, significa que diseñamos software como una colección de objetos distintos. 

![Diagrama comparando el sistema orientado a Objetos con Sistema Convencional](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f76vh11toy1yukgbe49c.png)

# Importancias de POO
Una de las características más importantes de un código que sigue POO es que logra encapsulamiento de sus funcionalidades, este es el paradigma fundamental de la POO, debido a que hace sistemas mucho más seguros, ya que separa el código que debería ser accesible para los desarrolladores que quieren implementarlo como una API, y el que no que es código interno de la clase y no debería hacerlo accesible, este modelo también ayuda para la seguridad en sí del sistema con el usuario. 


# Sobre los objetos
Cada objeto debe tener su propia identidad en un sistema bien construido, como un registro en una base de datos, siguiendo con esta comparación, se podría decir que una clase es los atributos que un registro de una tabla de base de datos debe llevar, y el objeto es el registro en sí.

Siguiendo POO, cuando un objeto se transforma, consta de interfaz, estructura de datos privada, y métodos que son los únicos que pueden transformar legítimamente la estructura de datos del, en otras palabras, no se altera directamente, se debe alterar con métodos/funciones dependiendo del lenguaje.

# Ventajas de sistemas POO
- Es de gran ayuda al dominio y entendimiento del diseño.
- Es más sencillo hacer cambios en un sistema que utiliza POO.
- Facilita la reutilización de código.
- Es más natural, además como las metodologías ágiles de Scrum, POO es un estándar en la industria.

# Metodología de diseños de sistemas
Debe considerarse que la metodología de diseño es algo bastante creativo, esta es una generalidad, pero usualmente para POO se tiene como metodología:
- Dividir el sistema en subsistemas.
- Producir un diseño OOP de los subsistemas.
- Una POO completa es tal que en la implementación solo se agregan detalles y lo más importante ya se diseñó.
  - La mayoría de las clases y sus relaciones se identifican con el diseño.


## 3 Claves para el diseño
Estas claves facilitan un diseño que sigue POO:
- Acoplamiento:
Mientras más acoplado más dependientes son los módulos entre sí y por tanto más complejo de entender el programa y más difícil de modificar. Hay de tipo Interacción y Componente.

- Cohesión:
Analiza Porque los elementos de un módulo están juntos en ese módulo, tiene tipo a nivel método, clase y herencia.

- Abierto-Cerrado: 
Se basa fuertemente en herencia para evitar la modificación de una clase, básicamente habrá módulos abiertos a la modificación y módulos cerrados a la modificación que solamente deberían ser expandidos.

# Mi metodología de diseños de sistemas
Entrando a más detalle en como personalmente diseño un sistema, usualmente escribo en alto nivel los objetos y las clases que el sistema planeara utilizar, por ejemplo recientemente he estado trabajando en un proyecto de Tic Tac Toe en JavaScript para [The Odin Project](https://www.theodinproject.com/paths/full-stack-javascript/courses/javascript/lessons/tic-tac-toe) un currículum que sigo, y escribí esta arquitectura de alto nivel de los módulos como parte de pensar como la estructura del código será en el momento de la implementación. 

![Arquitectura de alto nivel](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hlbhn4qdbnjt7ob0ey0v.png)

Usualmente sigo la metodología tradicional de dividir en subsistemas, hacer una arquitectura a alto nivel y luego implementar, en ese caso es un sistema bastante pequeño, pero en un sistema más grande lo segmento.

Nota - Este artículo fue realizado como parte de una tarea de la Universidad Francisco Gavidia tomando como fuente el siguiente video:
https://www.youtube.com/watch?v=UrvQLx73xXY