Введение

Парадигма программирования

В компьютерном программировании, программирование, управляемое данными, — это парадигма программирования, в которой программные инструкции описывают данные, которые необходимо сопоставить, и требуемую обработку, а не определяют последовательность шагов для выполнения. Типичными примерами языков, управляемых данными, являются языки обработки текста sed и AWK. Этот подход иногда используется в объектно-ориентированном программировании для определения классов на этапе проектирования программного обеспечения.

Приложения

Программирование, основанное на данных, обычно применяется к потокам структурированных данных для фильтрации, преобразования, агрегирования (например, вычисления статистики) или вызова других программ. Типичные потоки включают файлы журналов, значения, разделённые разделителями, или сообщения электронной почты, особенно для фильтрации электронной почты. Например, программа AWK может принимать в качестве входных данных поток записей журнала и, например, отправлять все в консоль, записывать начинающиеся с WARNING в файл "WARNING" и отправлять электронное письмо системному администратору, если какая-либо строка начинается с "ERROR". Она также может записывать количество зарегистрированных предупреждений в день. В качестве альтернативы можно обрабатывать потоки значений, разделённых разделителями, обрабатывая каждую строку или агрегированные строки, такие как сумма или максимум. В электронной почте язык, подобный procmail, может указывать условия для сопоставления с некоторыми электронными письмами и действия, которые необходимо предпринять (доставить, отклонить, отбросить, переслать и т. д.). Некоторые языки, управляемые данными, являются полными по Тьюрингу, такие как AWK и даже sed, в то время как другие намеренно очень ограничены, особенно для фильтрации. Крайним примером последнего является pcap, который состоит только из фильтрации, при этом единственным действием является "захват". Менее экстремально, sieve имеет фильтры и действия, но в базовом стандарте не имеет переменных или циклов, позволяя только фильтрацию без сохранения состояния: каждый входной элемент обрабатывается независимо. Переменные позволяют сохранять состояние, что позволяет выполнять операции, зависящие от более чем одного входного элемента, такие как агрегация (суммирование входных данных) или ограничение скорости (разрешить не более 5 писем в час от каждого отправителя или ограничить повторяющиеся сообщения журнала). Языки, управляемые данными, часто имеют действие по умолчанию: если ни одно условие не совпадает, языки, ориентированные на строки, могут вывести строку (как в sed) или доставить сообщение (как в sieve). В некоторых приложениях, таких как фильтрация, сопоставление может выполняться исключительно (то есть только первое совпадение), в то время как в других случаях применяются все совпадающие правила. В любом случае, отсутствие совпадения с каким-либо шаблоном может быть "поведением по умолчанию" или может рассматриваться как ошибка, которая будет перехвачена в конце.

Преимущества и проблемы

Хотя преимущества и недостатки могут различаться в зависимости от реализации, у этой парадигмы есть несколько значительных потенциальных достоинств и проблем. Функциональность требует лишь знания абстрактного типа данных переменных, с которыми она работает. Функции и интерфейсы могут применяться ко всем объектам с одинаковыми полями данных, например, к полю "позиция" объекта. Данные можно группировать в объекты или "сущности" по желанию, практически без последствий. Хотя проектирование, основанное на данных, предотвращает зависимость данных и функциональности, в некоторых случаях утверждается, что программирование, управляемое данными, может привести к плохому объектно-ориентированному проектированию, особенно при работе с более абстрактными данными. Это происходит потому, что объект или сущность, полностью определяемая данными, определяется способом её представления. Любая попытка изменить структуру объекта немедленно нарушит работу функций, от неё зависящих. Например, можно представить маршрут как последовательность перекрестков (две пересекающиеся улицы), где водителю нужно поворачивать направо или налево. Если перекресток (в США) представлен в данных почтовым индексом (пятизначным числом) и названиями двух улиц (текстовыми строками), то могут возникнуть ошибки в городе, где улицы пересекаются несколько раз. Хотя этот пример может быть упрощенным, реструктуризация данных – довольно распространенная проблема в разработке программного обеспечения, возникающая для устранения ошибок, повышения эффективности или поддержки новых функций.