Мы все знаем, что существуют 2 подхода к написанию программы – процедурно-ориентированное программирование (ПОП) и объектно-ориентированное программирование (ООП). Вы можете написать программу, используя любой из этих способов, но между ними есть заметные различия. Эти 2 подхода являются результатом эволюции разработки программного обеспечения, длившейся многие десятилетия. С момента изобретения компьютера было опробовано множество подходов и методов написания программ. Сюда можно отнести такие методы, как программирование сверху вниз (Top-Down programming), программирование снизу вверх (Bottom-Up programming), модульное программирование (Modular programming), структурное программирование (Structured programming) и другие. Основной целью всех этих методов было одно — сделать процесс программирования эффективнее. Это означает, сделать процесс написания сложных программ менее трудным, легко понимаемым, легко расширяемым/модифицируемым и имеющим как можно меньшую вероятность появления ошибок.
Говоря простыми словами, разницу между ПОП и ООП можно объяснить так: программист достаточно хорошо может справиться с задачей разработки программы средней сложности с помощью методики ПОП, но когда программа становится сложнее или классифицируется как задача повышенной сложности, то будет непросто написать эффективный код с помощью ПОП. Весь процесс программирования станет сложнее, займет больше времени, вылезет больше ошибок, нужно будет больше времени на их устранение и т.д. В этом случае ООП оказывается гораздо эффективнее ПОП. Весьма сложные программы могут быть разработаны гораздо эффективнее с использованием метода ООП. Будем надеяться, что вы получили общее представление о разнице между обоими подходами. Не существует конкретного правила, в каких случаях какой метод нужно применять. Все отводится на усмотрение программиста. Однако, в отрасли разработки программного обеспечения в основном следуют методике ООП, поскольку она способствует организации совместной работы. Основной причиной этого является повторное использование кода. Часть кода, разработанная одним программистом, может быть повторно использована любое количество раз любым количеством других программистов. Это делает разработку программного обеспечения более быстрой и эффективной.
Рассмотрим теперь каждую методику в отдельности.
Процедурно-ориентированное программирование
Слово процедура является здесь ключевым элементом. Оно означает набор процедур, который представляет собой набор подпрограмм или набор функций. Мы все знаем о функциях в языке C. C это процедурно-ориентированный язык. В ПОП основное внимание уделяется функциям или подпрограммам. Функции содержат набор команд, выполняющих определенную задачу. Функции в программе вызываются повторно для выполнения определенных задач. Например, программа может включать в себя сбор данных от пользователя (чтение), выполнения какого-то рода расчетов собранных данных (вычисление) и отображения результатов по запросу пользователя (вывод). Все эти три задачи, чтение, вычисление и вывод результатов, могут быть написаны в программе с помощью трех различных функций, выполняющих три различные задачи.
Структура методики ПОП
Проблема при применении ПОП заключается в обработке данных. В ПОП данным не придается никакого значения. Под данными мы понимаем информацию, полученную от пользователя, новые результаты, полученные после вычислений, и т.д. Если вы знакомы с программированием на C, то можете вспомнить классы памяти (storage classes) этого языка. В C элемент данных (переменная) должен быть объявлен как GLOBAL для того, чтобы он мог быть доступен двум или более функциям программы. Что происходит, когда 2 или более функций работают с одним и тем же элементом данных? Если в программе насчитывается 10 функций, то все эти 10 функций могут получить доступ к глобальной переменной. Вполне возможно, что одна функция может случайно изменить значение этой глобальной переменной. И если она является ключевым элементом программы, любые такие случайные манипуляции повлияют на всю программу. Тогда будет слишком трудно отлаживать и выявлять функцию, вызывающую проблемы, особенно если программа очень большая.
Работа с данными и функциями в ПОП
Одной из наиболее важных особенностей языка C являются структуры. Тот, кто знаком с этим языком, вспомнит, что структуры в C объявляются с помощью ключевого слова struct. Структуры позволяют упаковать вместе разные типы данных в единое целое. Программист может упаковать целочисленные данные, числа с плавающей точкой (float), массивы и прочие виды данных в единый объект с помощью структуры. Способ программирования с помощью структур был впервые введен в языке C, и это послужило основной причиной столь широкой популярности данного языка. И какова же истинная причина этого? Структура достаточно хорошо моделирует требования реального мира в компьютерной программе. Проблемой, связанной со структурами, было то, что она работала только с данными. Структура не позволяет упаковать вместе связанные функции наряду с данными. Все функции, манипулирующие с элементами данных внутри структуры должны быть написаны отдельно внутри программы. По этой причине программа на C имеет большую зависимость от функций.
В случае применения подхода ПОП проблема рассматривается в виде последовательности задач, которые могут быть реализованы как чтение, выполнение вычислений, вывод результата и т.п. Все задачи сначала анализируются, а затем разрабатываются функции/процедуры для выполнения всех этих задач.
Объектно-ориентированное программирование
Метод ООП отличается от ПОП в своем базовом подходе. ООП был разработан с сохранением всех лучших черт метода структурного программирования, который был дополнен множеством концепций, способствующих эффективному программированию. ООП дает много возможностей, и он создает совершенно новый путь в написании программ. В общем, ООП перенял все лучшие черты методики ПОП, вроде функций/процедур, структур и т.д.
Первой особенностью ООП, о которой упомянули бы программисты, является сокрытие данных (инкапсуляция). ООП придает огромное значение данным. Программист может скрыть действительно важные ключевые данные от внешнего мира, используя инструменты ООП. Базовая концепция ООП основана на понятии, схожем с понятием структуры в ПОП и называемым классом. Класс представляет собой важную особенность ООП, он позволяет упаковать вместе различные типы данных наряду с различными функциями, манипулирующими элементами данных этого класса. Элементы данных внутри класса могут быть объявлены как локальные (private) или глобальные (public). Для того, чтобы спрятать данные от внешнего мира, программист должен объявить их как private. В общем, класс действительно схож со структурой в языке C. Как и любая структура, он объединяет в единое целое различные объекты. Основное отличие между классом и структурой кроется в функциях. Структуры не позволяют объединять в себе данные и функции (структуры работают только с данными), тогда как классы позволяют упаковывать данные вместе со связанными с ними функциями. Кроме того, имеются еще различия, вроде сокрытия данных с помощью private/public. Структуры не облегчают сокрытие данных. В структуре к ее элементам получают доступ с помощью так называемых структурных переменных. В ООП используют другое понятие для доступа к данным и функциям внутри класса — объект. Данные и функции внутри класса называются членами или элементами класса. К элементу класса может быть получен доступ из внешнего мира (вне класса) только с помощью объекта класса.
Возможность сокрытия данных называется инкапсуляцией данных. Таким образом, один из главных недостатков ПОП решается в ООП. ООП тесно связывает данные с определенным классом и его объектами. Здесь нет необходимости в глобальных типах данных, как в ПОП, и, следовательно, данные не могут свободно «течь» по всей программе. Это гарантирует то, что не произойдет какой-либо случайной модификации важных данных.
Еще одной особенностью, привнесенной в ООП, является возможность повторного использования кода. Это просто означает то, что кусок кода, который был написан ранее, может быть использован в будущем. Это стало возможным благодаря особенности классов под названием наследование. Благодаря наследованию один класс может приобрести свойства другого класса. Это можно объяснить с помощью простого примера. Возьмем систему школьного управления. Изначально руководство решило разработать программу, сфокусированную только на учеников (без учета данных об учителях). Программист превосходно справился со своей работой, и в процессе программирования он объявил класс для сбора персональных данных, таких как имя, возраст, пол, адрес и т.д. Через год руководство школы решило включить в список данные об учителях. Теперь программист способен добавить эти данные за очень короткое время, поскольку он может использовать многие части кода, которые он написал ранее, благодаря наследованию. Класс персональных данных имеет общий характер (возраст, пол и пр. те же самые для человека вне зависимости от того, учитель он или ученик). Программист может наследовать данный класс новому классу, а также расширять этот новыми записями, например, записью о квалификации учителя.
У ООП имеется еще много возможностей, вроде полиморфизма (перегрузки операторов и функций), динамического связывания и т.д. Обо всем этом можно почитать в соответствующей литературе.
Перевод © digitrode.ru