Skip to content
IRC-CodingIRC-Coding
JSON SchemaOCLDesign by Contractинвариантыпредусловияпостусловия

Спецификация структур данных с JSON Schema и OCL

Спецификация данных и программных структур: диаграммы классов, кардинальность, инварианты, JSON Schema, Design by Contract, тестирование.

S

schutzgeist

8 min read
Спецификация структур данных с JSON Schema и OCL

Спецификация структур данных и программ

Этот материал представляет собой терминологический справочник по спецификации структур данных и программ, включающий контрольные вопросы, основные компоненты и элементы нотации.

Суть вопроса

Структуры данных описываются формально через модели, типы, инварианты и схемы. Программные структуры определяются через интерфейсы, предусловия и постусловия, состояния и потоки управления. Цель такого подхода — создание однозначной, тестируемой и поддерживаемой архитектуры.

Краткое профессиональное описание

Спецификация данных

  • Модели: ER-диаграмма или UML-диаграмма классов
  • Кардинальность, ключи, нормализация (до 3NF)
  • Правила как инварианты
  • Интерфейсные данные в машиночитаемом виде: JSON Schema (или DDL/XML Schema)

Спецификация программ

  • Модули и APIs с сигнатурами
  • Контракты на ошибки
  • Design by Contract: предусловие, постусловие, инвариант
  • Поведение: автоматы состояний, диаграммы активности и последовательности
  • Уточнение: Object Constraint Language (OCL)

Спецификации служат основой для автоматической валидации, генерации заглушек и Contract Tests.

Важные моменты для подготовки

  • Кардинальность и ключи — корректно: Модели данных должны определять уникальные ключи и правильные связи между сущностями. Неправильно установленная кардинальность приводит к несогласованным данным или ошибочным запросам.
  • JSON Schema для валидации входных данных: JSON Schema описывает допустимые структуры и диапазоны значений для JSON-данных. С его помощью можно проверять входные данные ещё до обработки и отклонять некорректные данные.
  • Предусловия, постусловия и обработка ошибок: Design by Contract формулирует обязательства для вызывающего и вызываемого кода. Предусловия должны выполняться до вызова, постусловия — после. Ошибочные случаи явно определяются как исключения.
  • Модели состояний для допустимых переходов: Диаграммы состояний показывают, в каких состояниях может находиться объект и какие переходы допустимы. Это предотвращает недопустимые изменения состояния, например повторную отправку отменённого заказа.
  • Вывод тестовых случаев (классы эквивалентности и граничные значения): Из спецификаций можно целенаправленно разрабатывать тестовые случаи. Инварианты и условия дают классы эквивалентности, ключи и границы — конкретные тестовые данные.
  • Версионирование, миграция и снятие с поддержки: Схемы и интерфейсы меняются со временем. Семантическое версионирование, объявления об устаревании и пути миграции помогают контролируемо внедрять изменения.
  • Безопасность: валидация, права доступа и поля аудита: Спецификации должны включать аспекты безопасности. Это включает валидацию входных данных, права доступа и логирование, кто, когда и какие данные изменил.

Основные компоненты

  1. Абстрактный тип данных + область значений — Абстрактный тип данных определяет возможные значения и операции над структурой данных. Область значений определяет, какие входные данные корректны, например положительные числа или строки с определённым шаблоном.
  2. Модель структуры (ER/класс) — ER-диаграмма или UML-диаграмма классов описывает сущности, их атрибуты и связи. Модель структуры лежит в основе базы данных и объектных моделей.
  3. Кардинальность + нормальные формы — Кардинальность указывает, сколько сущностей связаны друг с другом. Нормальные формы снижают избыточность и предотвращают аномалии при вставке, обновлении и удалении.
  4. Схема данных (JSON Schema) — JSON Schema — это машиночитаемое описание JSON-данных. Оно задаёт типы, обязательные поля, диапазоны значений и шаблоны, позволяя автоматизировать валидацию.
  5. API-контракт + коды ошибок — API-контракт описывает интерфейсы, параметры, возвращаемые значения и обработку ошибок. Коды ошибок и сообщения помогают вызывающему коду распознавать проблемы и обрабатывать их корректно.
  6. Design by Contract — Design by Contract определяет предусловия, постусловия и инварианты. Это гарантирует, что вызывающий и вызываемый код соблюдают свои обязательства, и упрощает отладку.
  7. Модели состояния и процесса — Модели состояния показывают допустимые состояния и переходы. Модели процесса вроде диаграмм активности описывают потоки выполнения и решения внутри логики программы.
  8. Правила качества (NFR) — Нефункциональные требования вроде производительности, безопасности или доступности формулируются как правила качества. Они дополняют функциональную спецификацию измеримыми критериями.
  9. Вывод тестов (Contract/Property) — Из спецификаций можно вывести тестовые случаи. Contract Tests проверяют контракты интерфейсов, Property-based Tests проверяют общие свойства вроде инвариантов.
  10. Концепция версионирования и миграции — Изменения схем и APIs должны версионироваться. Концепция миграции описывает, как существующие данные и клиенты переводятся на новые версии.

