Декларативное программирование: Когда «что» важнее, чем «как»

Будь то программирование приложений, IoT-программ или компьютерных игр — разработчики должны принять фундаментальное решение, прежде чем написать первую строчку кода: Какой язык программирования они хотят использовать? Существует множество языков, но все они могут быть отнесены к двум фундаментальным парадигмам программирования: декларативное программирование и императивное программирование.

Что такое декларативное программирование?

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

Поскольку декларативное программирование не описывает конкретно «как», а работает на очень высоком уровне абстракции, эта парадигма программирования также оставляет место для оптимизации. Если будет разработана лучшая процедура реализации, интегрированный алгоритм сможет определить и использовать ее. Это делает парадигму перспективной. Процедура достижения результата не обязательно должна быть зафиксирована при написании кода.

Наиболее известными декларативными языками программирования являются:

  • Prolog
  • Лисп
  • Haskell
  • Миранда
  • Erlang
  • SQL (в самом широком смысле)

Различные языки декларативного программирования, в свою очередь, можно разделить на две парадигмы: языки функционального программирования и языки логического программирования.

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

Императивное и декларативное программирование

Парадигма императивного программирования (командная парадигма) является более старой из двух основных парадигм. В отличие от декларативного программирования, в этом случае разработчик указывает в исходном коде, что именно должен сделать компьютер, шаг за шагом, для достижения результата. Основное внимание уделяется «как» пути решения. Например, такой подход можно встретить в Java, Pascal и C. В отличие от этого, в декларативном программировании непосредственно описывается «что» решения.

В качестве примера давайте применим эту идею к сборке мебели: В то время как императивное программирование предоставляет инструкции по сборке, декларативное программирование предоставляет изображение готового предмета мебели в качестве шаблона.

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

Пример декларативного программирования

Одной из сильных сторон декларативного программирования является его способность описывать проблемы более кратко и лаконично, чем императивные языки.

Если мы хотим вывести список фамилий, то в PHP это можно описать всего одной строкой кода с помощью декларативного программирования — как показано в примере — в то время как императивный метод требует пять строк.

Императивное программирование

$participantlist = [1 => 'Peter', 2 => 'Henry', 3 => 'Sarah'];
$firstnames= [];
foreach ($participantlist as $id => $name) {
    $firstnames[] = $name;
}

Декларативное программирование

$firstnames = array_values($participantlist);

Преимущества и недостатки декларативных языков программирования

В наши дни декларативный стиль программирования используется в самых разных случаях, пусть и не в чистом виде. Однако этот метод подходит не для всех случаев.

Декларативный код характеризуется высоким уровнем абстракции. Это позволяет разработчикам представлять сложные программы в сжатом виде. Но чем сложнее приложение, тем выше опасность того, что код станет настолько запутанным, что его сможет прочитать только тот разработчик, который изначально его написал. Для компаний, которые хотят иметь возможность поддерживать и развивать приложения, не полагаясь на знания одного человека, это представляет собой проблему. Внешним разработчикам приходится внимательно читать и прорабатывать декларативный код, пока они не поймут его структуру и не решат все проблемы.

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

Концептуальная модель декларативного программирования является не столько недостатком, сколько проблемой. Мышление в терминах состояний решения противоречит естественным процессам мышления человека. Люди склонны думать в терминах процессов, движущихся к цели, а не начинать с цели и работать в обратном направлении. Это требует от разработчиков переосмысления и привыкания к этой концепции, что вначале может замедлить решение проблем. Однако, как только новое мышление будет усвоено, декларативный подход сможет использовать свои сильные стороны.

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

Преимущества Недостатки
Короткий, эффективный код Иногда трудно понять внешним специалистам
Может быть реализована с использованием методов, которые еще не известны на момент программирования Основан на незнакомой для людей концептуальной модели (состояние решения)
Легкая оптимизация, поскольку реализация контролируется алгоритмом Трудно учесть особенности отдельных приложений при программировании
Возможность сопровождения независимо от разработки приложения  

На практике в наши дни часто используются смешанные формы парадигм, когда декларативные языки программирования дополняются императивными методами. Однако это повышает восприимчивость к ошибкам и может ухудшить читаемость кода.

Оцените статью
cdelat.ru
Добавить комментарий