Skip to content
IRC-CodingIRC-Coding
JSON SchemaOCLDesign by ContractInvariantePrecondiciónPostcondición

Especificación de estructuras con JSON Schema y Design by Contract

Especifica datos y programas con JSON Schema, OCL, invariantes, pre/postcondiciones y Design by Contract para validación robusta.

S

schutzgeist

11 min read
Especificación de estructuras con JSON Schema y Design by Contract

Especificación de estructuras de datos y programas

Este artículo es una explicación de conceptos sobre la especificación de estructuras de datos y programas, incluyendo preguntas de examen, componentes clave y etiquetas.

En resumen

Las estructuras de datos se describen formalmente mediante modelos, tipos, invariantes y esquemas. Las estructuras de programas se precisan a través de interfaces, precondiciones y postcondiciones, estados y flujo de control. El objetivo es lograr software inequívoco, verificable y mantenible.

Descripción técnica compacta

Especificación de datos

  • Modelos: modelo ER o diagrama de clases UML
  • Cardinalidades, claves, normalización (hasta 3NF)
  • Reglas como invariantes
  • Datos en interfaces legibles por máquina: JSON Schema (o DDL/XML Schema)

Especificación de programas

  • Módulos/APIs con firmas
  • Contratos de error
  • Diseño por Contrato: precondición, postcondición, invariante
  • Comportamiento: máquinas de estado, diagramas de actividad/secuencia
  • Precisión: OCL (Object Constraint Language)

Las especificaciones sirven como base para validación automática, generación de stubs y Contract Tests.

Puntos clave para examen

  • Cardinalidades/claves correctas: Los modelos de datos deben definir claves únicas y relaciones correctas entre entidades. Las cardinalidades mal definidas conducen a datos inconsistentes o consultas erróneas.
  • JSON Schema para validación de entrada: JSON Schema describe estructuras permitidas y rangos de valores para datos JSON. Con él puedes verificar automáticamente las entradas antes de procesarlas y rechazar datos defectuosos.
  • Precondiciones/postcondiciones y casos de error: Diseño por Contrato formula obligaciones para quien llama y quien es llamado. Las precondiciones deben cumplirse antes de la llamada, las postcondiciones después. Los casos de error se definen explícitamente como excepciones.
  • Modelos de estado para transiciones permitidas: Los diagramas de estado muestran en qué estados puede encontrarse un objeto y qué transiciones están permitidas. Esto evita cambios de estado inválidos, como reenviar un pedido cancelado.
  • Derivación de casos de prueba (clases de equivalencia/valores límite): Los casos de prueba se pueden desarrollar deliberadamente a partir de especificaciones. Las invariantes y condiciones generan clases de equivalencia, las claves y valores límite generan datos de prueba concretos.
  • Versionado, migración y deprecación: Los esquemas e interfaces cambian con el tiempo. El versionado semántico, las notificaciones de deprecación y las rutas de migración ayudan a introducir cambios de forma controlada.
  • Seguridad: validación, permisos y campos de auditoría: Las especificaciones deben incluir aspectos de seguridad. Esto incluye validación de entrada, derechos de acceso y registro de quién cambió qué datos y cuándo.

Componentes clave

  1. Tipo de dato abstracto + rango de valores - Un tipo de dato abstracto define los valores posibles y operaciones de una estructura de datos. El rango de valores especifica qué entradas son válidas, como números positivos o cadenas que coinciden con ciertos patrones.
  2. Modelo de estructura (ER/clase) - Un modelo ER o diagrama de clases UML describe las entidades, sus atributos y relaciones. El modelo de estructura es la base para bases de datos y modelos de objetos.
  3. Cardinalidades + formas normales - Las cardinalidades indican cuántas entidades están conectadas entre sí. Las formas normales reducen redundancias y previenen anomalías al insertar, modificar o eliminar datos.
  4. Esquema de datos (JSON Schema) - JSON Schema es una descripción legible por máquina de datos JSON. Especifica tipos, campos obligatorios, rangos de valores y patrones, y permite validación automática.
  5. Contrato de API + códigos de error - Un contrato de API describe interfaces, parámetros, valores de retorno y casos de error. Los códigos de error y mensajes ayudan a quien llama a identificar problemas y tratarlos correctamente.
  6. Diseño por Contrato - Diseño por Contrato define precondiciones, postcondiciones e invariantes. Garantiza que quien llama y quien es llamado cumplan sus acuerdos y facilita la búsqueda de errores.
  7. Modelos de estado/proceso - Los modelos de estado muestran estados permitidos y transiciones. Los modelos de proceso como diagramas de actividad describen flujos y decisiones dentro de la lógica del programa.
  8. Reglas de calidad (RNF) - Los requisitos no funcionales como rendimiento, seguridad o disponibilidad se establecen como reglas de calidad. Complementan la especificación funcional con criterios medibles.
  9. Derivación de pruebas (Contract/Property) - Los casos de prueba se pueden derivar de especificaciones. Los Contract Tests verifican contratos de interfaz, los Property-based Tests verifican propiedades generales como invariantes.
  10. Concepto de versión/migración - Los cambios en esquemas o APIs deben versionarse. Un concepto de migración describe cómo se transfieren datos existentes y clientes a nuevas versiones.

Ejemplo práctico (Pedido)

JSON Schema (extracto como texto)

type: object
required: id, kundeId, positionen, gesamt
properties:
  id: string (pattern ^ORD-[0-9]{6}$)
  gesamt: number (minimum 0)
  positionen: array (minItems 1)

Invariantes OCL (en sentido)

context Bestellung inv SummeStimmt:
  gesamt = sum(positionen.preis * positionen.menge)

context Bestellung inv PositiveMengen:
  forAll(positionen, menge > 0)

Contrato de servicio (pseudocódigo)

interface BestellService
  legeBestellungAn(warenkorb)

precondición:
  warenkorb.positionen no vacío y warenkorb.gesamt > 0
postcondición:
  result.status = ANGELEGT y result.gesamt = warenkorb.gesamt
casos de error:
  UngültigeDaten, ZahlungAbgelehnt

Ventajas y desventajas

Ventajas

  • Comunicación inequívoca
  • Validación automatizable
  • Mayor verificabilidad y menos errores de integración

Desventajas

  • Esfuerzo inicial
  • Mantenimiento de versiones/migraciones
  • Riesgo de formalismo excesivo

Preguntas típicas de examen (con respuesta breve)

  1. ¿Modelo ER vs diagrama de clases? ER para datos/persistencia, clase para tipos + operaciones.
  2. ¿Para qué sirven las invariantes? Reglas que siempre deben cumplirse.
  3. ¿Cómo surgen las pruebas a partir de la especificación? Precondiciones/invariantes → clases de equivalencia/valores límite.
  4. ¿Cómo se versionan esquemas de forma segura? Semver, cambios incompatibles = Mayor, deprecación + migración.

Estrategia de aprendizaje

  1. Introducción conceptual: Modela un pequeño dominio como una biblioteca o tienda en línea como diagrama de clases. Deduce un JSON Schema y algunas invariantes.
  2. Método de profundización: Formula precondiciones, postcondiciones y casos de error para una función existente. Escribe casos de prueba con clases de equivalencia y valores límite.
  3. Entrenamiento enfocado en examen: Practica la distinción entre modelo ER y diagrama de clases, así como la notación correcta de invariantes y transiciones de estado.
  4. Prevención de errores: Mantén las especificaciones actualizadas. Cuando el sistema cambia, también deben actualizarse el modelo, esquema y contratos, de lo contrario se crea deuda técnica.

Ejercicio 1: JSON Schema para un pedido

Un pedido tiene un ID en formato ORD- más seis dígitos, una ID de cliente, al menos una posición y un monto total que debe ser mayor o igual a cero. JSON Schema establece estas reglas de forma formal y puede verificar la entrada automáticamente.

Ejemplo práctico 2: Invariantes OCL para una orden

Una orden tiene la invariante de que el monto total debe corresponder a la suma de todas las líneas. Otra invariante establece que cada cantidad debe ser positiva. Estas invariantes se pueden trasladar a pruebas.

