Nguyên tắc trách nhiệm duy nhất

Trong lập trình hướng đối tượng, nguyên tắc trách nhiệm duy nhất (tiếng Anh: single responsibility) phát biểu rằng mỗi lớp chỉ nên có một trách nhiệm duy nhất, và rằng trách nhiệm đó nên được đóng gói hoàn toàn bởi lớp đó. Tất cả các dịch vụ của lớp đó cần được định hướng chặt chẽ theo trách nhiệm đó.

Thuật ngữ 'trách nhiệm duy nhất' do Robert C. Martin đưa ra trong một bài viết cùng tên trong loạt bài Principles of Object Oriented Design của ông về các nguyên tắc thiết kế hướng đối tượng
. Nguyên tắc này được phổ biến bởi cuốn sách cùng tác giả, Agile Software Development, Principles, Patterns, and Practices. Martin mô tả nguyên tắc này dựa trên nguyên tắc về tính mạch lạc (cohesion) mà Tom DeMarco mô tả trong cuốn Structured Analysis and Systems Specification.

Martin định nghĩa một trách nhiệm là một lý do để sửa, và kết luận rằng một lớp hoặc một mô-đun chỉ nên có một và chỉ một lý do để sửa. Ví dụ, xét một mô-đun biên soạn và in một báo cáo. Một mô-đun như vậy có thể bị sửa vì hai lý do. Thứ nhất, nội dung của báo cáo có thể thay đổi. Thứ hai, định dạng của báo cáo có thể thay đổi. Hai thứ đó thay đổi vì những nguyên nhân rất khác nhau; một bên mang tính nội dung, bên kia mang tính hình thức. Nguyên tắc trách nhiệm duy nhất nói rằng hai khía cạnh đó của cùng một bài toán thực sự là hai trách nhiệm riêng biệt, và do đó nên nằm trong hai lớp hay mô-đun khác nhau. Sẽ là một thiết kế tồi nếu ghép cặp lại với nhau hai thứ có thể thay đổi vì những lý do khác nhau tại những thời điểm khác nhau.

Việc giữ cho một lớp chỉ tập trung vào một trách nhiệm duy nhất có tầm quan trọng ở chỗ nó cho phép lớp đó có sức bền cao. Xét tiếp ví dụ ở trên, trong tình huống có một thay đổi đối với quy trình biên soạn báo cáo, nếu phần chương trình xử lý in báo cáo nằm trong cùng một lớp với phần xử lý biên soạn nội dung, thì khả năng phần xử lý in đó bị sự cố là cao hơn.

Tham khảo

Xem thêm
 Separation of concerns
 Chain-of-responsibility pattern
 Cohesion (computer science)
 Nguyên tắc mở/đóng (Open/closed principle)
 SOLID (thiết kế hướng đối tượng)

Thiết kế phần mềm
Nguyên tắc lập trình