Практический пример (заказ)

JSON Schema (отрывок в текстовом виде)

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

OCL-инварианты (в смысле)

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

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

Контракт сервиса (псевдокод)

interface BestellService
  legeBestellungAn(warenkorb)

vorbedingung:
  warenkorb.positionen nicht leer und warenkorb.gesamt > 0
nachbedingung:
  result.status = ANGELEGT und result.gesamt = warenkorb.gesamt
fehlerfälle:
  UngültigeDaten, ZahlungAbgelehnt

Преимущества и недостатки

Преимущества

  • Однозначная коммуникация
  • Автоматизируемая валидация
  • Лучшая тестируемость и меньше ошибок интеграции

Недостатки

  • Первоначальные затраты
  • Поддержка версий и миграций
  • Риск излишней формализации

Типичные контрольные вопросы (с кратким ответом)

  1. ER-диаграмма или диаграмма классов? ER для данных и персистентности, класс для типов и операций.
  2. Зачем нужны инварианты? Это правила, которые должны всегда выполняться.
  3. Как из спецификации получить тесты? Предусловия и инварианты переводят в классы эквивалентности и граничные значения.
  4. Как безопасно версионировать схемы? Семантическое версионирование, Breaking Changes равны Major, объявления об устаревании и миграция.

Стратегия изучения

  1. Введение в понимание: Смоделируйте небольшую предметную область, например библиотеку или интернет-магазин, в виде диаграммы классов. Выведите из неё JSON Schema и несколько инвариантов.
  2. Метод углубления: Сформулируйте для существующей функции предусловия, постусловия и обработку ошибок. Напишите на их основе тестовые случаи, используя классы эквивалентности и граничные значения.
  3. Тренировка к экзамену: Потренируйтесь различать ER-диаграмму и диаграмму классов, а также правильно записывать инварианты и переходы состояния.
  4. Избежание ошибок: Держите спецификации в актуальном состоянии. Когда система меняется, модель, схема и контракты должны обновляться, иначе накапливается технический долг.

Практическое упражнение 1: JSON Schema для заказа

Заказ имеет ID в формате ORD- плюс шесть цифр, ID клиента, минимум одну позицию и общую сумму, которая должна быть больше или равна нулю. JSON Schema формально закрепляет эти правила и может автоматически проверять входные данные.

Практический пример 2: OCL-инварианты для заказа

Заказ должен соответствовать инварианту, при котором общая сумма равна сумме всех позиций. Другой инвариант требует, чтобы каждое количество было положительным. Такие инварианты можно преобразовать в тесты.

Практический пример 3: Design by Contract для сервиса заказов

Функция legeBestellungAn требует предусловие: непустую корзину с положительной суммой. Постусловие гарантирует, что заказ получит статус ANGELEGT и сумма будет верной. Ошибочные ситуации, такие как неверные данные или отклоненный платёж, описаны явно.

Упражнение 1: выбор типа модели

Вы хотите задокументировать структуру данных для реляционной базы данных. Какая модель подходит лучше: ER-модель или диаграмма классов?

Решение: ER-модель подходит лучше, поскольку представляет сущности, атрибуты и связи для проектирования базы данных. Диаграмма классов сосредоточена больше на типах, операциях и наследовании.

Упражнение 2: вывести инвариант

Позиция заказа имеет атрибуты preis и menge. Сформулируйте подходящий инвариант.

Решение: Подходящий инвариант: menge > 0 и preis >= 0. Оба условия должны выполняться всегда, чтобы позиция была корректной.

Упражнение 3: объяснить модель состояний

Заказ может находиться в состояниях ANGELEGT, BEZAHLT, VERSENDET и STORNIERT. Какие переходы имеют смысл, какие нет?

Решение: Осмысленные переходы: ANGELEGT → BEZAHLT, BEZAHLT → VERSENDET и ANGELEGT → STORNIERT. Бессмысленны VERSENDET → ANGELEGT и STORNIERT → VERSENDET, так как они нарушают бизнес-процесс.

Анализ темы

  • Технический стержень: Формальное описание данных и поведения. Спецификации определяют, какие данные допустимы и как система должна себя вести. Модели, схемы и контракты — центральные инструменты.
  • Вызовы реализации: Баланс между точностью и практичностью. Чрезмерно формальные спецификации дорогостоящи в поддержке, слишком неточные приводят к неправильному пониманию. Подходящая степень детализации зависит от проекта.
  • Аспекты безопасности: Валидация и права как часть спецификации. Проверка входных данных, контроль доступа и журналы аудита должны учитываться в спецификации, чтобы они не были забыты при реализации.
  • Требования документирования: Модели, схемы и контракты как документация проекта. Спецификации — обязательная часть проектной документации. Они помогают согласовать требования между бизнесом, разработкой и тестированием.
  • Экономическая оценка: Затраты на спецификацию против экономии от меньшего количества ошибок. Хорошая спецификация требует времени в начале, но предотвращает дорогостоящие ошибки и переделки на поздних этапах. Автоматизируемая валидация и получение тестов повышают ценность.

Ключевые источники

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

