Практически любой код на любом языке можно писать по-разному. То, насколько мелко код раздроблен на функции, каким образом названы переменные или насколько глубоко вложены друг в друга условные конструкции — всё это есть метрики качества кода и отдельные составляющие стиля написания кода (coding style). Однако стиль кодирования мало соотносится с тем, как решается та или иная задача и какова архитектура решения — эти свойства определяются выбранной парадигмой программирования.
Парадигма программирования — это совокупность наших представлений о том, как решить задачу. Мы начинаем применять ту или иную парадигму ещё до того, как начнём писать код — код на конкретном языке всего лишь позволяет с той или иной степенью удобства записать наши мысли в виде программы.
Опытный программист может применять — думать в нужном ключе — разные парадигмы для решения задачи, уметь правильно выбрать подходящую, записать свои мысли в коде на разных языках программирования. Мы можем говорить, что парадигма "подходит" для какого-либо языка программирования, когда для решения задачи не требуется бороться с языком и менять подходы, а возможно просто записывать собственные мысли "как есть".
Большинство современных высокоуровневых языков программирования — "мультипарадигмальные", то есть позволяют использовать несколько парадигм одинаково удобно. Языки же низкого уровня, такие как C, не могут себе позволить такую свободу: код на таких языках должен быть эффективным, поэтому решения обычно максимально завязаны на то, как работает компьютер, а не на то, как это видит себе программист. Python — язык мультипарадигмальный.
Если наша задача достаточно сложна для того, чтобы решить её в одно действие компьютера, мы можем описать последовательность шагов, выполнив которые компьютер достигнет нужной нам цели. Широкие шаги разбиваются на более мелкие до тех пор, пока каждый отдельный шаг не станет понятен интерпретатору или компилятору выбранного языка, а значит и самой машине. Проще говоря, мы продумываем и описываем то, как достичь нужного результата.
Такое описание чёткой последовательности шагов называется императивным программированием.
Императивное программирование практически всегда сопряжено с изменением состояния машины: большие программы записывают что-то на диск, посылают или принимают из сети, отдельные подпрограммы (они же процедуры) модифицируют глобальные и локальные переменные. Такой код заставляет программиста держать в уме всё то, что меняется при выполнении каждого конкретного шага, давая взамен максимально возможную эффективность.
Большинство языков низкого уровня предполагает кодирование только в этой парадигме — ведь компьютер только и делает, что последовательно выполняет команды на машинном языке и меняет состояние памяти. Многие языки высокого уровня тоже в основном предполагают решение задач по шагам.
Начиная решать какую-то задачу, мы сначала представляем себе нужный результат, а потом уже начинаем думать о том, как его достичь. Согласитесь, было бы значительно удобнее, если компьютеру было бы достаточно одного лишь описания результата, а способ достижения машина придумывала бы сама!
Декларативное программирование — это и есть описание того, что собой представляет конечный результат! Решая задачу в декларативном стиле, мы описываем как результат соотносится со входными данными, при необходимости уточняя детали, пока интерпретатор не получит достаточно информации, чтобы дальше действовать самостоятельно. И, уточняя наши требования, мы всё ещё не говорим машине как делать работу, мы лишь точнее и точнее описываем соотношение "входов" с "выходами".
Декларативное программирование часто похоже на написание некоторой формулы или соединение отдельных операций в конвеер, который из входных данных формирует выходные. Сложные формулы мы разбиваем на более простые, участки конвейера, выполняющие непонятные для компьютера операции, разбиваем на цепочки операций попроще.
В процессе такой декомпозиции нам не приходится думать о том, как будет меняться состояние машины в процессе вычисления формулы или как компьютер будет хранить пропускаемые через конвеер полуфабрикаты. Это упрощает написание и чтение кода, но усложняет сам интерпретатор или компилятор. И тем сложнее делать интерпретаторы и компиляторы, которые позволят компьютеру работать эффективно.
Поэтому языки низкого уровня практически не имеют средств для декларативного программирования, ведь для таких языков главное — это эффективность. В то же время, далеко не каждый язык высокого уровня предоставляет средства для решения любых задач строго декларативно. Обычно речь идёт об элементах декларативного программирования.
Если бы мы имели доступ к бесконечно производительным и бесконечно понятливым машинам, то любой код был бы декларативным — если бы вообще требовалось какое-либо кодирование! Человеку вообще свойственно думать в декларативном ключе. Возьмём для примера математику: мы знаем, что "длина гипотенузы, это корень квадратный из суммы квадратов катетов", а никак не "берём первый катет, умножаем на себя, запоминаем..., складываем и запоминаем результат, извлекаем корень из предыдущего результата".
Однако таких идеальных вычислителей у нас нет и в ближайшее время не будет. И далеко не каждую задачу можно описать "чисто декларативно" — так, чтобы ничего не нужно было уточнять и компьютер сам всё понял. Как говорится, "серебряной пули нет" и здесь. Поэтому нам приходится довольствоваться
На Python можно как реализовывать декларативные предметно-ориентированные языки "под задачу", так и писать "декларативно с элементами" — об этой второй возможности и рассказывает данный курс!
В источниках вы обязательно встретите словосочетания вроде "функциональный стиль". В таких случаях имеется в виду именно парадигма, а не coding style. Поэтому ориентируйтесь на прилагательное "функциональный", а не на существительное "стиль".
Так же встречается вариация "в функциональном ключе" и другие ей подобные. Здесь тоже нужно обращать внимание на прилагательное.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт