-
Notifications
You must be signed in to change notification settings - Fork 0
Objetos vs Estructuras de Datos
Este tema está redactado en base al post del tío Bob llamado: Classes vs. Data Structures (2019) y también en base a su libro Clean Code (2008) en el capítulo Objetos y estructuras de datos.
Aquí quiero indicar que es importante conocer y diferenciar el propósito entre un objeto y una estructura de datos. Para facilitar esto, utilizaremos el siguiente diagrama en el cual representamos formas geométricas tanto en el contexto de los objetos como en el contexto de las estructuras de datos:
Objetos y Estructuras de Datos intentando representar lo mismo |
---|
-
Objetos: De este lado, notamos que las implementaciones mantienen sus atributos como privados. Aquí es fácil agregar nuevos tipos sin tener que modificar las funciones existentes. Por ejemplo, si deseamos agregar la figura Triángulo, solo tendríamos que implementarla de Shape, y los datos encapsulados serían la base y la altura necesarios para calcular el área. Sin embargo, es difícil agregar nuevas funciones a un conjunto existente; por ejemplo, si quisiéramos añadir la función
perimeter()
en Shape, tendríamos que realizar cambios en cada una de las figuras existentes para implementar dicha función. -
Estructuras de Datos: De este lado, resulta difícil agregar nuevos tipos de figuras utilizando solo estructuras de datos, ya que implicaría realizar cambios en cada función correspondiente. Por ejemplo, si deseamos agregar un nuevo tipo de figura, como un Triángulo, sería necesario modificar la función
area()
. No obstante, resulta sencillo agregar nuevas funciones; por ejemplo, si quisiéramos incorporar la funciónperimeter()
, simplemente lo añadiríamos a Shapes, sin generar mayores inconvenientes.
Entonces conforme a lo anterior visto, podemos deducir que los dos elementos o conceptos son opuestos, y por lo tanto podemos llegar a estas conclusiones:
📦 Objetos | ℹ️ Estructuras de datos | |
---|---|---|
Descripción | Es un conjunto de funciones que operan sobre elementos de datos encapsulados, mostrando comportamiento y ocultando sus datos | Es un conjunto cohesivo de elementos de datos que carecen de comportamiento significativo, generalmente usado para el intercambio de datos |
Detalle | Es fácil agregar nuevos tipos sin cambiar las funciones existentes. Sin embargo, es difícil agregar nuevas funciones a un conjunto existente. | Es fácil agregar nuevas funciones, solo se agregan. Sin embargo, es difícil agregar nuevos tipos, porque se debe cambiar cada función. |
Ejemplos | Presentador, Casos de uso, Entidades de negocio, etc | DTO, Tablas de base de datos, modelos, etc |
En una arquitectura limpia, cuando se menciona que las estructuras de datos carecen de comportamiento significativo, no se refiere a que no tengan métodos, sino que sus métodos se limitan a interactuar y manipular los elementos almacenados en lugar de realizar acciones específicas. Por ejemplo, otras estructuras de datos como arreglos, listas enlazadas y tablas hash contienen métodos, pero estos métodos están diseñados para facilitar la interacción y manipulación de los elementos almacenados; es decir, sus métodos carecen de comportamiento significativo.
Aquí te presento algunos ejemplos de estructuras de datos simples:
Ejemplo 1 | Ejemplo 2 |
---|---|
Ejemplo 3 | Ejemplo 4 |
---|---|
Por lo tanto, a partir de la descripción previa y los ejemplos mostrados, se puede distinguir lo siguiente:
- En el ejemplo 2, hay un método que devuelve la misma estructura de datos con valores por defecto.
- El ejemplo 4 es curioso, ya que podría considerarse más como un objeto debido a que sus atributos son privados; sin embargo, no lo es porque no aporta ningún comportamiento y los métodos disponibles solo están destinados a interactuar con sus elementos. En general, se recomienda evitar el uso de esta forma.
- Las estructuras de datos no deben contener dependencias hacia objetos. En cambio, pueden tener dependencias hacia otras estructuras de datos (aunque se sugiere que sea lo más simple posible).
- En todos los casos, las estructuras de datos no deben tener métodos que conviertan de un formato a otro, ya que no funcionan como un Mapper.
© 2023 Vanskarner. All rights reserved.
Contact with us: contact@vanskarner.com