FAQ: Спецификация структур данных и программ

1. Что такое спецификация в разработке ПО?

Спецификация точно описывает, какие данные и поведение должна иметь система. Она содержит модели, схемы, контракты и правила, которые служат основой для реализации, валидации и тестирования.

2. Что такое ER-модель?

ER-модель описывает данные с помощью сущностей, атрибутов и связей. Используется в первую очередь для проектирования реляционных баз данных.

3. Что такое диаграмма классов?

Диаграмма классов — это UML-диаграмма структуры, которая представляет классы с атрибутами, операциями и связями. Подходит для объектно-ориентированного моделирования ПО.

4. Что такое JSON Schema?

JSON Schema — стандарт для описания JSON-данных. Задаёт типы, обязательные поля, диапазоны значений, шаблоны и структуры, позволяя автоматическую валидацию.

5. Что такое инвариант?

Инвариант — условие, которое должно выполняться в любой момент времени. Например, общая сумма заказа всегда должна равняться сумме позиций.

6. Что такое предусловие?

Предусловие — условие, которое должно быть выполнено перед вызовом функции или операции. Вызывающая сторона отвечает за то, чтобы предусловие было соблюдено.

7. Что такое постусловие?

Постусловие — условие, которое должно выполняться после выполнения функции. Оно гарантирует, что результат или состояние обладают определёнными свойствами.

8. Что такое Design by Contract?

Design by Contract — подход, при котором интерфейсы формализуются через предусловия, постусловия и инварианты. И вызывающая сторона, и вызываемая должны следовать контракту.

9. Что такое OCL?

OCL — Object Constraint Language, формальный язык для точного описания инвариантов, предусловий и постусловий UML-моделей.

10. Что такое диаграмма состояний?

Диаграмма состояний показывает состояния, которые может принимать объект, и допустимые переходы между ними. Она предотвращает недопустимые смены состояния.

11. Что такое классы эквивалентности?

Классы эквивалентности — диапазоны входных данных, которые система обрабатывает одинаково. Из каждого класса выбирается минимум один тестовый случай, снижая общее количество тестов.

12. Что такое граничные значения?

Граничные значения — края классов эквивалентности, например 0, 1 или максимально допустимое значение. Ошибки часто возникают именно на границах, поэтому их тестируют целенаправленно.

13. Что такое нормальная форма?

Нормальная форма — правило структурирования реляционных баз данных, снижающее избыточность и аномалии. На практике часто стремятся к третьей нормальной форме (3NF).

14. Что такое первичный ключ?

Первичный ключ — атрибут или комбинация атрибутов, уникально идентифицирующие каждую запись в таблице. Не может быть пустым и должен оставаться уникальным.

15. Что такое API-контракт?

API-контракт описывает интерфейс программного интерфейса. Включает параметры, возвращаемые значения, коды ошибок и ожидаемое поведение при успехе и неудаче.

16. Что такое контракт на ошибки?

Контракт на ошибки описывает возможные ошибки и способ их передачи. Дополняет API-контракт исключениями, кодами ошибок и их смыслом.

17. Что такое версия в Semantic Versioning?

Semantic Versioning использует версии в формате MAJOR.MINOR.PATCH. Ломающее изменение увеличивает MAJOR, новые обратно совместимые функции увеличивают MINOR, исправления ошибок увеличивают PATCH.

18. Что такое Deprecation?

Deprecation означает, что функция или схема всё ещё доступны, но устарели. Пользователей информируют о том, что функция может быть удалена в более поздней версии.

19. Что такое скрипт миграции?

Скрипт миграции преобразует существующие данные или схемы в новую версию. Используется для контролируемого развития баз данных или API.

20. Что такое Contract Test?

Contract Test проверяет, соблюдает ли интерфейс согласованный контракт. Часто используется между потребителем и поставщиком для обеспечения совместимости.

21. Что такое поле аудита?

Поле аудита регистрирует, кто когда какие данные изменил. Типичные поля: createdAt, updatedAt, createdBy, updatedBy. Поддерживают отслеживаемость и соответствие требованиям.

22. Что такое машиночитаемая валидация?

Машиночитаемая валидация означает, что правила из схемы или модели компьютер может проверять автоматически. JSON Schema, XML Schema и DDL — примеры таких машиночитаемых правил.

23. В чём различие между спецификацией данных и спецификацией программ?

Спецификация данных описывает структуры данных, связи и правила. Спецификация программ описывает интерфейсы, поведение, состояния и процессы программы.

24. Почему спецификации приводят к меньшему количеству ошибок интеграции?

Ясные спецификации определяют интерфейсы и поведение на ранней стадии. Все участники работают с одним контрактом, что уменьшает недопонимание при интеграции.

25. Что такое нефункциональное требование?

Нефункциональное требование описывает качественные характеристики, такие как производительность, безопасность, доступность или масштабируемость. Дополняет функциональные требования и часто задаётся как Service Level.
Назад к блогу
Share:

Nächster Artikel in Инженерия программного обеспечения

Weiterlesen
Сравнение моделей: Waterfall, V-модель XT и Spiral

Похожие статьи