Volver a la página principal
jueves 31 octubre 2024
5

Cómo usar assert en Dart

En Dart, assert es una herramienta de depuración que permite verificar si una condición es verdadera en tiempo de desarrollo. Si la condición de un assert es falsa, el programa lanzará un error, lo cual ayuda a detectar problemas de lógica o valores inesperados durante la fase de desarrollo. Los assert se eliminan en la versión de producción, por lo que no afectan el rendimiento del programa una vez que este es lanzado.

¿Qué es assert en Dart?

El assert es una función que verifica que una expresión o condición sea verdadera. Si es verdadera, el programa continúa ejecutándose normalmente; si es falsa, se lanza una excepción AssertionError y se detiene la ejecución en modo de desarrollo. Esto ayuda a los desarrolladores a detectar y corregir errores en tiempo de desarrollo.

Sintaxis básica de assert

La sintaxis básica de assert consiste en escribir la palabra clave assert seguida de la condición que quieres evaluar.

void main() {
  int edad = 18;
  assert(edad >= 18, "La edad debe ser 18 o mayor");
  print("Acceso permitido");
}

En este ejemplo, si edad es menor que 18, se lanzará un error con el mensaje "La edad debe ser 18 o mayor". Si edad es 18 o más, el programa continuará y se imprimirá "Acceso permitido".

Ejemplos de uso de assert en Dart

Verificar parámetros de entrada en una función

Puedes usar assert para validar los parámetros de entrada de una función.

void establecerEdad(int edad) {
  assert(edad > 0, "La edad debe ser mayor que 0");
  print("Edad establecida a: $edad");
}

void main() {
  establecerEdad(25); // Imprime: Edad establecida a: 25
  establecerEdad(-5); // Lanza un AssertionError
}

Aquí, el assert asegura que edad sea positiva. Si no es así, el programa lanza un error.

Uso de assert en constructores de clases

El assert es útil para validar los valores de las propiedades al crear instancias de una clase, asegurando que los objetos siempre tengan valores válidos.

class Persona {
  final String nombre;
  final int edad;

  Persona({required this.nombre, required this.edad})
      : assert(nombre.isNotEmpty, "El nombre no puede estar vacío"),
        assert(edad >= 0, "La edad debe ser positiva o cero");
}

void main() {
  Persona p = Persona(nombre: "Juan", edad: 30); // Crea el objeto correctamente
  Persona pInvalida = Persona(nombre: "", edad: -5); // Lanza AssertionError
}

En este ejemplo, el assert se usa en el constructor de Persona para verificar que nombre no esté vacío y que edad sea no negativa.

Verificación de condiciones en el flujo de lógica

Puedes usar assert para asegurarte de que ciertas condiciones se cumplan en diferentes puntos del código, como verificaciones intermedias.

void calcularDescuento(double precio) {
  assert(precio > 0, "El precio debe ser mayor que cero");
  double descuento = precio * 0.1;
  assert(descuento < precio, "El descuento no puede exceder el precio");
  print("Descuento calculado: $descuento");
}

void main() {
  calcularDescuento(100); // Imprime: Descuento calculado: 10.0
  calcularDescuento(-50); // Lanza AssertionError
}

Este ejemplo verifica que el precio sea positivo antes de calcular el descuento y que el descuento sea menor que el precio original.

Deshabilitar assert en producción

Los assert solo están activos en modo de depuración. Cuando el programa se compila en modo de producción, los assert se eliminan automáticamente, lo cual evita cualquier impacto en el rendimiento.

Para ejecutar un programa en modo de producción, usa:

dart run --release

Ventajas de usar assert en Dart

  • Prevención de errores: Facilita la detección de condiciones inesperadas durante el desarrollo.
  • Código más seguro: Ayuda a asegurarse de que los valores cumplen ciertas condiciones antes de continuar la ejecución.
  • Sin impacto en producción: Los assert no afectan el rendimiento de la versión de producción.

Referencia oficial

Para más detalles sobre assert, consulta la documentación oficial de Dart.

Etiquetas:
dart
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer