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

Liệt kê toàn bộ tập tin, lưu vào mảng và các ví dụ liên quan trong bash script

Đôi lúc chúng ta cần lưu kết quả sau khi thực hiện lệnh ls hoặc lệnh find vào một mảng (array) để xử lý cho một yêu cầu nhỏ nào đó.
Trong bài này chúng ta sẽ tìm các file có đuôi .sql trong một thư mục, sau đó in ra tên không chứa đuôi .sql của từng tập tin.
Đầu tiên chúng ta cần list ra những file có đuôi .sql với lệnh ls và lưu vào array ten la files

Sau đó chúng ta tiến hành loop để in chỉ tên tập tin không co duoi .sql ( abc.sql thoi nhe, abc.xyz.sql ?? 😀 😛 )

Các bạn có thể mở rộng yêu cầu, chẳng hạn bạn muốn đọc từng file .sql ứng với từng table trong postgres database chẳng hạn, sau đó dùng lệnh pg_restore
ví dụ nhé:

Với $1 là param đuờng dẫn đến thư mục chứa file .sql.
Sau đó các bạn có thể lưu lại thành 1 file jjdo.sh, sau đó chạy :

P/S:
Để thay thế 1 pattern trong bash ta dùng ${var_name#shortest_matched_pattern} hoặc ${var_name#longest_matched_pattern} # tìm từ đầu – % tìm từ cuối