Single Responsibility trong SOLID Principle

Bài viết này bàn về S trong SOLID principle.

Trong bài viết này http://longka.info/blog/2015/10/26/a-note-about-solid-principles-demo-in-symfony2/ , mình nói sơ qua về ý nghĩa của từng nguyên tắc trong SOLID và demo với symfony2.

S: Single Responsibility  – tức là một class chỉ nên đảm nhận một nhiệm vụ, hoặc một class nếu có một lý do nào đó để thay đổi thì chỉ có một lý do ( A class should have only one reason to change [1])

Để hiểu rõ hơn, mình sẽ phân tích một ví dụ nó vi phạm qui tắc S sờ này, và làm sao để refactor nó đáp ứng qui tắc S (sờ, không phải rờ mó lung tung nhé).

Giả sử ta có một class Student như sau:

Trong ví dụ về class Student ở trên, bản thân class Student không cần phải quan tâm đến việc kết nối cơ sở dữ liệu thế nào, nó chỉ cần quan tâm đến các thông tin liên quan đến Student, những khóa học mà sinh viên đã đăng ký, hoặc đã học ( bảng enrollment ). Một lý do khác nữa, đó là giả sử sau này khi ta muốn thay đổi thông tin liên quan cơ sở dữ liệu (câu truy vấn, hệ quản trị csdl) ta cũng phải chạy vào class này chỉnh sửa.
Do đó chúng ta cần phải re-factor để khớp với qui tắc Sờ (Lờ) như sau:

Soure code on github https://github.com/nguyentienlong/solid-tut/blob/s-principle/src/Database.php#L8

Lúc đó, bên Class Student, bạn không cần phải quan tâm đến thông tin của db, việc kết nối db thế nào, etc… Hàm getCourses trong class student bây giờ sẽ như  thế này: https://github.com/nguyentienlong/solid-tut/blob/s-principle/src/Student.php#L38

Tuy nhiên bản thân class Student cũng không nên quan tâm lắm đến việc sql truy vấn thế nào, với các hệ quản trị cơ sở dữ liệu khác nhau thì câu query lại khác nhau, khi muốn sửa code chúng ta lại fai vào class Student này để sửa, lý do này không liên quan đế trách nhiệm và bổn phận của class Student. Những thứ liên quan đến db hay move sang class Database.

Do đó, chúng ta refactor lại class Database cho phù hợp với nguyên tắc S sờ như sau

Qua 2 lần refactor, chuẩn Sờ S ?

File database.sql https://github.com/nguyentienlong/solid-tut/blob/master/database.sql – mình dùng postgres sql làm demo.

References:
[1] https://en.wikipedia.org/wiki/Single_responsibility_principle