Когда программист начинает изучать свой первый язык - знакомится с его синтаксисом, пробует запускать простые команды, - он, как правило, не задумывается о том, в какой парадигме программирования работает. Только позже приходит осознание, что даже в пределах одного языка можно создавать разные в структурном плане программы. Выбрать ту парадигму, которая нравится, удаётся не всегда: во многом это зависит от актуальной ситуации в программировании, его тенденций, и, конечно, от языка.
Что такое парадигма программирования? Если в двух словах, то это набор принципов и методик по созданию кода. Они нужны, чтобы упорядочить программу и сделать её структурированной, удобной и понятной другим программистам, работающим в той же парадигме. Важно, чтобы и для вычислительной машины программа была ясной, подготовленной к быстрому и точному исполнению. Разберём основные парадигмы программирования.
Объектно-ориентированное программирование
Наиболее распространённая на данный момент парадигма. Это подвид императивного программирования - оно основано на последовательных вызовах команд, изменяющих данные, с которыми работает программа. Таким образом она оперирует объектами, и это удобно для многих приложений.
Новичков зачастую пугает аббревиатура ООП, но освоить парадигму объектно-ориентированного программирования не так сложно, как кажется. В своё время эта идея оказалась вирусной: создавать объекты, принадлежащие классам, а также использовать методы в качестве действий, которые может выполнить объект или которые можно произвести над ним. Много специалистов по Computer Science придерживаются такого подхода. Большое преимущество здесь в том, что программисту, использующему ООП, легко разобраться, что происходит в программе. Достаточно посмотреть, какие действия производит каждый из объектов.
Легче всего использовать ООП в Python, посложнее - в C++. Но если в этих языках у программиста ещё есть возможность увильнуть от ООП (например, для Python вполне подходит функциональное программирование), то в Java и C# всегда необходимо создавать классы, одних функций недостаточно.
Функциональное программирование
По распространённости функциональная парадигма программирования занимает второе место после ООП. Это развитие идей декларативного программирования: программа создаётся как инструмент, который решает определённую задачу и в итоге даёт нужный результат.
Между последователями разных парадигм, оказавшимися в одной ветке комментариев, всегда разгорается бесконечный холивар с обвинениями в «ООП/ФП головного мозга». Но бывают и программисты, готовые применить любой из подходов в зависимости от проекта.
Наиболее характерный для функционального программирования язык - Haskell. В реальных проектах он применяется редко, но будто создан для красивых решений в духе ФП - поэтому Haskell стал культовым среди профессиональных программистов, предпочитающих эту парадигму.
В ФП код программы состоит из функций, для которых подробно прописано, что должно быть на входе, а что - на выходе. Причём одну функцию вполне можно подать на вход другой в качестве аргумента. Так программа выполняется, запуская нужные функции.
Преимущества функционального подхода - в том, что код легко читать, а тестирование упрощается. Всё потому, что действия, производимые функцией, не зависят от внешнего состояния. Выполнение кода становится более предсказуемым, а неожиданные побочные эффекты - менее вероятными.
Помимо объектно-ориентированного и функционального программирования, есть и другие парадигмы. Некоторые из них уже вытеснены более современными подходами. Но есть и специфические парадигмы, которые нужны для конкретных ситуаций. Расскажем про несколько самых распространённых.
Процедурное программирование
Этот подход - разновидность императивной парадигмы программирования. Процедурами здесь называют команды, которые применяются в определённом порядке и последовательно меняют состояние памяти. После применения всех команд программа выдаёт результат.
Процедурное программирование применяется не только в классических языках вроде C и Pascal, но и в самых современных. Например, в Go, где помимо процедурного подхода можно применить и ООП, но с ограниченной функциональностью.
При процедурном подходе проще писать и поддерживать код, чем при объектно-ориентированном, но в то же время программы тяжелее масштабировать и создавать на их основе сложные проекты.
Метапрограммирование
Здесь программа, которую вы создаёте, сама генерирует код новой программы или модифицирует свой. С помощью этого подхода часть задач разработчика можно автоматизировать. А ещё он даёт возможность людям, не владеющим языками программирования, создавать программы с помощью графических интерфейсов или словесных команд на естественном языке - программа преобразует их в обычный код.
Обобщённое программирование
В этой парадигме программист создаёт обобщённые представления для классов и функций. То есть не просто классы, которые могут наследоваться (как в ООП), а шаблоны функций или классов (если применить такой подход в C++). Изначально у них отсутствуют требования типа данных для входных параметров, поэтому шаблоны можно сделать более универсальными.
Преимущество этой парадигмы в том, что можно создавать алгоритмы, которые будут работать с разными типами, и для этого не придётся добавлять реализации для каждого типа отдельно. Такой подход можно совместить как с ООП, так и с другими современными парадигмами программирования.
Логическое программирование
Логическое программирование - это подвид декларативного. Основан на выводе информации из заданных фактов и логических правил, которые к ним можно применить. При выполнении программ используются правила формальной логики.
Возможность применить эту парадигму заложена в языке Prolog - он позволяет вводить предложения в виде фактов и набора правил. Разработку Prolog начали ещё в 1970 году, и целью было понять естественный язык. Логика используется как средство формализовать его семантику. Если располагать фактической информацией о предметной области, можно автоматизировать выдачу информации по схеме «вопрос - ответ».
Хотя подавляющее большинство разработчиков используют объектно-ориентированное или функциональное программирование, эти парадигмы не стали абсолютными монополистами. Не исключено, что с развитием технологий - например, при переносе части вычислительных задач на квантовые компьютеры - актуальной станет какая-то новая, ещё не созданная парадигма.
Источник Click to view
00:20 парадигма
02:19 императивная программа: пошаговое исполнение на примере JavaScript
03:22 пошаговое исполнение характерно для неструктурных ЯП: Assembly language, Basic
05:08 структурная программа на Rust
06:21 процедурный стиль на Python
07:28 объектно-ориентированное программирование на примере JavaScript
09:32 ООП хорош не для всякой задачи -- пример с пирожком
13:28 прототипное программирование
16:51 функциональное программирование
18:58 асинхронное программирование
22:48 реактивное программирование
26:04 событийно-ориентированное программирование (управляется потоками событий)
27:03 метапрограммирование
28:58 мультипарадигменное программирование
30:52 параллельное программирование
ВОПРОСЫ
31:58 реактивность
33:29 функции 1 класса
34:55 геттеры и сеттеры
37:37 смешивание стилей
38:07 если хочется писать в чистом ООП
39:43 объект, класс, коллекция -- разница
47:27 где хранятся классы
47:54 у каждой парадигмы свои шаблоны программирования
48:52 когда используется функциональное программирование
Смотрите также:
Какие бывают направления в программировании? Языки программирования, разработанные российскими и советскими программистами Типизация языков программирования: разбираемся в основах Сравнение языков программирования Специализации и преимущества разных языков программирования История языков программирования Самые востребованные языки программирования в России на HeadHunter Изучение языка программирования за час Изучение языка программирования за несколько часов (полный курс)