В компьютерном программировании программирование , управляемое данными, представляет собой парадигму программирования , в которой операторы программы описывают данные, которые необходимо сопоставить, и требуемую обработку, а не определяют последовательность шагов, которые необходимо выполнить. [1] Стандартными примерами языков, управляемых данными, являются языки обработки текста sed и AWK [ 1] и язык преобразования документов XSLT , где данные представляют собой последовательность строк во входном потоке — поэтому их также называют строчно-ориентированными языками — а сопоставление с образцом в основном выполняется с помощью регулярных выражений или номеров строк.
Программирование, управляемое данными, похоже на программирование, управляемое событиями , в том, что оба структурированы как сопоставление с образцом и результирующая обработка, и обычно реализуются основным циклом , хотя они обычно применяются к разным доменам. Модель условие/действие также похожа на аспектно-ориентированное программирование , где при достижении точки соединения (условия) выполняется pointcut (действие). Похожая парадигма используется в некоторых фреймворках трассировки , таких как DTrace , где перечисляются зонды (точки инструментирования) и связанные с ними действия, которые выполняются при выполнении условия.
Адаптация методов проектирования абстрактных типов данных к объектно-ориентированному программированию приводит к проектированию, управляемому данными. [2] Этот тип проектирования иногда используется в объектно-ориентированном программировании для определения классов во время разработки программного обеспечения.
Программирование на основе данных обычно применяется к потокам структурированных данных для фильтрации, преобразования, агрегации (например, вычисления статистики) или вызова других программ. Типичные потоки включают файлы журналов , значения, разделенные разделителями , или сообщения электронной почты, в частности, для фильтрации электронной почты . Например, программа AWK может принимать в качестве входных данных поток операторов журнала и, например, отправлять все на консоль, записывать те, которые начинаются с WARNING, в файл «WARNING» и отправлять электронное письмо системному администратору в случае, если какая-либо строка начинается с «ERROR». Она также может записывать, сколько предупреждений регистрируется в день. В качестве альтернативы можно обрабатывать потоки значений, разделенных разделителями, обрабатывая каждую строку или агрегированные строки, такие как сумма или максимум. В электронной почте такой язык, как procmail , может указывать условия для соответствия некоторым электронным письмам и какие действия следует предпринять (доставить, вернуть, отклонить, переслать и т. д.).
Некоторые языки, управляемые данными, являются полными по Тьюрингу , например, AWK и даже sed, в то время как другие намеренно очень ограничены, особенно для фильтрации. Крайним примером последнего является pcap , который состоит только из фильтрации, единственным действием которой является «захват». Менее экстремально, sieve имеет фильтры и действия, но в базовом стандарте не имеет переменных или циклов, допуская только операторы фильтрации без сохранения состояния: каждый входной элемент обрабатывается независимо. Переменные разрешают состояние, что позволяет выполнять операции, зависящие от более чем одного входного элемента, например, агрегацию (суммирование входных данных) или регулирование (разрешение не более 5 писем в час от каждого отправителя или ограничение повторяющихся сообщений журнала).
Языки, управляемые данными, часто имеют действие по умолчанию: если не совпадает ни одно условие, языки, ориентированные на строки, могут вывести строку (как в sed) или доставить сообщение (как в sieve). В некоторых приложениях, таких как фильтрация, сопоставление может выполняться исключительно (то есть только первый совпадающий оператор), в то время как в других случаях применяются все совпадающие операторы. В любом случае, отсутствие сопоставления с любым шаблоном может быть «поведением по умолчанию» или может рассматриваться как ошибка, которая будет перехвачена оператором catch-all в конце.
Хотя преимущества и проблемы могут различаться в зависимости от реализации, есть несколько больших потенциальных преимуществ и проблем с этой парадигмой. Функциональность просто требует, чтобы она знала абстрактный тип данных переменных, с которыми работает. Функции и интерфейсы могут использоваться для всех объектов с одинаковыми полями данных, например, «позицией» объекта. Данные могут быть сгруппированы в объекты или «сущности» в соответствии с предпочтениями с небольшими или нулевыми последствиями.
Хотя управляемое данными проектирование действительно предотвращает связывание данных и функциональности, в некоторых случаях утверждается, что управляемое данными программирование приводит к плохому объектно-ориентированному проектированию , особенно при работе с более абстрактными данными. Это происходит потому, что чисто управляемый данными объект или сущность определяются способом, которым он представлен . Любая попытка изменить структуру объекта немедленно нарушит функции, которые на него полагаются.
Например, можно представить направления движения в виде ряда перекрестков (двух пересекающихся улиц), где водитель должен повернуть направо или налево. Если перекресток (в США) представлен в данных почтовым индексом (пятизначным числом) и двумя названиями улиц (строками текста), могут возникнуть ошибки, когда встречается город, где улицы пересекаются несколько раз. Хотя этот пример может быть слишком упрощен, реструктуризация данных является довольно распространенной проблемой в программной инженерии, либо для устранения ошибок, либо для повышения эффективности, либо для поддержки новых функций.
[AWK] часто называют языком, управляемым данными — операторы программы описывают входные данные для сопоставления и обработки, а не последовательность шагов программы.