1. Знакомство с принципами ООП

Сегодня вы откроете для себя новый и интересный мир. Этот мир называется ООПобъектно-ориентированное программирование. Ранее вы уже познакомились с классами и объектами. Сегодня вы узнаете о них еще больше, намного больше.

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

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

Опробовали много подходов, и на основе лучших практик сформулировали 4 принципа ООП. Это: абстракция, инкапсуляция, наследование и полиморфизм. Раньше их было только три, но потом решили добавить еще и абстракцию.


2. Абстракция

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

Но вроде бы лучшие умы сошлись на том, что:

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

В языке программирования Java абстракция осуществляется через использование абстрактных классов и интерфейсов.

Абстракция в реальной жизни

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

Представьте, что вы проектируете структуру своей будущей компании. Вы можете разделить обязанности секретаря: «разбросать» их по нескольким другим должностям. Можете разбить должность исполнительного директора на несколько независимых должностей: финансовый директор, технический директор, директор по маркетингу, директор по персоналу. Или, например, объединить должности офис-менеджера и рекрутера в одну.

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

Знакомство с принципами ООП. Абстракция

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


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

Цель инкапсуляции — улучшить качество взаимодействия вещей за счет их упрощения.

Знакомство с принципами ООП.Инкапсуляция

А лучший способ упростить что-то — скрыть все сложное от посторонних глаз. Например, если вас посадят в кабину Боинга, вы не сразу разберетесь, как им управлять:

Знакомство с принципами ООП.Инкапсуляция

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

С точки зрения программирования, инкапсуляция — это «сокрытие реализации». Мне нравится такое определение. Наш класс может содержать сотни методов и реализовывать очень сложное поведение в различных ситуациях. Но мы можем скрыть от посторонних глаз все его методы (пометить модификатором private), а для взаимодействия с другими классами оставить всего пару-тройку методов (пометить их модификатором public). Тогда все остальные классы нашей программы будут видеть в этом классе всего три метода и вызывать именно их. А все сложности будут скрыты внутри класса, как кабина пилотов от счастливых пассажиров.


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

У наследования есть две стороны. Сторона программирования и сторона реальной жизни. С точки зрения программирования, наследование — это специальное отношение между двумя классами. Но гораздо интереснее, что же такое наследование с точки зрения реальной жизни.

Если нам понадобится что-то создать в реальной жизни, у нас есть два решения:

  1. Создать нужную нам вещь с нуля, потратив кучу времени и сил.
  2. Создать нужную нам вещь на основе уже существующей.

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

Если мы проследим историю возникновения человека, то окажется, что с момента зарождения жизни на планете прошли миллиарды лет. А если представить, что человек возник из обезьяны (на основе обезьяны), то прошла всего пара миллионов лет. Создание с нуля — дольше. Гораздо дольше.

В программировании тоже есть возможность создавать один класс на основе другого. Новый класс становится потомком (наследником) уже существующего. Это очень выгодно, когда есть класс, который содержит 80%-90% нужных нам данных и методов. Мы просто объявляем подходящий класс родителем нашего нового класса, и в новом классе автоматически появляются все данные и методы класса-родителя. Правда, удобно?


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

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

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

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

ООП — это принципы. Внутренние законы. Каждый из них нас в чем-то ограничивает, давая взамен большие преимущества, когда программа вырастает до больших размеров. Четыре принципа ООП — это как четыре ножки стула. Убери хотя бы одну, и вся система станет неустойчивой.


undefined
11
Задача
Java Syntax Pro, 11 уровень, 5 лекция
Недоступна
Сравнение строк
В методе main объявлены переменные типа String. В консоли выводится результат их сравнения: если строки равны, выводится true, иначе — false. Тебе нужно раскомментировать одну строку, чтобы получился следующий вывод: true true Тело метода main менять нельзя: можно только раскомментировать одну стр
undefined
11
Задача
Java Syntax Pro, 11 уровень, 5 лекция
Недоступна
Два айфона
В методе main создаются два айфона с одинаковыми параметрами. В консоли выводится результат их сравнения. Разберись, почему сейчас результат отрицательный и сделай так, чтобы он был положительным. Для этого тебе нужно переопределить метод equals(Iphone), который будет учитывать все параметры. У двух
undefined
11
Задача
Java Syntax Pro, 11 уровень, 5 лекция
Недоступна
Создаем свой hashCode
Напиши свою реализацию hashCode, используя переменные model и year. Если эти поля у двух объектов одинаковые, то должен возвращаться одинаковый hashCode. Если правильно реализовать метод hashCode, вывод должен быть таким: true true true true false false