Theo Robert C. Martin, SRP tuyên bố rằng:
Không bao giờ nên có nhiều hơn một lý do để một lớp thay đổi.
Tuy nhiên, trong cuốn sách Clean Code , chương 3: Hàm, ông cho thấy khối mã sau:
public Money calculatePay(Employee e) throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
Và sau đó tuyên bố:
Có một số vấn đề với chức năng này. Đầu tiên, nó lớn và khi các loại nhân viên mới được thêm vào, nó sẽ phát triển. Thứ hai, nó rất rõ ràng làm nhiều hơn một điều. Thứ ba, nó vi phạm Nguyên tắc Trách nhiệm Đơn lẻ (SRP) vì có nhiều hơn một lý do để nó thay đổi . [nhấn mạnh của tôi]
Đầu tiên, tôi nghĩ SRP được định nghĩa cho các lớp, nhưng hóa ra nó cũng có thể áp dụng cho các hàm. Thứ hai, làm thế nào mà chức năng này có nhiều hơn một lý do để thay đổi ? Tôi chỉ có thể thấy nó thay đổi vì sự thay đổi của Nhân viên.