Директивное (структурное) программирование
Директивная программа предписывает, как достичь результата, пошагово описывая действия. Таким образом, структурная программа описывает, как получить результат.
В структурном программировании от входных данных полностью зависит последовательность выполнения команд. В директивном программировании возникла концепция локализации части кода в подпрограммы (функции, процедуры, методы), с последующим их вызовом из разных мест основной программы. При вызове в подпрограмму могут передаваться какие-либо данные в виде аргументов, а подпрограмма, в свою очередь, может возвращать в главную программу результат (т.е. полученные в ходе ее выполнения данные).
Типичными представителями структурной парадигмы являются языки Fortran, Pascal, C.
Такой подход удобно применять при решении хорошо формализованных задач, где важна скорость выполнения программы, а ее объем не превышает нескольких тысяч строк исходного кода.
Объектно-ориентированное программирование
В этом подходе особое внимание уделяется данным, которые представляются в программе в виде объектов. Объекты взаимодействуют между собой с помощью механизма передачи сообщений. Задача программиста — реализовать такие объекты, при взаимодействии которых можно будет получать желаемый результат.
ООП призвано решать более сложные и объемные задачи по сравнению с директивным программированием.
В основе ООП лежат следующие понятия:
1. Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.
2. Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
3. Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Все объекты являются экземплярами классов, которые по отношению друг к другу могут выступать в роли родитель-потомок. Классы-потомки наследуют свойства родительского класса.
Типичные представители объектно-ориентированных языков: С++, Java, Python.
Объектно-ориентированный подход целесообразно применять при решении задач для сложной предметной области, которую легче описать не набором стандартных типов данных, а через ее сущности (которые и будут являться кандидатами для создания классов). При этом происходит некоторый спад производительности программы (не всегда заметный).
Функциональное и логическое программирование
Декларативная программа заявляет (декларирует), что должно быть достигнуто в качестве цели. Важным является точная формулировка задачи. Программист не задает алгоритм для ее решения.
Функциональное программирование основано на математическом понятии функции, которая не изменяет свое окружение; это отличие функционального программирования от функций в структурных языках. Функциональная программа состоит из совокупности определений функций, которые в свою очередь представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. Каждая функция возвращает некоторое значение в вызвавшую его функцию, вычисление которой после этого продолжается; этот процесс повторяется до тех пор, пока не будет достигнут результат.
Типичные представители функциональных языков: List, Haskell.
В логическом программировании программы выражены в виде формул математической логики, и решение задачи достигается путем вывода логических следствий из них.
Наиболее известным представителем логических языков является Prolog.
Декларативный подход целесообразно применять в тех случаях, когда непонятно, как именно достичь результата, но точно известно, что нужно получить. Большое распространение эта парадигма получила при решении задач, связанных с искусственным интеллектом: с ее помощью реализованы различные экспертные системы.
Выбор парадигмы
Универсальной парадигмы программирования не существует, по большому счету, она и не нужна. Выбор же того или иного способа реализации программного обеспечения зависит от совокупности различных факторов:
– сложности описания предметной области;
– требований к скорости разработки и/или скорости работы программы;
– требований переносимости (кроссплатформенности) или же наоборот, оптимизации под единственную платформу;
– сложности используемых алгоритмов;
– подхода к решению задачи («что сделать» или «как сделать»).
Можно одну и ту же задачу решить с использованием различных парадигм или их комбинации. Выбор, на наш взгляд, должен осуществляться с учетом «естественности» применения того или иного подхода для решения конкретной задачи. Так, например, вряд ли кто-то будет писать программы для численного решения дифференциальных уравнений с использованием декларативных методов или реализовывать интеллектуальную систему на основе структурного подхода.
Литература
1. Лазарев Д. Презентация: Лучше один раз увидеть! — М.: Альпина Паблишер, 2011. — 142 с.
2. Феличи Дж. Типографика: Шрифт, верстка, дизайн. — Санкт-Петербург: БХВ-Петербург, 2004. — 496 с.
3. Рудер Э. Типографика. — М.: Таллер, 1998. — 232 с.
4. Балдин Е.М. Компьютерная типография LaTeX. — Санкт-Петербург: БХВ-Петербург, 2008. — 304 с.
5. Официальный учебный курс Adobe InDesign CS4 +CD = Adobe InDesign CS4 Classroom in a Book. — М.: Эксмо, 2009. — 464 с.
6. Ландэ Д.В., Снарский А.А., Безсуднов И.В. Интернетика: Навигация в сложных сетях: модели и алгоритмы. — M.: Либроком, 2009. — 264 с.
7. Ландэ Д.В. Поиск знаний в Internet. — М.: Диалектика, 2005. — 272 с.
8. Колисниченко Д.Н. Поисковые системы и продвижение сайтов в Интернете. — М.: Диалектика, 2007. — 272 с.
9. Братищенко В.В. Проектирование информационных систем. — Иркутск: Изд-во БГУЭП, 2004. — 84 с.
10. Брукс Ф. Мифический человеко-месяц или как создаются программные системы. — Санкт-Петербург: Символ-Плюс, 1999. — 304 с.
11. Себеста Р.В. Основные концепции языков программирования. — М.: Вильямс. — 672 с.
12. Роганов Е.А. Основы информатики и программирования: Учебное пособие. — М.: МГИУ, 2001. — 315 с.