Принцип единственной ответственности (Single Responsibility Principle, SRP)

Принцип единственной ответственности (Single Responsibility Principle, SRP) – это один из пяти принципов SOLID, который определяет, что каждый класс должен иметь только одну причину для изменения. Другими словами, класс должен быть ответственным только за одну функцию или задачу, и если вынуждены внести изменения в класс, это должно быть связано только с этой конкретной ответственностью.

Ключевые концепции SRP:

  1. Одна ответственность: Каждый класс должен решать только одну конкретную задачу или выполнять одну конкретную функцию. Если класс выполняет слишком много разных задач, это усложняет его понимание, поддержку и тестирование.
  2. Изменение по одной причине: Если вам приходится вносить изменения в класс, это должно происходить только из-за изменения требований к одной конкретной ответственности класса. Если класс выполняет несколько задач и требования к ним меняются независимо друг от друга, это может привести к ошибкам и проблемам в коде.
  3. Выделение вложенных ответственностей: Если вы обнаружите, что класс выполняет несколько разных задач, попробуйте разделить его на несколько более мелких классов, каждый из которых будет отвечать только за свою ответственность. Это позволяет создать более гибкий и понятный код.

Пример нарушения SRP:

python

class Employee: def calculate_salary(self): # Расчет заработной платы pass def save_to_database(self): # Сохранение данных о сотруднике в базу данных pass

В этом примере класс Employee имеет две разные ответственности: расчет заработной платы и сохранение данных в базу данных. Если требования к расчету заработной платы изменятся, это может повлиять на метод calculate_salary, но также может потребовать изменения метода save_to_database, что нарушает SRP.

С учетом SRP, классы должны быть разделены так, чтобы каждый выполнял только одну из этих ответственностей, что делает код более гибким и удобным для поддержки:

python

class SalaryCalculator: def calculate_salary(self): # Расчет заработной платы pass class EmployeeDatabase: def save_to_database(self): # Сохранение данных о сотруднике в базу данных pass

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