Парадигма программирования — это совокупность понятий, идей и правил, которые определяют подход к написанию кода. Она нужна для того, чтобы сделать текст программы структурированным и понятным как для других разработчиков, так и для компьютера. Пример: функциональный подход основан на использовании чистых функций, тогда как объектно-ориентированный базируется на объектах, классах и их взаимодействии друг с другом. У каждой парадигмы свой наборы методов.
Популярные подходы
Практически все современные языки программирования (далее ЯП) в той или иной мере позволяют разработчику использовать две или более различных парадигм, на первый взгляд сильно отличных друг от друга. В этом случае речь идет о так называемом мультипарадигменном создании приложений. Есть 4 популярных подхода к разработке программ, коротко рассмотрим их далее.
Объектно-ориентированный
В рамках объектно-ориентированного программирования (ООП) программа рассматривается как набор объектов и классов. Под объектом понимается сущность, которая наделена функциями и свойствами. Представьте, что самостоятельную часть обычной программы положили в коробку и накрыли крышкой — это и есть объект, к которому приложение обращается при выполнении кода.
Класс — шаблон кода, в соответствии с которым создается объект. Его можно сравнить с рецептом блюда или руководством по сборке шкафа. Он включает в себя описание всех свойств и методов конкретного объекта. Простой пример: электрочайник.
В его конструкции есть кнопки, провода, нагреватель, светодиоды и другие детали. Но разве для того, чтобы включить чайник и нагреть воду, вам нужно каждый раз задумываться об устройстве прибора и знать, как именно он работает? Отсюда делаем вывод — ООП за счет классов и объектов делает сложный код более простым.
ООП строится на четырех основных постулатах:
- Инкапсуляция. Каждый объект независим, все данные и методы содержатся внутри него.
- Наследование. ООП позволяет создавать массу новых объектов, похожих на уже готовый.
- Полиморфизм. Взаимодействие между участками кода строится на базе единых правил.
- Абстракция. Программа всегда может обратиться к методам и свойствам объекта извне.
Объектно-ориентированное программирование поддерживается большим числом языков, в числе которых известные С++, C#, Java, JavaScript, Python, Swift.
Декларативный
В рамках декларативного метода программирования разработчик описывает конкретный результат, то есть что именно он хочет получить от кода, что должно сделать приложение. Особенность в том, что порядок (четкий алгоритм действий) достижения цели не описывается. В связи с этим такой стиль полностью противоречит императивному, о котором мы поговорим далее.
Главное достоинство декларативной методики в том, что написанный в соответствии с ней код компактен и прост для понимания. Но есть и серьезные недостатки:
- Не работает с переменными и состояниями. Если для работы программы нужно отследить изменение состояния, например, кнопки или галочки в чекбоксе, этот метод не подходит.
- Низкий уровень свободы при написании кода. Для решения творческих задач следует использовать императивный подход, особенно если важен порядок выполняемых шагов.
- Ограниченность применения. Декларативный стиль хорошо показывает себя при работе с данными и вычислениями, но в остальных случаях императивная парадигма лучше.
Декларативный тип программирования не работает без императивного, так как компьютер сам по себе не может понять, каким образом получить нужный программисту результат. Поэтому сперва нужно написать конкретные инструкции, на применении которых основан императивный подход, и уже на их основе запрашивать от вычислительной машины получения нужного итога.
Императивный
Написанный в соответствии с императивной парадигмой код можно сравнить с последовательным списком приказов, которые должны выполняться вычислительной машиной. Подход похож на тот же декларативный стиль, но разработчик описывает не результат, а то, как именно его добиться. Он подробно описывает, какие действия и в каком порядке должны выполняться компьютером.
В составе программы, написанной в императивном стиле, могут быть следующие инструкции:
- сложи два числа и выведи результат;
- отправь запрос на файловый сервер;
- открой программу и сверни ее в окно;
- выведи на экран сообщение и так далее.
Первыми языками программирования на парадигме императивного типа были машинные коды — команды, которые выполнялись вычислительной машиной сразу, без предварительной подготовки и преобразований. Далее именно они стали базой для появления широко известных ассемблеров.
Функциональный
Используя функциональный стиль, разработчик описывает не четкую инструкцию в формате последовательности действий, а взаимодействие между командами и подпрограммами. В этом плане есть сходство с ООП, однако здесь такой подход реализуется на уровне всего приложения. Функциональная разработка поддерживается языками Haskell, Lisp, Erlang, Clojure и F#.
Простыми словами, программист описывает правила, согласно которыми должна вестись работа с данными. Далее код самостоятельно разбирается в том, как применять эти догмы для получения результата программы. Для лучшего понимания рассмотрим отличия от императивного стиля:
- последовательность правил не имеет значения, они работают в любом месте кода;
- все переменные работают как константы, иные данные хранятся в самих функциях;
- функции возвращают предсказуемый результат, который не зависит от переменных;
- последовательность исполнения подпрограмм определяет не программист, а код.
Функциональная парадигма существует более 60 лет, но до сих пор применяется точечно, имеет узкую сферу применения и проигрывает по популярности объектно-ориентированному подходу.
Если вы новичок в программировании, не спешите охватить все парадигмы. Знать особенности каждого подхода полезно, но на старте обучения не так важно. Для уверенного развития в статусе программиста нужно понимать принципы ООП и иметь общее представление о функциональной парадигме. Уже этого хватит для того, чтобы подбирать методы языка под конкретную задачу.