Какие существуют ключевые принципы объектно-ориентированного проектирования?

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

Ответ

Для создания гибких, масштабируемых и поддерживаемых систем в ООП используются проверенные временем принципы. Наиболее известными являются SOLID.

Принципы SOLID

Это акроним, обозначающий пять основных принципов:

  • S - Single Responsibility Principle (Принцип единственной ответственности) Класс должен иметь только одну причину для изменения. Это значит, что он должен решать одну четко определенную задачу.

  • O - Open/Closed Principle (Принцип открытости/закрытости) Программные сущности (классы, модули) должны быть открыты для расширения, но закрыты для модификации.

  • L - Liskov Substitution Principle (Принцип подстановки Барбары Лисков) Объекты в программе должны быть заменяемы на экземпляры их подтипов без изменения правильности выполнения программы.

  • I - Interface Segregation Principle (Принцип разделения интерфейса) Много специализированных интерфейсов лучше, чем один универсальный. Клиенты не должны зависеть от методов, которые они не используют.

  • D - Dependency Inversion Principle (Принцип инверсии зависимостей) Модули верхних уровней не должны зависеть от модулей нижних уровней. И те, и другие должны зависеть от абстракций.

Пример нарушения и исправления SRP

# ПЛОХО: Класс User отвечает и за данные, и за их сохранение
class User:
    def __init__(self, name):
        self.name = name

    def save_to_db(self):
        # ... логика подключения к БД и сохранения ...
        print(f"Пользователь {self.name} сохранен в БД.")

# ХОРОШО: Ответственности разделены
class User:
    def __init__(self, name):
        self.name = name

class UserRepository:
    def save(self, user: User):
        # ... логика подключения к БД и сохранения ...
        print(f"Пользователь {user.name} сохранен в БД.")

Другие важные принципы

  • DRY (Don't Repeat Yourself): Избегайте дублирования кода.
  • KISS (Keep It Simple, Stupid): Предпочитайте простые решения сложным.
  • Composition over Inheritance (Композиция вместо наследования): Отдавайте предпочтение построению сложных объектов из более простых, а не наследованию от них. Это обеспечивает большую гибкость.