Ejemplo práctico 3: Design by Contract para un servicio de pedidos

La función crearPedido requiere como precondición un carrito no vacío con un monto total positivo. Como postcondición se establece que el pedido tenga el estado CREADO y el monto sea correcto. Los casos de error, como datos inválidos o pago rechazado, se mencionan explícitamente.

Ejercicio 1: Elegir el tipo de modelo

Deseas documentar la estructura de datos para una base de datos relacional. ¿Qué modelo es más apropiado, ER o diagrama de clases?

Solución: El modelo ER es más apropiado porque representa entidades, atributos y relaciones para el diseño de bases de datos. Un diagrama de clases se enfoca más en tipos, operaciones y herencia.

Ejercicio 2: Derivar una invariante

Una línea de pedido tiene los atributos precio y cantidad. Formula una invariante significativa.

Solución: Una invariante significativa es cantidad > 0 y precio >= 0. Ambas deben cumplirse siempre para que la línea sea válida.

Ejercicio 3: Explicar un modelo de estados

Un pedido puede tener los estados CREADO, PAGADO, ENVIADO y CANCELADO. ¿Qué transiciones tienen sentido y cuáles no?

Solución: Las transiciones sensatas son CREADO → PAGADO, PAGADO → ENVIADO y CREADO → CANCELADO. No tienen sentido ENVIADO → CREADO o CANCELADO → ENVIADO, porque violarían el flujo de negocio.

Análisis del tema

  • Núcleo técnico: Descripción formal de datos y comportamiento. Las especificaciones establecen qué datos son permitidos y cómo debe comportarse el sistema. Los modelos, esquemas y contratos son los instrumentos centrales.
  • Desafíos de implementación: Balance entre precisión y practicidad. Las especificaciones demasiado formales son costosas de mantener, las imprecisas llevan a malentendidos. El nivel de detalle adecuado depende del proyecto.
  • Implicaciones de seguridad: Validación y derechos como parte de la especificación. La validación de entrada, control de acceso y pistas de auditoría deben considerarse desde la especificación para no olvidarlos en la implementación.
  • Obligaciones documentales: Modelos, esquemas y contratos como documentación del proyecto. Las especificaciones son componentes vinculantes de la documentación del proyecto. Ayudan a alinear requisitos entre área comercial, desarrollo y pruebas.
  • Evaluación económica: Esfuerzo de especificación versus ahorro por menos errores. Una buena especificación cuesta tiempo al principio, pero evita errores costosos y correcciones en fases posteriores. La validación automatizable y la derivación de pruebas aumentan el valor.

Fuentes principales

  1. https://json-schema.org
  2. https://www.omg.org/spec/UML

Preguntas frecuentes: Especificación de estructuras de datos y programas

1. ¿Qué es una especificación en el desarrollo de software?

Una especificación describe de manera inequívoca qué datos y qué comportamiento debe tener un sistema. Contiene modelos, esquemas, contratos y reglas que sirven como base para la implementación, validación y pruebas.

2. ¿Qué es un modelo ER?

Un modelo ER describe datos mediante entidades, atributos y relaciones. Se utiliza principalmente para el diseño de bases de datos relacionales.

3. ¿Qué es un diagrama de clases?

Un diagrama de clases es un diagrama estructural UML que representa clases con atributos, operaciones y relaciones. Es apropiado para modelado orientado a objetos de software.

4. ¿Qué es JSON Schema?

JSON Schema es un estándar para describir datos JSON. Define tipos, campos obligatorios, rangos de valores, patrones y estructuras, permitiendo validación automática.

5. ¿Qué es una invariante?

Una invariante es una condición que debe cumplirse en todo momento. Por ejemplo, el monto total de un pedido siempre debe corresponder a la suma de sus líneas.

6. ¿Qué es una precondición?

Una precondición es una condición que debe cumplirse antes de llamar a una función u operación. Quien llama la función es responsable de asegurar que se cumpla.

7. ¿Qué es una postcondición?

Una postcondición es una condición que debe cumplirse después de ejecutar una función. Garantiza que el resultado o estado tiene determinadas propiedades.

8. ¿Qué es Design by Contract?

Design by Contract es un enfoque en el que las interfaces se formalizan mediante precondiciones, postcondiciones e invariantes. Tanto quien llama como quien es llamado deben cumplir el contrato.

9. ¿Qué es OCL?

OCL significa Object Constraint Language. Es un lenguaje formal para describir con precisión invariantes, precondiciones y postcondiciones en modelos UML.

10. ¿Qué es un diagrama de estados?

Un diagrama de estados muestra los estados que un objeto puede adoptar y las transiciones permitidas entre ellos. Previene cambios de estado inválidos.

11. ¿Qué son las clases de equivalencia?

Las clases de equivalencia son rangos de entrada que el sistema trata de igual forma. De cada clase se elige al menos un caso de prueba para reducir el número total de pruebas.

12. ¿Qué son valores límite?

Los valores límite son los bordes de las clases de equivalencia, por ejemplo 0, 1 o el valor máximo permitido. Los errores ocurren a menudo precisamente en estos límites, por eso se prueban deliberadamente.

13. ¿Qué es una forma normal?

Una forma normal es una regla para estructurar bases de datos relacionales que reduce redundancias y anomalías. La tercera forma normal (3NF) es un objetivo frecuente en la práctica.

14. ¿Qué es una clave primaria?

Una clave primaria es un atributo o combinación de atributos que identifica de forma única cada registro de una tabla. No puede ser nulo y debe permanecer único.

15. ¿Qué es un contrato API?

Un contrato API describe la interfaz de una API. Incluye parámetros, valores de retorno, códigos de error y comportamiento esperado en éxito y fallo.

16. ¿Qué es un contrato de errores?

Un contrato de errores describe qué errores pueden ocurrir y cómo se reportan. Complementa el contrato API con excepciones, códigos de error y su significado.

17. ¿Qué es un número de versión en Semantic Versioning?

Semantic Versioning usa versiones en formato MAJOR.MINOR.PATCH. Un cambio incompatible incrementa MAJOR, nuevas características compatibles incrementan MINOR, correcciones de bugs incrementan PATCH.

18. ¿Qué es Deprecation?

Deprecation significa que una función o esquema sigue disponible pero está obsoleto. Se notifica a los usuarios que puede ser removido en una versión posterior.

19. ¿Qué es un script de migración?

Un script de migración convierte datos o esquemas existentes a una nueva versión. Se usa para evolucionar bases de datos o APIs de forma controlada.

20. ¿Qué es una Contract Test?

Una Contract Test verifica que una interfaz cumple con el contrato acordado. Se utiliza a menudo entre consumidor y proveedor para asegurar compatibilidad.

21. ¿Qué es un campo de auditoría?

Un campo de auditoría registra quién cambió qué datos y cuándo. Los campos típicos son createdAt, updatedAt, createdBy y updatedBy. Soportan trazabilidad y cumplimiento normativo.

22. ¿Qué es validación legible por máquina?

Validación legible por máquina significa que las reglas de un esquema o modelo pueden ser verificadas directamente por la computadora. JSON Schema, XML Schema o DDL son ejemplos de reglas legibles por máquina.

23. ¿Cuál es la diferencia entre especificación de datos y de programas?

La especificación de datos describe estructuras de datos, relaciones y reglas. La especificación de programas describe interfaces, comportamiento, estados y flujos de un programa.

24. ¿Por qué las especificaciones conducen a menos errores de integración?

Las especificaciones claras definen interfaces y comportamiento temprano. Todos trabajan contra el mismo contrato, lo que reduce malentendidos durante la integración.

25. ¿Qué es un requisito no funcional?

Un requisito no funcional describe características de calidad como performance, seguridad, disponibilidad o escalabilidad. Complementa requisitos funcionales y se define frecuentemente como Quality of Service.
Volver al blog
Share:

Nächster Artikel in Ingeniería de Software

Weiterlesen
Git: Branches, Merge, Rebase y Pull Requests

Entradas relacionadas