Книга: Погружение в Паттерны Проектирования
Назад: Вспоминаем ООП
Дальше: Отношения между объектами

Краеугольные камни ООП

ООП имеет четыре главные концепции, которые отличают его от остальных методологий программирования.

Краеугольные камни ООП

Абстракция

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

Так, например, класс Самолёт будет актуален как для программы тренажёра пилотов, так и для программы бронирования авиабилетов, но в первом случае будут важны детали пилотирования самолёта, а во втором — лишь расположение и занятость мест внутри самолёта.

Абстракция

Разные модели одного и того же реального объекта.

Абстракция — это модель некоего объекта или явления реального мира, откидывающая незначительные детали, не играющие существенной роли в данном контексте.

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

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

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

Например, вы можете инкапсулировать что-то внутри класса, сделав его приватным (private) и скрыв доступ к этому полю или методу для объектов других классов. Более открытый режим видимости protected сделает это поле или метод доступным в подклассах.

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

Многих путает, что словом «интерфейс» называют и публичную часть объекта, и конструкцию interface из большинства языков программирования.

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

Например, вы создали интерфейс ЛетающийТранспорт с методом лететь(откуда, куда, пассажиры), а затем описали методы класса Аэропорта так, чтобы они принимали любые объекты с этим интерфейсом. Теперь вы можете быть уверены, что любой объект, реализующий интерфейс — будь то Самолёт, Вертолёт или ДрессированныйГрифон, сможет работать с Аэропортом.

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

UML-диаграмма реализации и использования интерфейса.

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

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

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

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

UML-диаграмма единичного наследования против реализации множества интерфейсов.

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

Полиморфизм

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

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

UML-диаграмма единичного наследования против реализации множества интерфейсов.

Теперь, представьте, что мы поместили нескольких собак и котов в здоровенный мешок. Затем, мы будем с закрытыми глазами вытаскивать их по одной из мешка. Вытянув зверушку, мы не знаем какого она класса. Но если её погладить, она точно издаст какой-то звук, зависящий от её класса.

bag = [new Cat(), new Dog()];

foreach (Animal a : bag)
  a.makeSound()
  
// Meow!
// Bark!

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

Полиморфизм — это способность программы выбирать различные реализации, при вызове операций с одним и тем же названием.

С другой стороны, полиморфизм — это способность объектов притворяться чем-то другим. В приведённом выше примере, собаки и коты «притворялись» абстрактными животными.

Назад: Вспоминаем ООП
Дальше: Отношения между объектами

asd
asdda