Назовите и объясните четыре основных принципа ООП.

«Назовите и объясните четыре основных принципа ООП.» — вопрос из категории Основы программирования, который задают на 24% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Четыре фундаментальных принципа объектно-ориентированного программирования (ООП):

  1. Инкапсуляция (Encapsulation)

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

      class BankAccount:
      def __init__(self):
          self._balance = 0  # Защищенный атрибут
      
      def deposit(self, amount):
          if amount > 0:
              self._balance += amount  # Изменение через публичный метод
      
      def get_balance(self):
          return self._balance  # Чтение через геттер
  2. Наследование (Inheritance)

    • Что это: Возможность создания нового класса (дочернего) на основе существующего (родительского), перенимая его свойства и методы.
    • Зачем: Для повторного использования кода, создания иерархий и реализации полиморфизма.
    • Пример на Java:
      class Vehicle {
      void move() { System.out.println("Vehicle is moving"); }
      }
      class Car extends Vehicle { // Car наследует от Vehicle
      @Override
      void move() { System.out.println("Car is driving"); }
      }
  3. Полиморфизм (Polymorphism)

    • Что это: Способность объектов с одинаковым интерфейсом (методом) иметь разную реализацию.
    • Зачем: Для написания гибкого, обобщенного кода, который работает с объектами разных типов.
    • Пример:
      
      from abc import ABC, abstractmethod
      class Shape(ABC):
      @abstractmethod
      def area(self):
          pass

    class Circle(Shape): def area(self): return 3.14 * self.radius 2 # Своя реализация class Square(Shape): def area(self): return self.side 2 # Своя реализация

    Полиморфный вызов

    shapes = [Circle(5), Square(4)] for s in shapes: print(s.area()) # Вызывается правильный метод для каждого объекта

  4. Абстракция (Abstraction)

    • Что это: Выделение существенных характеристик объекта и игнорирование нерелевантных деталей. Реализуется через абстрактные классы и интерфейсы.
    • Зачем: Для управления сложностью, позволяя работать с высокоуровневыми концепциями, а не с деталями реализации.
    • Пример на C#:
      
      // Абстракция "Транспортное средство"
      interface IVehicle
      {
      void StartEngine(); // Контракт, скрывающий детали
      void StopEngine();
      }

    class Car : IVehicle { public void StartEngine() { / Сложная логика зажигания / } public void StopEngine() { / Логика остановки / } } // Пользователь кода знает только о StartEngine(), а не о том, как он работает.