Mejora la Calidad de tu Código utilizando Value Objects

preview_player
Показать описание
El patrón Value Object es uno de los más famosos en cuanto a Diseño de Software, pero también uno de los más odiados.

Es criticado porque nos induce a "classitis" y porque añade complejidad al código, pero, en nuestra opinión, los beneficios compensan de forma desmesurada a sus contraprestaciones.

En este vídeo te demostramos que programar con Value Objects acaba simplificando mucho tu código

﹤🍍﹥ CodelyTV
Рекомендации по теме
Комментарии
Автор

No suelo comentar mucho, pero hay que decir que la presentación del código, cómo cambian las diapositivas y la explicación a medida que va ocurriendo ha sido BRILLANTE.

ciltocruz
Автор

Que forma tan pro de llevar al siguiente nivel la programación. Es el tipo de formación que deseo para mí. Una vez comprendido lo básico de programación uds son el siguiente paso lógico en nuestra formación.

felixinit
Автор

La expresión regular del email debería ser estática, para no hacer que el motor JS tenga que compilar la misma expresión una y otra vez en cada instanciación de value object

art_bat
Автор

INCREIBLE la calidad del video
Super claro

matiasjaime
Автор

Buenas introducción, me ha encantado! la unica pega es que personalmente no me gusta que un value object devuelva excepciones. Ya que imaginemos que incumples varias validaciones con ello dentro de un ValueObject, sólo la primera que ocurra será la que haga early exit del objeto. Vi otro video en el que usabais EITHER como monada y creo que vi otro con Results... si los combinais y haceis un metodo create estático (poniendo constructor a privado), tendríais lo que buscais pero devolviendo "un tipo de resultado que no es una excepción". Eso es muy util por ejemplo cuando has de devolver resultados que no son "totalmente correctos" o "totalmente falsos", por ejemplo imaginad un alta de un usuario en el que faltan ciertos datos del usuario para hacer ciertas operaciones, puedes tener "warnings" para esos casos de uso...

jmanuelcorral
Автор

Me impresiona que todos esto 'modelos' o 'arquitecturas' es hacer lo que has hecho toda la vida solo que alguien le ha puesto un nombre elegante.

Akn
Автор

Mejoran con los años... En hora bueno. Me ha servido mucho está clase

r.amilcarrivasmarquez
Автор

Gracias por el contenido, muy bueno!! Una mejora que veo es no colocar las validaciones y excepciones en el constructor de VO, el constructor debería estar limpio, por lo tanto, crearía un método estático "Create" en el VO donde valido y llamo a mi constructor privado.

arialapps
Автор

Corríjanme si me equivoco pero no que inversión de control es cuando se le pasa el control de las instancias a otro?, generalmente un framework, creo que se refieren a IoC como a inversión de dependencia.

esteam
Автор

Excelente video, primero felicitarlos, una pregunta, que pasa si un value object no solo tiene un value sino más de uno ? es decir por ejemplo el value object credentials en donde tenga userName y userPassword como value object ? es más que pasa si el value userPassword sea otro value object llamada Password

tuttodev
Автор

Buen video, sin embargo tengo una duda, cuando la contraseña del usuario debe ser encriptada es una regla del domain, application o infrastructure?

El value object para el password del usuario debe validar el raw input o la contraseña ya encriptada?

geraldaburto
Автор

🔥 Buen video, a activar esa cuenta. Me gusta este patrón y lo aplico en mis proyectos tal cual. Pero me he enfrentado al problema de que algunos campos del objeto de dominio son opcionales (se actualizan en flujos posteriores de la aplicación).
¿Cual seria la buena práctica para manejas VO opcionales pero mantener esas validaciones dentro del VO?
Recomendaciones?

JSneider
Автор

Hay algo que me gustaria plantear, supongamos que estamos en un contexto de clean-architecture, si tengo validaciones que necesitan usar librerias externas estoy poniendo en mi dominio esas librerias que deberian estar en una capa superior (A menos que armemos alguna interfaz para comunicarnos con esa libreria y que usemos desde la clase de dominio)
Otra opcion que yo veo, es crear una clase builder, un UserBuilder que dentro llame a 3 ValidationService (uno para cada property). Luego para solventar que el mail se pueda modificar tendriamos un UpdateUserUseCase, donde un metodo seria updateMail en cual dentro tambien llamaria al mismo ValidatonService
Todo esto lo planteo con el objetivo de no llenar mi Clase User con libreria externas, ya que User es de mi dominio

jesusledesma
Автор

Cómo encajan los value objects en un projecto que se maneja por esquemas de validacion? no veo que aporte mucho si al crear o actualizar hacemos pasar el objeto por la validación del esquema completo

cristian.torres
Автор

Grande chicos grandes excelente todo su contenido como siempre <3 yo para TypeScrypt me hice este para reducir repeticiones y asegurar la inmutabilidad y comparar entre si mas que todo cuando son json aunque podria cambiarse facilmente para comparar cualquier dato estructurado, lo dejo por aca por si a alguien le interesa.
ValueObject<T> {
protected readonly value: T;

protected constructor(value: T) {
this.validate(value);
this.value = Object.freeze(value);
}

protected abstract validate(value: T): void;

getValue(): T {
return this.value;
}

public equals(other?: ValueObject<T>): boolean {
if (other?.value === undefined) {
return false;
}
if (this.isString(other.value) || this.isNumber(other.value)) {
return other.value === this.value;
}
if (this.isObject(other.value)) {
return this.deepEqual(this, other);
}
return false;
}

private deepEqual(object1: any, object2: any): boolean {
for (const key in object1.value) {
const value1 = object1.value[key];
const value2 = object2.value[key];

if (this.isObject(value1) && this.isObject(value2)) {
if (!this.deepEqual(value1, value2)) return false;
} else {
if (value1 !== value2) return false;
}
}
return true;
}

private isObject(unknown: unknown): boolean {
return unknown != null && typeof unknown === 'object';
}

private isNumber(unknown: unknown) {
return unknown != null && typeof unknown === 'number';
}

private isString(unknown: unknown) {
return unknown != null && typeof unknown === 'string';
}
}

<3 saludos.

NulledExp
Автор

Y que pasa cuando el valueObject es otra clase, por ejemplo Factura -> detalle ?

carlosdavila
Автор

¿con que programa hacen las presentaciones?

crayder
Автор

Porque no pasar directamente el objeto usuario al metodo register? Que sucede si son 90 parametros?

ddgutierrez
Автор

Iba a preguntar por qué no recibir los value objects desde fuera (yo personalmente le veo más ventajas siempre que se haga bien y sólo para las capas de dominio y aplicación), pero ya veo que lo comentáis en el curso. Así que habrá que activar la cuenta. 😂

oscargalvez
Автор

en el constructor de UserEmail haria la asignacion luego de los ensure, osea: constructor() { this.value = value} ya que utilizan parametros en los ensure. Caso contrario se podrian eliminar los parametros, asignar this.value = value y luego llamar a los ensures sin parametro. Pero el primer caso me gusta mas, no se que piensan uds. Saludos

barrenaedu