Основные принципы ООП

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

(https://msdn.microsoft.com/ru-ru/library/dd460654.aspx)

Объектно-ориентированное программирование – это методология разработки программ, основанная на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса. В свою очередь и объекты, и классы характеризуются набором свойств, методов и событий. Эти объекты характеризуются некоторыми свойствами, способны выполнять определенные методы и генерировать события.

Необходимо четко разделять понятия класс и объект. Класс является описанием объекта, в то время как объект является конкретным представителем (экземпляром) определенного класса. Например, понятие «автомобиль» описывает целый класс объектов, которые имеют четыре колеса, сидения, руль и умеют передвигаться, в то время как каждый конкретный автомобиль является объектом со своими размерами колес, количеством сидений, положением руля и скоростью передвижения.

Основополагающими принципами объектно-ориентированного программирования являются абстрагирование, инкапсуляция, наследование и полиморфизм. Суть этих принципов заключается в следующем.

Абстрагирование.

Человек использует абстрагирование для того, чтобы проще описывать сложные объекты (процессы) окружающей среды. Причем описание должно быть достаточно точным, чтобы не возникло ошибочное представление о другом объекте. На практике ограничиваются описанием основных функций этих объектов, существенных для программирования.

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

То же относится и к программированию. Например, для использования текстового поля (TextBox) не нужно разрабатывать специальный драйвер видеокарты. Вы просто используете объект класса TextBox. Этот абстрагированный объект содержит все, что нужно для редактирования текста.

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

Инкапсуляция.

Объекты позволяют значительно упростить разработку приложений. В очень редких случаях разработчика интересует внутренняя реализация объектов. Главное, чтобы объект обеспечивал функции, которые он должен предоставлять. Внутреннее же содержимое объекта и сложный механизм его действия должны быть защищены от внешнего вмешательства. Инкапсуляция как раз и поддерживает абстрагирование тем, что объект можно использовать, не зная, как он реализован внутри.

Например, если вы хотите снять деньги со счета через банкомат, то без карточки это невозможно, так как его содержимое защищено от доступа случайного клиента. Денежные автоматы защищены – инкапсулированы. На процессы, протекающие внутри банкомата, и на его содержимое клиент не имеет прямого влияния.

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

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

Это очень важный момент, т.к. в любом крупном проекте постоянные изменения приводят к тому, что в любой момент времени детали реализации класса могут измениться и все разработчики, которые использовали данные детали реализации, обнаружат свой код в неработающем состоянии. Отследить это невозможно, поэтому нельзя допускать таких ситуаций. Инкапсуляция кода внутри класса приведет к тому, что изменение деталей реализации отдельных классов не приведет к прекращению правильного функционирования программ, использующих эти классы. Для расширения же функциональности классов следует использовать наследование и полиморфизм.

Наследование.

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

Таким образом, наследование позволяет использовать в дочерних классах функции родительского класса и, в случае необходимости, дополнять и изменять их.

Полиморфизм.

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

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

В качестве примера применения данной возможности можно привести класс «Фигура», отображаемый на экране с помощью метода «Отобразить». В созданных на его основе классах «Круг», «Квадрат», «Треугольник» мы можем изменить функционал по отображению их на экране. После этого разработчик, имеющий экземпляр любого из этих классов, для перерисовки может просто вызвать метод «Отобразить», и объект корректно перерисуется на экране. Если бы не было полиморфизма, пришлось бы писать код, который проверяет тип фигуры и в зависимости от него перерисовывает фигуру различными способами.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: