Skip to content

Objetos vs Estructuras de Datos

Vanskarner edited this page Jul 26, 2023 · 2 revisions

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
DataStructureVSObject
  • 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ón perimeter(), 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

Sobre Estructuras de datos

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
DataStructure_1 DataStructure_2
Ejemplo 3 Ejemplo 4
DataStructure_3 DataStructure_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.
Clone this wiki locally