Entities

En el mundo del desarrollo de software, especialmente en la programación orientada a objetos, las entidades ocupan un lugar central. Representan objetos con identidad única, distinguiéndose de los Value Objects (tema que envié la semana pasada) que se definen por sus atributos y no por una identidad única.
En este artículo, exploraremos cómo podemos implementar y utilizar entidades (en este caso los ejemplos son en Dart y Flutter) para construir aplicaciones robustas y bien organizadas.
¿Qué es una Entidad?
Una entidad es un objeto que tiene una identidad persistente a través del tiempo. Esta identidad es lo que permite distinguir una entidad de otra, incluso si sus atributos son idénticos.
Consideremos un sistema de gestión de usuarios donde cada usuario se considera una entidad. Aquí está cómo podríamos modelar una clase User
en pseudocódigo:
Pseudocódigo de la Clase Usuario
Clase User:
Atributos:
entero id // Identidad única que podría ser el número de identificación
string name
string email
Constructor User:
Recibe:
entero id
string name
string email
Hace:
asignar id a this.id
asignar name a this.name
asignar email a this.email
Método updateName:
Recibe:
string newName
Hace:
asignar newName a name
Método toString:
Retorna:
cadena 'User(id: ' + enteroAString(id) + ', name: ' + name + ', email: ' + email + ')'
Ejemplo en Dart
class User {
final int id; // Identidad única que podria ser el numero de identifación.
String name;
String email;
User({
required this.id,
required this.name,
required this.email,
});
void updateName(String newName) {
name = newName;
}
@override
String toString() => 'User(id: $id, name: $name, email: $email)';
}
Inmutabilidad y el Método copyWith
Otra práctica común y beneficiosa es hacer que las entidades sean inmutables. En este enfoque, en lugar de modificar directamente los atributos de un objeto, se crea una nueva instancia del objeto con los valores actualizados utilizando un método copyWith. Esto se conoce como “objeto inmutable”.
Beneficios de la Inmutabilidad
Seguridad de Concurrency: Los objetos inmutables son naturalmente seguros para usar en entornos concurrentes porque no hay riesgo de que múltiples hilos modifiquen el objeto simultáneamente.
Historial de Cambios: Cada cambio resulta en un nuevo objeto, lo que puede ayudar a mantener un historial claro de cómo cambió el estado a lo largo del tiempo.
Ejemplo de Entidad Inmutable con copyWith en Dart:
class User {
final int id;
final String name;
final String email;
const User({
required this.id,
required this.name,
required this.email,
});
User copyWith({
String? name,
String? email,
}) {
return User(
id: this.id, // La identidad permanece constante
name: name ?? this.name,
email: email ?? this.email,
);
}
@override
String toString() => 'User(id: $id, name: $name, email: $email)';
}