En programación informática , la programación basada en datos es un paradigma de programación en el que las declaraciones del programa describen los datos que se deben comparar y el procesamiento requerido en lugar de definir una secuencia de pasos a seguir. [1] Los ejemplos estándar de lenguajes basados en datos son los lenguajes de procesamiento de texto sed y AWK , [1] y el lenguaje de transformación de documentos XSLT , donde los datos son una secuencia de líneas en un flujo de entrada (por lo tanto, también se conocen como lenguajes orientados a líneas) y la comparación de patrones se realiza principalmente a través de expresiones regulares o números de línea.
La programación basada en datos es similar a la programación basada en eventos , en el sentido de que ambas están estructuradas como coincidencia de patrones y procesamiento de resultados, y suelen implementarse mediante un bucle principal , aunque normalmente se aplican a dominios diferentes. El modelo condición/acción también es similar a la programación orientada a aspectos , donde cuando se alcanza un punto de unión (condición), se ejecuta un punto de corte (acción). Un paradigma similar se utiliza en algunos marcos de seguimiento como DTrace , donde se enumeran las sondas (puntos de instrumentación) y las acciones asociadas, que se ejecutan cuando se satisface la condición.
La adaptación de métodos de diseño de tipos de datos abstractos a la programación orientada a objetos da como resultado un diseño basado en datos. [2] Este tipo de diseño se utiliza a veces en la programación orientada a objetos para definir clases durante la concepción de un software.
La programación basada en datos se aplica normalmente a flujos de datos estructurados, para filtrar, transformar, agregar (como calcular estadísticas) o llamar a otros programas. Los flujos típicos incluyen archivos de registro , valores separados por delimitadores o mensajes de correo electrónico, en particular para el filtrado de correo electrónico . Por ejemplo, un programa AWK puede tomar como entrada un flujo de declaraciones de registro y, por ejemplo, enviar todas a la consola, escribir las que comiencen con ADVERTENCIA en un archivo "ADVERTENCIA" y enviar un correo electrónico a un administrador de sistemas en caso de que alguna línea comience con "ERROR". También podría registrar cuántas advertencias se registran por día. Alternativamente, uno puede procesar flujos de valores separados por delimitadores, procesando cada línea o líneas agregadas, como la suma o el máximo. En el correo electrónico, un lenguaje como procmail puede especificar condiciones para que coincidan en algunos correos electrónicos y qué acciones tomar (entregar, rebotar, descartar, reenviar, etc.).
Algunos lenguajes basados en datos son Turing-completos , como AWK e incluso sed, mientras que otros son intencionalmente muy limitados, en particular para el filtrado. Un ejemplo extremo de esto último es pcap , que solo consiste en filtrar, siendo la única acción "capturar". Menos extremo, sieve tiene filtros y acciones, pero en el estándar base no tiene variables ni bucles, solo permite declaraciones de filtrado sin estado: cada elemento de entrada se procesa de forma independiente. Las variables permiten el estado, lo que permite operaciones que dependen de más de un elemento de entrada, como la agregación (sumar entradas) o la limitación (permitir como máximo 5 correos por hora de cada remitente, o limitar los mensajes de registro repetidos).
Los lenguajes orientados a datos suelen tener una acción predeterminada: si no se cumple ninguna condición, los lenguajes orientados a líneas pueden imprimir la línea (como en sed) o enviar un mensaje (como en sieve). En algunas aplicaciones, como el filtrado, la coincidencia se puede realizar de forma exclusiva (es decir, solo la primera declaración coincidente), mientras que en otros casos se aplican todas las declaraciones coincidentes. En cualquier caso, la falta de coincidencia de algún patrón puede ser un "comportamiento predeterminado" o puede verse como un error, que se detectará mediante una declaración general al final.
Si bien los beneficios y los problemas pueden variar según la implementación, este paradigma tiene algunos beneficios y problemas potenciales importantes. La funcionalidad simplemente requiere que conozca el tipo de datos abstractos de las variables con las que está trabajando. Las funciones e interfaces se pueden usar en todos los objetos con los mismos campos de datos, por ejemplo, la "posición" del objeto. Los datos se pueden agrupar en objetos o "entidades" según la preferencia con pocas o ninguna consecuencia.
Si bien el diseño basado en datos evita el acoplamiento de datos y funcionalidad, en algunos casos se ha argumentado que la programación basada en datos conduce a un mal diseño orientado a objetos , especialmente cuando se trata de datos más abstractos. Esto se debe a que un objeto o entidad puramente basado en datos se define por la forma en que se representa . Cualquier intento de cambiar la estructura del objeto rompería inmediatamente las funciones que dependen de él.
Por ejemplo, se pueden representar las indicaciones para llegar en coche como una serie de intersecciones (dos calles que se cruzan) en las que el conductor debe girar a la derecha o a la izquierda. Si una intersección (en los Estados Unidos) se representa en los datos mediante el código postal (un número de 5 dígitos) y dos nombres de calles (cadenas de texto), pueden aparecer errores cuando se encuentre una ciudad en la que las calles se crucen varias veces. Aunque este ejemplo puede ser demasiado simplificado, la reestructuración de los datos es un problema bastante común en la ingeniería de software, ya sea para eliminar errores, aumentar la eficiencia o dar soporte a nuevas funciones.
[AWK] se denomina a menudo un lenguaje basado en datos: las instrucciones del programa describen los datos de entrada que se deben comparar y procesar en lugar de una secuencia de pasos del programa