Programming languages & Architectural Design

SOLID – Bài 1: Single Responsibility Principle

Nếu bạn muốn ngó lại bài trước, xin vào đây.

SOLID là viết tắt của 5 chữ cái đầu trong 5 nguyên tắc(principle) cơ bản về thiết kế OOP được giới thiệu bởi Robert C. Martin:
S: Single Responsibility Principle
O: Open/Close Principle
L: Liskov Substitution Principle
I: Interface Segregation Principle
D: Dependency Inversion Principle
Một chương trình một khi được thiết kế tuân thủ theo 5 nguyên tắc này sẽ trong sáng, dễ mở rộng và dễ bảo trì.
Để bắt đầu, chúng ta sẽ tìm hiểu nguyên tắc thứ nhất: Single Responsibility 
*Tôi tạm dịch nguyên tắc này là Đơn Tác Vụ cho các bạn dễ nhớ và dễ hình dung về nguyên tắc này.
Nội dung nguyên tắc này được phát biểu như sau: “Một class chỉ nên có một và chỉ một lý do để bị thay đổi.”
Điều này có thể hiểu là mỗi class khi được tạo ra, nó chỉ gánh 1 trọng trách nhất định, không nên dồn nhiều trọng trách khác nhau cho cùng 1 class.
Ví dụ: Một chương trình gửi mail tự động bao gồm 3 tác vụ:
– Check giờ gửi
– Tạo nội dung email
– Gửi mail
Đầu tiên, ta có thể code như sau:

Thoạt tiên chương trình trên trông khá ổn. Cho đến một hôm ông sếp khó tính của bạn muốn sửa chương trình trên thay vì kiểm tra giờ gửi theo múi giờ hiện tại, ông ta muốn kiểm tra theo múi giờ ở US. Tiếp theo ông ta muốn mã hóa toàn bộ email trước khi gửi. Bạn đang lười và thực sự là bạn cũng có 1 thằng bạn đồng nghiệp đang … ở không, hoàn toàn có thể nhờ nó. Tuy nhiên, khổ thay là vì hôm trước tất cả mấy cái method đó bạn nhét vô trong cùng 1 class cho nên 2 đứa phải làm cùng trên 1 file. Sau đó ngồi merge code oải gần chết… Vừa mới hì hục sửa xong, ông boss lại đòi gửi email thông qua server khác vì mail server bị hỏng, đồng thời check múi giờ với Thụy điển vì Email server ở Thụy điển… Đến đây chắc bạn sẽ phát điên …
Đó, vấn đề là như thế đó. Bây giờ, ta xem cách giải quyết vấn đề như dưới đây:
– Ta tách ra thành nhiều class, mỗi class đúng một tác vụ chuyên biệt:

– Sau đó dùng lại trong chương trình chính:

Kể từ đây, mỗi lần thay đổi cái gì, bạn chỉ việc lôi cái class liên quan đến tác vụ ấy mà thay đổi. Không cần phải merge code nữa. Đỡ phải tẩy xóa chương trình chính của bạn…
Thực ra, code ở trên chưa hoàn hảo lắm. Nhưng mình ko muốn đưa vào nhiều thứ quá, sợ các bạn ngộp. Thôi cứ tạm hài lòng ở bước này đã rồi mình polish nó dần dần sau khi tìm hiểu các chương sau.

Còn bây giờ, enjoy your coding! 🙂

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s