«Объектно-ориентированное программирование — исключительно плохая идея, которая могла родиться только в Калифорнии». Эдсгер Дейкстра
- Что такое объектно-ориентированное программирование
- Абстракция
- Инкапсуляция
- Наследование
- Полиморфизм
- Вывод
Это перевод статьи Джорджана Барроуза, фронтенд-разработчика в 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 у вас могут быть следующие методы:
paint()
paint(String color)
paint(String color1, String color2)
paint(boolean usePrimer)
Вывод
Объяснения этих четырех понятий очень общие, потому что я хотел сделать их понятными для самого широкого круга читателей. Оставьте комментарий ниже с любыми другими примерами и словами по этим темам или ООП в целом. Спасибо!