DTO en JavaScript
Fecha de publicación: 2023-02-06Los sistemas de información procesan datos, por lo que DTO (Data Transfer Object) es un concepto importante del desarrollo moderno. En sentido clásico, un DTO es un objeto sencillo, sin lógica, que describe los datos transferidos por la red entre procesos remotos. Cuando los datos pasan entre capas del mismo proceso se habla de DTO local.
Un DTO tiene dos objetivos principales:
- estructurar los datos para facilitar el trabajo de desarrollo;
- transformar los datos desde un formato de transporte, como JSON, XML o YAML, al formato interno de la aplicación, por ejemplo un objeto JavaScript.
DTO simple
En el caso simple, el DTO es una estructura plana cuyos atributos son primitivos, como cadenas o números:
class Simple {
aBool;
aNumber;
aString;
}Para transformar la entrada, el constructor debe analizar los datos y convertir sus tipos:
class Simple {
constructor(data) {
this.aBool = Boolean(data?.aBool);
this.aNumber = Number.parseFloat(data?.aNumber);
this.aString = String(data?.aString);
}
}
DTO complejo
Un DTO complejo contiene otros DTO, simples o complejos, además de primitivas:
class Complex {
constructor(data) {
this.aDto = new Simple(data?.aDto);
this.aString = String(data?.aString);
}
}La transformación de JSON a DTO puede ser:
const dto = new Complex({
aDto: {aBool: true, aNumber: 16, aString: 'simple'},
aString: 'complex',
});
Conversión de tipos en cascada
Para convertir tipos en cascada, los componentes se conectan mediante import-export:
export default class Simple1 {}
import Simple from './simple.mjs';
export default class Complex {}Así se pueden construir DTO de gran complejidad y modificar sus componentes de forma independiente. Cada nivel analiza su fragmento de entrada, convierte los tipos y conecta los constructores de niveles anidados.
Recortar o convertir
Supongamos que JSON contiene name, age y weight, pero el DTO Person conoce solo los dos primeros. Podemos conservar únicamente las propiedades conocidas:
this.name = String(data?.name);
this.age = Number.parseInt(data?.age);o copiar todo y convertir después las propiedades conocidas:
Object.assign(this, data);
this.name = String(data?.name);
this.age = Number.parseInt(data?.age);Si el código es el manejador final del DTO, conviene eliminar datos innecesarios. Si es un manejador intermedio, conviene convertir los tipos que usa directamente y conservar los datos que no conoce.
Resumen
- Un DTO describe datos transferidos entre procesos o capas.
- Sus objetivos son organizar los datos y convertir tipos.
- Los DTO anidados permiten formar estructuras complejas.
- Al convertir la entrada, las propiedades conocidas se pueden recortar o convertir, conservando las demás cuando corresponda.
Fragmentos adicionales de código fuente
{
} … and DTO for this data:
class Person {
name;
age;
}
constructor(data) {
this.name = String(data?.name);
this.age = Number.parseInt(data?.age);
}
constructor(data) {
Object.assign(this, data);
this.name = String(data?.name);
this.age = Number.parseInt(data?.age);
}