Что такое парадигмы программирования и зачем они нужны
Знакомство с новыми парадигмами программирования может перевернуть вашу точку зрения на написание кода. Рассказываем, что это такое.
vlada_maestro / shutterstock
Парадигма программирования — это набор идей и понятий, которые определяют стиль написания программ, подход к программированию. Существует множество разных парадигм, но чаще всего используются императивная и декларативная, практически противоположные друг другу.
Императивная парадигма программирования
В императивной (англ. imperative — приказ) парадигме разработчик пишет для компьютера инструкции, которым тот следует. Инструкции могут быть следующие:
- сложи два числа;
- если а, то сделай б, а иначе сделай в;
- отправь запрос на сервер;
- открой файл;
- выведи строку.
То есть программист говорит, что нужно сделать и в каком порядке, а компьютер выполняет приказы.
Отличительная черта императивной парадигмы — понятие состояния компьютера или программы. Состояние — это совокупность всех данных в определённый момент времени: переменных, массивов, счётчиков и так далее.
К императивной парадигме относятся следующие виды программирования:
- процедурное;
- структурное;
- аспектно-ориентированное;
- объектно-ориентированное и другие.
Также императивную парадигму программирования можно считать более низкоуровневой, потому что программисту нужно знать, как работают программы.
Декларативная парадигма программирования
В декларативной парадигме разработчик описывает проблему и ожидаемый результат, но не пишет никаких инструкций. В декларативном программировании отсутствуют переменные, состояние и прочие понятия, которые свойственны императивной парадигме.
К декларативной парадигме относятся функциональное и логическое программирование.
Примеры использования парадигм
Допустим, у нас есть массив следующих чисел:
Нам может понадобиться получить из этого массива все числа, которые больше 3, но меньше 100.
В декларативном программировании разработчик просто пишет следующее:
Программист не думает о том, как программа будет искать эти числа, он просто пишет, какой результат ему нужен.
В императивном программировании придётся самостоятельно написать код, который будет проверять все числа из массива N на соответствие условию и, если они подходят, записывать их в новый массив. То есть код будет выглядеть примерно так:
То есть в декларативном программировании разработчик говорит, что ему нужно. А в императивном — как это можно получить.
Давайте рассмотрим это на примере двух реальных языков:
C# (императивный) | SQL (декларативный) |
---|---|
int[] N = new int[] { 5, 1, 3, 9, 12, 583, 998, 7538, 72, 53, 71, 85, 7, 2, 9 }; List<int> nums = new List<int>(); for(int i = 0; i < N.Length; i++) { if(N[i] > 3 && N[i] < 100) { nums.Add(N[i]); } } int[] N2 = nums.ToArray(); | SELECT num FROM N WHERE num > 3 AND num < 100; |
Зачем это нужно
У вас мог появиться вполне логичный вопрос:
Зачем использовать императивное программирование, если декларативное позволяет писать гораздо меньше кода?
Есть несколько причин.
Во-первых, декларативное программирование — это обёртка для императивного. Компьютер не может вот так просто понять, чего хочет программист, поэтому для него нужно написать конкретные инструкции, что и в каком порядке делать.
Когда вы пишете запрос в SQL, его выполнение происходит по заранее описанным инструкциям. Поэтому нам нужно императивное программирование, чтобы заставить работать декларативное.
Во-вторых, декларативное программирование не подходит для задач, для решения которых важно иметь доступ к состоянию программы — например, если нужно проверить, нажата ли кнопка или поставлена ли галочка в чекбокс.
В декларативном программировании нельзя отследить ни само состояние, ни его изменение, поэтому не получится указать, что должно происходить в ответ на действия пользователя.
В-третьих, императивное программирование даёт больше свободы, поэтому его чаще используют в творческих областях, особенно там, где важен порядок выполняемых действий.
Каждая парадигма подходит для определённых задач: императивная лучше для работы с анимацией, графическими интерфейсами, скриптами, играми и многим другим, а декларативная — для вычислений и работы с данными. Поэтому вопрос «Какая парадигма лучше?» некорректен: они все хороши, если использовать их по назначению.
Заключение
Большинство языков поддерживают обе парадигмы, но заточены под одну из них. Один из таких языков — C#. Несмотря на то что это объектно-ориентированный язык программирования (императивная парадигма), в нём присутствуют элементы функциональной разработки (декларативная разработка).