Расскажи про концепции ООП

«Расскажи про концепции ООП» — вопрос из категории ООП, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Четыре основных принципа (столпа ООП):

  1. Инкапсуляция: Сокрытие внутреннего состояния объекта и деталей реализации за публичным интерфейсом. На практике это означает объявление полей класса как private и предоставление контролируемого доступа через public методы (геттеры/сеттеры) или поведение.

    public class BankAccount {
        private double balance; // Состояние скрыто
    
        public void deposit(double amount) { // Публичный интерфейс
            if (amount > 0) {
                balance += amount;
                logTransaction("deposit", amount);
            }
        }
        public double getBalance() { return balance; } // Контролируемый доступ
    }
  2. Наследование: Механизм создания нового класса на основе существующего с повторным использованием его кода и поведение. Позволяет строить иерархии «является» (is-a).

    public class Vehicle { /* общие поля и методы */ }
    public class Truck extends Vehicle { // Грузовик *является* транспортным средством
        private int cargoCapacity;
        // + специфичные для грузовика методы
    }
  3. Полиморфизм: Способность объектов с одинаковой спецификацией (интерфейсом) иметь различную реализацию. Позволяет работать с объектами через интерфейс базового класса.

    • Полиморфизм во время выполнения (переопределение методов):
      public abstract class Shape {
          public abstract double calculateArea();
      }
      public class Circle extends Shape {
          private double radius;
          @Override
          public double calculateArea() { return Math.PI * radius * radius; }
      }
      // В коде можно вызывать shape.calculateArea(), не зная конкретного типа
  4. Абстракция: Выделение существенных характеристик объекта и игнорирование несущественных деталей. Достигается через абстрактные классы и интерфейсы.

    // Абстракция «Средство для сохранения данных»
    public interface DataPersister {
        void save(Data data); // Контракт без деталей реализации
    }
    // Конкретные реализации: в файл, в БД, в облако
    public class DatabasePersister implements DataPersister { ... }

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