Парадигмы программирования: что это такое и в чём различия

Парадигмы программирования: что это такое и в чём различия

Как новичку разобраться в многообразии подходов
5 минут70265

Когда программист начинает изучать свой первый язык — знакомится с его синтаксисом, пробует запускать простые команды, — он, как правило, не задумывается о том, в какой парадигме программирования работает. Только позже приходит осознание, что даже в пределах одного языка можно создавать разные в структурном плане программы. Выбрать ту парадигму, которая нравится, удаётся не всегда: во многом это зависит от актуальной ситуации в программировании, его тенденций, и, конечно, от языка.

Что такое парадигма программирования? Если в двух словах, то это набор принципов и методик по созданию кода. Они нужны, чтобы упорядочить программу и сделать её структурированной, удобной и понятной другим программистам, работающим в той же парадигме. Важно, чтобы и для вычислительной машины программа была ясной, подготовленной к быстрому и точному исполнению. Разберём основные парадигмы программирования.

Объектно-ориентированное программирование

Наиболее распространённая на данный момент парадигма. Это подвид императивного программирования — оно основано на последовательных вызовах команд, изменяющих данные, с которыми работает программа. Таким образом она оперирует объектами, и это удобно для многих приложений.

Новичков зачастую пугает аббревиатура ООП, но освоить парадигму объектно-ориентированного программирования не так сложно, как кажется. В своё время эта идея оказалась вирусной: создавать объекты, принадлежащие классам, а также использовать методы в качестве действий, которые может выполнить объект или которые можно произвести над ним. Много специалистов по Computer Science придерживаются такого подхода. Большое преимущество здесь в том, что программисту, использующему ООП, легко разобраться, что происходит в программе. Достаточно посмотреть, какие действия производит каждый из объектов.

Легче всего использовать ООП в Python, посложнее — в C++. Но если в этих языках у программиста ещё есть возможность увильнуть от ООП (например, для Python вполне подходит функциональное программирование), то в Java и C# всегда необходимо создавать классы, одних функций недостаточно.

Функциональное программирование

По распространённости функциональная парадигма программирования занимает второе место после ООП. Это развитие идей декларативного программирования: программа создаётся как инструмент, который решает определённую задачу и в итоге даёт нужный результат. 

Между последователями разных парадигм, оказавшимися в одной ветке комментариев, всегда разгорается бесконечный холивар с обвинениями в «ООП/ФП головного мозга». Но бывают и программисты, готовые применить любой из подходов в зависимости от проекта.

Наиболее характерный для функционального программирования язык — Haskell. В реальных проектах он применяется редко, но будто создан для красивых решений в духе ФП — поэтому Haskell стал культовым среди профессиональных программистов, предпочитающих эту парадигму.

В ФП код программы состоит из функций, для которых подробно прописано, что должно быть на входе, а что — на выходе. Причём одну функцию вполне можно подать на вход другой в качестве аргумента. Так программа выполняется, запуская нужные функции.

Преимущества функционального подхода — в том, что код легко читать, а тестирование упрощается. Всё потому, что действия, производимые функцией, не зависят от внешнего состояния. Выполнение кода становится более предсказуемым, а неожиданные побочные эффекты — менее вероятными.

Помимо объектно-ориентированного и функционального программирования, есть и другие парадигмы. Некоторые из них уже вытеснены более современными подходами. Но есть и специфические парадигмы, которые нужны для конкретных ситуаций. Расскажем про несколько самых распространённых.

Процедурное программирование

Этот подход — разновидность императивной парадигмы программирования. Процедурами здесь называют команды, которые применяются в определённом порядке и последовательно меняют состояние памяти. После применения всех команд программа выдаёт результат.

Процедурное программирование применяется не только в классических языках вроде C и Pascal, но и в самых современных. Например, в Go, где помимо процедурного подхода можно применить и ООП, но с ограниченной функциональностью.

При процедурном подходе проще писать и поддерживать код, чем при объектно-ориентированном, но в то же время программы тяжелее масштабировать и создавать на их основе сложные проекты.

Метапрограммирование

Здесь программа, которую вы создаёте, сама генерирует код новой программы или модифицирует свой. С помощью этого подхода часть задач разработчика можно автоматизировать. А ещё он даёт возможность людям, не владеющим языками программирования, создавать программы с помощью графических интерфейсов или словесных команд на естественном языке — программа преобразует их в обычный код.

Обобщённое программирование

В этой парадигме программист создаёт обобщённые представления для классов и функций. То есть не просто классы, которые могут наследоваться (как в ООП), а шаблоны функций или классов (если применить такой подход в C++). Изначально у них отсутствуют требования типа данных для входных параметров, поэтому шаблоны можно сделать более универсальными.

Преимущество этой парадигмы в том, что можно создавать алгоритмы, которые будут работать с разными типами, и для этого не придётся добавлять реализации для каждого типа отдельно. Такой подход можно совместить как с ООП, так и с другими современными парадигмами программирования.

Логическое программирование

Логическое программирование — это подвид декларативного. Основан на выводе информации из заданных фактов и логических правил, которые к ним можно применить. При выполнении программ используются правила формальной логики.

Возможность применить эту парадигму заложена в языке Prolog — он позволяет вводить предложения в виде фактов и набора правил. Разработку Prolog начали ещё в 1970 году, и целью было понять естественный язык. Логика используется как средство формализовать его семантику. Если располагать фактической информацией о предметной области, можно автоматизировать выдачу информации по схеме «вопрос — ответ».

Хотя подавляющее большинство разработчиков используют объектно-ориентированное или функциональное программирование, эти парадигмы не стали абсолютными монополистами. Не исключено, что с развитием технологий — например, при переносе части вычислительных задач на квантовые компьютеры — актуальной станет какая-то новая, ещё не созданная парадигма.

Если вы хотите ближе познакомиться с разными языками, приглашаем вас на бесплатный вебинар «Основы программирования». На нём вы погрузитесь в основы профессии и определитесь, по какому пути хотите развиваться в мире разработки.

Самоизоляция заканчивается — самое время освоить новую профессию, чтобы начать карьеру мечты и уверенно смотреть в будущее! Мы хотим помочь вам и с 1 по 10 июля 2020 г. дарим скидку 40% почти на все программы обучения GeekBrains. Будьте здоровы и успешны! :)

 

программированиеgolang
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!
Posts popup