Кто сформулировал принципы SOLID?

Ответ

Принципы SOLID были сформулированы и популяризированы американским инженером-программистом Робертом Мартином (широко известным как Uncle Bob).

Изначально он представил их в своей статье "Design Principles and Design Patterns" в 2000 году, а позже подробно описал в книге "Agile Software Development, Principles, Patterns, and Practices" (2002). Акроним SOLID был предложен позже Майклом Фезерсом.

Эти пять принципов объектно-ориентированного проектирования направлены на создание более понятных, гибких и поддерживаемых программных систем.

Расшифровка акронима SOLID:

  • S - Single Responsibility Principle (Принцип единственной ответственности): Класс должен иметь только одну причину для изменения.
  • O - Open/Closed Principle (Принцип открытости/закрытости): Программные сущности должны быть открыты для расширения, но закрыты для модификации.
  • L - Liskov Substitution Principle (Принцип подстановки Барбары Лисков): Объекты в программе должны быть заменяемы на экземпляры их подтипов без изменения правильности выполнения программы.
  • I - Interface Segregation Principle (Принцип разделения интерфейса): Клиенты не должны быть вынуждены зависеть от методов, которые они не используют.
  • D - Dependency Inversion Principle (Принцип инверсии зависимостей): Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба должны зависеть от абстракций.

Пример на Python (Single Responsibility Principle):

# Неправильно: класс делает две вещи - хранит данные и работает с БД
class BadUser:
    def __init__(self, name: str):
        self.name = name

    def save_to_db(self):
        print(f"Saving {self.name} to the database...")

# Правильно: обязанности разделены
class User:
    """Отвечает только за данные пользователя."""
    def __init__(self, name: str):
        self.name = name

class UserRepository:
    """Отвечает только за сохранение пользователя."""
    def save(self, user: User):
        print(f"Saving {user.name} to the database...")

# Использование
user = User("Alice")
repo = UserRepository()
repo.save(user)

Такое разделение упрощает тестирование, переиспользование и поддержку кода.