Ооп На Примерах (Часть 2)

По воле судьбы мне приходится читать в университете специальный курс по паттернам проектирования.

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

Конечно, среди них есть и практикующие программисты.

Но, к сожалению, большинству людей сложно понять даже основные термины ООП.

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

Первая часть посвящен классам, объектам и интерфейсам.

Вторая часть ниже иллюстрирует инкапсуляцию, полиморфизм и наследование.



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

Представим на минутку, что мы оказались в конце позапрошлого века, когда Генри Форд еще не изобрел конвейер, а первые попытки создать автомобиль столкнулись с критикой со стороны властей по поводу того, что эти дымные монстры загрязняют окружающую среду.

воздух и пугать лошадей.

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

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

Думаю, можно согласиться, что вождение автомобиля в то время было очень неудобным и тяжелым занятием.

А теперь вернемся в сегодняшний день к современным чудесам автопрома с автоматической коробкой передач.

На самом деле, по сути, ничего не изменилось.

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

Прогресс другой.

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

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

Такое сокрытие в ООП называется инкапсуляцией.

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

Инкапсуляция неразрывно связана с концепцией интерфейса класса.

По сути, все, что не включено в интерфейс, инкапсулировано в класс.



Абстракция

Представьте себе, что водитель ведет машину по оживленной дороге.

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

и водителю делать совершенно нечего).

Однако рулем, педалями, указателем поворота (и, возможно, пепельницей) он будет пользоваться регулярно.

Абстракция – способ выделить совокупность значимых характеристик объекта, исключив из рассмотрения несущественные.

Соответственно, абстракция представляет собой совокупность всех таких характеристик.

Если бы для моделирования поведения автомобиля нам пришлось учитывать химический состав краски кузова и удельную теплоемкость лампочки номерного знака, мы бы никогда не узнали, что такое NFS.

Полиморфизм

Любое обучение вождению не имело бы смысла, если бы человек, научившийся водить, скажем, ВАЗ 2106, не мог бы потом водить ВАЗ 2110 или BMW X3. С другой стороны, сложно представить человека, который мог бы нормально управлять автомобилем, в котором педаль газа находится слева от педали тормоза, а вместо руля — джойстик.

Все дело в том, что основные органы управления автомобиля имеют одинаковую конструкцию и принцип работы.

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

Если водителю предстоит ехать по немецкому автобану, он, скорее всего, выберет быстрый автомобиль с низкой посадкой, а если ему придется после дождя возвращаться из отдаленного марлинового лагеря в Горном Алтае, то, скорее всего, выберет УАЗ с армейские оси.

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

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Например, если вы читаете данные из файла, то, очевидно, класс, реализующий файловый поток, будет иметь метод, аналогичный следующему: byte[] readBytes(int n); Теперь предположим, что вам нужно прочитать те же данные из сокета.

Класс, реализующий сокет, также будет иметь метод readBytes .

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

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

Единственное требование состоит в том, чтобы у каждого используемого объекта был метод. readBytes .



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

Представим себя на минутку инженерами автомобильного завода.

Наша задача — разработать современный автомобиль.

У нас уже есть предыдущая модель, которая зарекомендовала себя за долгие годы использования.

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

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

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

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

Кроме того, каждая модель будет иметь разную форму корпуса.

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

Более того, в каждой из моделей будет реализован какой-то новый функционал или конструктивная особенность.

В данном случае мы имеем дело с наследованием.

Наследование — свойство системы, позволяющее описать новый класс на основе существующего с частично или полностью заимствованным функционалом.

Класс, от которого осуществляется наследование, называется базовым или родительским классом.

Новый класс — это потомок, наследник или производный класс.

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

Что касается интерфейсов, каждый производный класс полностью реализует интерфейс своего родительского класса.

Обратное неверно.

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

Однако помимо этого у нас была бы возможность, например, включить противотуманные фары.

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

Теги: #ООП #обучение #обучение #лекция #Образовательный процесс в ИТ

Вместе с данным постом часто просматривают: