Ответ
Принципы 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)
Такое разделение упрощает тестирование, переиспользование и поддержку кода.