Kiến trúc hệ thống trên Laravel – phần 4

Xin chào các bạn. Mình vào nghề lập trình cũng đã lâu, cũng có 1 số hiểu biết coi như là nâng cao về framework Laravel. Nên hôm nay mình xin chia sẻ 1 chút về kiến trúc hệ thống của mình được xây dựng trên Laravel như thế nào. Mong rằng có thể giúp ích cho các bạn :).

Đây sẽ là 1 series gồm 1 số phần như sau:


Hi, xin lỗi mọi người, dạo này mình bận quá, thỉnh thoảng lại mới có thời gian rảnh rỗi mới viết được bài mới. Hôm nay mình sẽ đi vào 1 cái gọi là design pattern. Vì mình không có nhiều thời gian lắm nên mình sẽ tranh thủ viết nhanh chứ không kỹ như các bài trước.

OK, nào, chúng ta vào design pattern.

Nghe nó có vẻ oách vậy thôi chứ thực tế design pattern là các bước viết code (kiểu như làm mẫu ý, có từng bước phải làm thế này thế kia) để giải quyết những vấn đề mà lập trình viên hay gặp phải. Vậy học design pattern là hiểu vấn đề gặp phải là như thế nào rồi quay lại cách giải quyết ra sao. Hôm nay chúng ta sẽ đi vào mẫu decorator. Thực tế mình chọn mẫu này trước vì nó có liên quan tới bài trước.

1. Vấn đề gặp phải

Nhắc lại bài trước nhé.

Bạn cần gửi email

Bạn cần gửi email + sms

Thế bạn cần gửi email + slack thì làm sao -> tất nhiên phải viết 1 class mới và inject MailAdapter + SlackAdapter vào __construct() rồi.

Bạn cần gửi email + sms + slack

Bạn thấy vấn đề chưa, cứ mỗi lần add up thêm service thì bạn lại phải thêm 1 cái dependency để inject vào -> cứ với chiều hướng này thì bạn sẽ inject quá nhiều biến vào __construct. Ngoài ra khi bạn ghép các dịch vụ với nhau, bạn lại cần phải viết 1 class mới (ví dụ như MailAndSlack, SmsAndSlack …) -> cực kỳ khó maintain :).

Vậy làm sao chỉ inject tối đa 2 biến vào __construct mà muốn add thêm bao nhiêu service nữa cũng được 😀

2. Cách giải quyết

Chúng ta sẽ giữ nguyên class EmailOnly với việc mặc định luôn luôn có việc gửi email ngay cả khi thêm các service khác vào

Và chúng ta viết lại hàm gửi SMS để có thêm thêm vào việc gửi Email

Bạn hãy so sánh class SmsAddOn với class MailAndSms ở trên, gần như giống nhau hoàn toàn trừ việc mình sử dụng interface Notify để inject vào class SmsAddOn chứ không inject dịch vụ cụ thể MailAdapter nữa -> hiện tại mình đã chuyển sang coding to interface rồi đó 😀

Ok, tương tự với việc bạn muốn add thêm dịch vụ slack thì bạn viết thế nào.

Thế muốn thêm dịch vụ mới, chẳng hạn như Skype chẳng hạn, thì làm thế nào. Giống hệt như trên thôi

Ok, thế ở nếu muốn sử dụng Sms kèm theo theo Email thì chúng ta làm thế nào. Thay vì viết hàm EmailAndSms như trên rồi binding interface thì chúng ta chỉ cần sửa lại phần binding thôi

Mình cũng có comment nếu add thêm các dịch vụ ở dưới thì chỉ cần thay đổi phần bindding là xong. Các bạn hãy đọc kỹ phần code ở trên nhé :).

Các bạn thấy đấy với cách viết này thì việc thêm dịch vụ mới chỉ là các bạn viết thêm class AddOn, rồi sau đó ghép các AddOn vào với nhau ở phần binding là xong -> bạn hoàn toàn không cần viết các biến thể cụ thể về việc ghép các dịch vụ với nhau (ví dụ như hoàn toàn  không cần viết EmailAndSlack, EmailAndSkype, EmailAndSmsAndSlack …)

Rồi, bài này đến đây là hết. Toàn code là code đọc thích mắt nhỉ :D. Xin cám ơn ^^.

P/S: ăn gian 1 tí, bên mình đang tuyển dụng nhân tài Laravel nhá, mong gặp bạn trong 1 ngày gần đấy

Portal Beanz Việt Nam tuyển dụng tháng 04 – 2017

    1. Thương Nguyễn April 21, 2017
      • Thành Nguyễn Trung April 21, 2017
    2. nguyễn văn duy August 30, 2017
      • Thành Nguyễn Trung August 30, 2017
    3. nguyễn văn duy August 30, 2017

    Add Your Comment