Будь в курсе объектно-ориентированного программирования!

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Читать в полной версии →

«Объектно-ориентированное программирование — исключительно плохая идея, которая могла родиться только в Калифорнии». Эдсгер Дейкстра

Это перевод статьи Джорджана Барроуза, фронтенд-разработчика в J.P. Morgan Chase

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

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

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

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

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

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

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

Абстракция

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

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

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

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

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

Абстракция == скрытая реализации

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

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

Например, если у вас есть объект таблицы с открытыми полями, вы сможете установить поля в любое время. Вы можете подумать, что это не имеет значения, но что если вы где-нибудь случайно установите table.legs = null? Это может сломать весь объект и приложение (поскольку это уже не таблица).

Однако, если вы инкапсулируете это поле в установщике setLegs(null), вы можете добавить проверку, которая игнорирует установку «legs» в значение null, тем самым укрепляя приложение.

Инкапсуляция == сокрытие информации

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

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

Например, класс Student и класс Teacher могут быть дочерними элементами класса Person. Ученик и Учитель наследуют поля (firstName, lastName, dateOfBirth) и методы (doWork(), goToSchool()) класса Person.

Классы Student или Teacher теперь имеют доступ к данным и методам Person. Таким образом любые объекты, которые создают копии этих двух классов, также могут вызывать их (если они общедоступны).

В Java наследование достигается путем «расширения» родительского класса.

Полиморфизм

Честно говоря, звучит круче, чем есть на самом деле. Полиморфизм — это условие существования нескольких различных форм. В ООП полиморфизм позволяет данным или методам с одним и тем же именем означать разные вещи в разных контекстах. Но что это вообще значит?

Взгляните еще раз на пример наследования. Поскольку и Ученик, и Учитель наследуют функцию doWork() от класса Person, они оба могут вызывать ее. Мы также можем предложить им реализовать собственный способ «делать работу».

Это называется переопределением метода из родительского класса. Теперь всякий раз, когда создается объект «Учитель» и вызывается функция doWork(), Учитель будет «оценивать работы». И если объект Person и вызывает doWork(), он просто «читал книгу».

Другой случай, когда вы увидите полиморфизм в действии, — это перегрузка метода. Перегрузка достигается за счет изменения количества аргументов и/или изменения типа аргументов в методе.

Например, в классе House у вас могут быть следующие методы:

Вывод

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