Парадигмы программирования: четыре разных способа думать о коде
Императивный, объектно-ориентированный, функциональный, декларативный — это не названия языков, а способы мышления. Один и тот же результат можно описать совершенно по-разному, и выбор стиля меняет всё.
Парадигма — это не язык и не библиотека, а сам способ, которым вы раскладываете задачу в голове, прежде чем написать первую строку.
Парадигма программирования — это образ мышления о коде. Один результат можно выразить как список команд, как взаимодействие объектов, как композицию функций или как описание желаемого итога.
Зачем вообще разные стили
Парадигма отвечает на вопрос «как мы вообще думаем о программе?». Это как стили в архитектуре: и готический собор, и хрущёвка дают крышу над головой, но исходят из совершенно разных принципов. Понимание парадигм важнее знания конкретного языка: освоив способ мышления, вы переносите его между языками. Многие современные языки к тому же мультипарадигменны — позволяют смешивать подходы.
Императивная: командуй машиной
Самая базовая и интуитивная. Программа — это пошаговый список приказов: сделай это, затем то, измени вот эту переменную. Вы явно управляете тем, как достигается результат. С неё почти все начинают.
total = 0
for i in range(1, 6):
total = total + i # шаг за шагом меняем состояние
print(total) # 15Объектно-ориентированная: мир из объектов
ООП предлагает моделировать программу как набор объектов, каждый из которых хранит свои данные и умеет что-то делать. Объект «банковский счёт» знает свой баланс и умеет пополняться и снимать. Идея в том, чтобы собрать данные и действия над ними вместе и спрятать внутренние детали. На ООП во многом построены Java, C#, C++, большой пласт Python.
class Schet:
def __init__(self):
self.balans = 0
def popolnit(self, summa):
self.balans += summa
s = Schet()
s.popolnit(100)
print(s.balans) # 100Функциональная: композиция функций
Здесь программа — это сборка из чистых функций, превращающих вход в выход без побочных эффектов и изменяемого состояния. Вместо «измени данные» — «получи новые на основе старых». Этот стиль ценят за предсказуемость; на нём построены Haskell, Elixir, а его приёмы есть почти везде.
numbers = range(1, 6)
total = sum(map(lambda x: x, numbers))
print(total) # 15 — без единой изменяемой переменнойДекларативная: опиши результат, а не путь
В декларативном подходе вы описываете что хотите получить, а как — забота системы. Ярчайший пример — SQL: вы пишете «дай всех пользователей старше 18, отсортированных по имени», но не указываете, как именно базе их искать и сортировать.
SELECT name FROM users
WHERE age >= 18
ORDER BY name;| Парадигма | Ключевая идея | Где встречается |
| Императивная | Команды по шагам | C, Python, любой язык |
| Объектно-ориентированная | Объекты с данными и поведением | Java, C#, C++ |
| Функциональная | Композиция чистых функций | Haskell, Elixir |
| Декларативная | Описать итог, не путь к нему | SQL, HTML |
Не религия, а инструменты
Новички иногда воспринимают парадигмы как соперничающие лагеря, где надо выбрать «правильную сторону». На деле это набор линз, и опытный инженер переключает их под задачу: моделирует предметную область объектами, обработку данных пишет в функциональном стиле, а запрос к базе формулирует декларативно — иногда в одной программе. Знать несколько парадигм — значит иметь больше способов посмотреть на проблему. А чем больше углов зрения, тем выше шанс найти простое и красивое решение.