Menu
Coddy logo textTech

Records (Dart 3)

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 86 de 110.

Dart 3 introdujo los registros: una forma ligera de agrupar varios valores sin crear una clase completa. Los registros son inmutables, tienen igualdad integrada y son perfectos para devolver varios valores desde una función o agrupar temporalmente datos relacionados.

Crea un registro envolviendo los valores entre paréntesis:

void main() {
  // Un registro simple con dos valores
  var point = (10, 20);
  print(point.$1);  // 10 - accede al primer elemento
  print(point.$2);  // 20 - accede al segundo elemento
  
  // Registros con campos con nombre
  var person = (name: 'Alice', age: 30);
  print(person.name);  // Alice
  print(person.age);   // 30
}

Se accede a los campos posicionales con $1, $2, etc., mientras que los campos con nombre utilizan sus nombres directamente. Puedes mezclar ambos estilos en un solo registro.

Los registros destacan al devolver múltiples valores desde funciones; no es necesario crear una clase solo para devolver dos fragmentos de datos:

(int, int) divideWithRemainder(int a, int b) {
  return (a ~/ b, a % b);
}

(String name, int age) getUser() {
  return ('Bob', 25);
}

void main() {
  var (quotient, remainder) = divideWithRemainder(17, 5);
  print('$quotient remainder $remainder');  // 3 residuo 2
  
  var (name, age) = getUser();
  print('$name is $age');  // Bob is 25
}

Los registros admiten automáticamente la igualdad basada en sus valores, lo que los hace convenientes para realizar comparaciones sin tener que implementar == por tu cuenta. Usa registros cuando necesites agrupaciones de datos simples e inmutables; usa clases cuando necesites métodos, mutabilidad o un comportamiento más complejo.

challenge icon

Desafío

Fácil

¡Construyamos un sistema de coordenadas usando registros! Crearás funciones que trabajan con puntos 2D representados como registros, demostrando cómo los registros facilitan devolver y trabajar con múltiples valores relacionados sin crear clases completas.

Organizarás tu código en dos archivos:

  • geometry.dart: Crea funciones que usen registros para trabajar con datos de coordenadas:
    • Una función createPoint(int x, int y) que devuelva un registro con los campos con nombre x y y. El tipo de retorno debe ser ({int x, int y})
    • Una función midpoint(({int x, int y}) p1, ({int x, int y}) p2) que calcule y devuelva el punto medio entre dos puntos como un registro con campos con nombre. Usa división entera (~/) para el cálculo
    • Una función distance(({int x, int y}) p1, ({int x, int y}) p2) que devuelva un registro con campos posicionales: la distancia horizontal (diferencia en x) y la distancia vertical (diferencia en y). El tipo de retorno debe ser (int, int). Calcula como p2.x - p1.x y p2.y - p1.y
  • main.dart: Importa tu archivo de geometría y demuestra los registros en acción:
    • Crea dos puntos usando createPoint: el punto A en (2, 4) y el punto B en (10, 8)
    • Imprime Point A: ([x], [y]) usando los campos con nombre
    • Imprime Point B: ([x], [y]) usando los campos con nombre
    • Calcula el punto medio e imprime Midpoint: ([x], [y])
    • Calcula la distancia y usa la desestructuración para extraer los valores en las variables dx y dy; después, imprime Distance: dx=[dx], dy=[dy]

¡Observa cómo los registros te permiten devolver múltiples valores de forma clara: campos con nombre para mayor claridad cuando el significado es importante y campos posicionales cuando el contexto es obvio!

Salida esperada:

Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4

Pruébalo tú mismo

import 'geometry.dart';

void main() {
  // TODO: Crear el punto A en (2, 4) usando createPoint
  
  // TODO: Crear el punto B en (10, 8) usando createPoint
  
  // TODO: Imprimir el Punto A usando campos con nombre: Point A: ([x], [y])
  
  // TODO: Imprimir el Punto B usando campos con nombre: Point B: ([x], [y])
  
  // TODO: Calcular el punto medio e imprimir: Midpoint: ([x], [y])
  
  // TODO: Calcular la distancia y usar la desestructuración para extraer en dx y dy
  // Luego imprimir: Distance: dx=[dx], dy=[dy]
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online