S — Single Responsibility Principle (Роберт Мартин): у класса должна быть только одна причина для изменения. «Причина» — не кусок кода, а человек или группа, требующие изменения (актор): бухгалтерия, HR, DBA и т. д. SRP не значит «один метод на класс»: класс должен обслуживать одного актора.
Нарушение: «божественный класс»
Employee делает три дела: считает зарплату (бухгалтерия), строит текст отчёта (HR), пишет в базу (DBA). Когда бухгалтерия меняет коэффициент сверхурочных, мы правим тот же класс, и save с отчётом оказываются под угрозой.
class Employee:
def __init__(self, name, rate, hours):
self.name, self.rate, self.hours = name, rate, hours
def calculate_pay(self): # changed by Accounting
overtime = max(0, self.hours - 160)
return (self.hours - overtime) * self.rate + overtime * self.rate * 1.5
def hours_report(self): # changed by HR
return f"{self.name}: {self.hours} h"
def save(self, db): # changed by the DBA
db[self.name] = self.hours