Home » Articles » Programming docs

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

[ Исходный код yandex.disc (107 Кб) ]

Автор: Mr2
Для понимания статьи требуются базовые знания ООП.
Язык программирования C++.

ООП в действии:

ОО парадигма хороша для больших программ, с перспективами изменения и расширения.
В большинстве C++ книг для начинающих, всячески восхваляют ОО парадигму, но рассказывают в основном лишь о базовых элементах, умалчивая о самой сути.


Термены:

Класс от которого производится наследование:

Базовый класс, родительский класс.

Класс который наследует:

Производный класс, cуб класс, дочерний класс.

Функции класса:

Функция член, метод класса, интерфейс.


Базовые элементы:

Класс – самостоятельный программный модуль.(кусок кода и данных)

 

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

Инкапсуляция – сокрытие данных.(блокировка прямого доступа к данным класса)

  • 1. Закрытые поля – данные доступные для работы только методам класса. Изменяемые в перспективе элементы класса. Такие данные можно удалять\переименовывать по усмотрению разработчика класса.
  • 2. Открытые поля – данные доступные для работы вне класса. Неизменные в перспективе элементы класса.(не рекомендуется)

 

Абстракция:

Абстракция – общее свойство объединяющее все суб классы.

 

Интерфейс:

Интерфейс – способ взаимодействие с классом.(изменение данных класса)

  • 1. Функция член – формирует поведение класса.(определяет возможности класса)
  • 2. Виртуальная функция – меняет поведение суб классов, не меняя имена самих методов.

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

Наследование – модификация базового класса, или сборка суб класса, из нескольких классов(множественное наследование).

 

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

Полиморфизм – вытекает из наследования, позволяет использовать единые методы  для суб классов(имеющих одининаковый базовый класс), работающие по-разному. Причём делается это автоматически, без каких либо проверочных условий со стороны пользователя.


Как всё это работает:

Для примера возьмём код отображения изображений различных форматов.

Создадим абстрактный класс imageFormat, который будет содержать общие для изображений методы, и виртуальные методы, которые будут работать по разному для разных форматов.

Общие  методы Виртуальные методы
resize
move
rotate
load
show

* Присвоение виртуальным функциям нуля, говорит о том что класс абстрактный, и мы не сможем создать объект этого класса.

Теперь наследуем абстрактный класс imageFormat, конкретными классами imageBMP и imagePNG.

В классах imageBMP и imagePNG, мы определили виртуальным функциям специфичную реализацию, для каждого из форматов. То есть вызов load\show будет одинаковым для обоих объектов, но работать они будут по-разному.

Напишем также две специальные функции для создания объектов изображения нужного формата:

readImageFormat Функция читает заголовок файла, и возвращает формат изображения.
getImageObj Функция читает формат изображения в заголовке файла и возвращает объект этого формата.

 

Создаём конкретный объект, но работаем с ним как с абстрактным:

Так как работа производится через интерфейсы, можно добавлять новые форматы изображений , не меняя логику работы с ними.(допустим создать и отобразить jpg изображение)

* В больших программах внесение небольших изменений, может потребовать гигантской работы. Механизмы ООП во многом решают эту проблему.

Реализация функций создания объекта изображения:

getImageObj - скрывает создание конкретных объектов, и сосредотачивает область изменений кода в одной точке программы. То есть, чтобы добавить создание нового объекта, достаточно написать новый case в switch.  Если бы switch был разбросан в разных местах программы, нужно было бы править каждый из них.

Вот так будет выглядеть вывод изображения, в зависимости от прочитанного формата изображения в заголовке файла:


Итог:

Мы создали абстрактный класс imageFormat , в котором определили:

  • 1. Общие свойства и методы для суб классов.
  • 2. Виртуальные функции для изменения поведения суб классов.

Написали классы конкретных форматов: imageBMP и imagePNG.

Переопределили поведение суб классов в методах: load, show.

Создали объект нужного формата, через специальную функцию getImageObj .

Написали единый код для всех суб классов, работающий с созданными функцией getImageObj объектами.


Паттерны проектирования - проектирование объектно-ориентированных программ с использованием проверенных решений.

Category: Programming docs | Added by: 2-FACE (2017-05-23)
Views: 914 | Tags: Инкапсуляция, ООП, Полиморфизм, Наследование, C++ | Rating: 2.0/1
Total comments: 0