Назовите ключевые преимущества и недостатки объектно-ориентированного программирования (ООП)

Ответ

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

Преимущества

  • Инкапсуляция: Сокрытие внутреннего состояния объекта и предоставление доступа к нему только через публичные методы. Это защищает данные от прямого неконтролируемого изменения и упрощает поддержку.
  • Наследование: Позволяет создавать новый класс (потомок) на основе существующего (родителя), переиспользуя его код и расширяя функциональность. Это способствует повторному использованию кода (DRY — Don't Repeat Yourself).
  • Полиморфизм: Возможность работать с объектами разных классов через единый интерфейс. Например, метод draw() может быть реализован по-разному для классов Circle и Square, но вызываться будет одинаково.
  • Абстракция: Выделение наиболее значимых характеристик объекта и игнорирование второстепенных. Это позволяет моделировать сложные системы, упрощая их восприятие.

Недостатки

  • Избыточная сложность: Для небольших и простых задач ООП-подход может быть избыточным и приводить к написанию большого количества шаблонного кода (boilerplate).
  • Накладные расходы на производительность: Динамическое связывание и вызовы виртуальных методов могут приводить к небольшим потерям производительности по сравнению с процедурным подходом.
  • Сложность проектирования: Неправильно спроектированная иерархия классов может привести к созданию жестко связанной и трудной для изменений системы (например, проблема "хрупкого базового класса").

Пример полиморфизма на Python:

from abc import ABC, abstractmethod
import math

# Абстрактный базовый класс (интерфейс)
class Shape(ABC):
    @abstractmethod
    def area(self) -> float:
        pass

# Конкретные реализации
class Circle(Shape):
    def __init__(self, radius: float):
        self.radius = radius

    def area(self) -> float:
        return math.pi * self.radius ** 2

class Rectangle(Shape):
    def __init__(self, width: float, height: float):
        self.width = width
        self.height = height

    def area(self) -> float:
        return self.width * self.height

# Функция работает с любым объектом, реализующим интерфейс Shape
def print_area(shape: Shape):
    print(f"Площадь фигуры: {shape.area():.2f}")

# Используем полиморфизм
shapes = [Circle(10), Rectangle(5, 8)]
for shape in shapes:
    print_area(shape)

# Вывод:
# Площадь фигуры: 314.16
# Площадь фигуры: 40.00