Hook
More breakout videos from this creator.
Tôi không quan tâm đến công nghệ. Tôi chỉ quan tâm về nghiệp vụ. Anh không nên kiểu học SOLID mà nó gắn chặt vào một cái kiến trúc nào quá đâu. Bởi vì SOLID nó tách biệt ấy. Trong SOLID cái D ấy thì mọi người thường hiểu nó là dependency inversion đúng không? Trong thực tế khi mà triển khai thì nó phải là hai thằng DI nữa. Một là vẫn là thằng Dependency Inversion nhưng mà một thằng nữa phải đi kèm vào đấy là dependency injection. Có nghĩa là anh invert rồi thì anh cũng phải kết hợp với cả inject nữa. Nếu mà anh chỉ có mỗi invert không thì code của anh nó vẫn thối. Đây nhá em lấy một ví dụ nhá. DI này. Anh có một protocol interface đúng không? Ví dụ UserDataProvider này. Trong này anh có một cái hàm fetchUsers đi. Trả ra mảng User. Tất nhiên nó phải async và có thể nhả ra lỗi. Anh có một class. Ví dụ anh dùng thằng Sqlite chẳng hạn. Ví dụ như thế. Sau đó anh có một màn hình UserScreen như này đi. Em phải import SwiftUI vào. Anh sẽ phải lấy list users đó ra. Em cứ ví dụ như này nhé. Anh sẽ phải có một task để lấy đống data về. Thì chỗ này như bình thường không dùng SOLID ở đây thì sẽ lấy trực tiếp thằng này. Nó gọi là Sqlite. Khởi tạo trực tiếp ở đây luôn. Nhưng như thế này thì nó đang chưa có SOLID. Code của anh nó đang bị dính chặt vào cái thằng này. Chưa có dependency injection đúng không? Chưa có dependency inversion. Thì chỗ này muốn code của anh nó kiểu nó lỏng hơn ấy, nó không còn phụ thuộc vào thằng Sqlite. Ví dụ sau này anh lại đổi Sqlite đi thì sao? Anh đổi nó sang anh dùng trực tiếp API thì sao? Anh dùng firebase firestore thì sao? Postgres, anh dùng các Database khác. Chú ý cái variable name nữa. Nó cũng phải là khác. Nó cũng phải là generic. Chứ nó không kiểu Sqlite này đâu. Anh chỉ cần gọi nó là UserDataProvider là được rồi. Và chỗ này anh dùng cái protocol này. Có nghĩa là tôi chỉ quan tâm về nghiệp vụ thôi. Tôi chỉ quan tâm về usecase thôi. Tôi không quan tâm đến công nghệ. Đấy nói thẳng luôn tôi không quan tâm đến công nghệ. Tôi chỉ quan tâm về nghiệp vụ. Nhưng mà đây anh đã áp dụng anh đã đang áp dụng DI rồi nhá. Đã Dependency Inversion rồi nhá. Nhưng mà anh thấy anh thấy có điều gì cần cấn không? Nó cũng chẳng nghĩ gì cả tại vì nó đâu có nó đâu có set được thằng này là một thằng khác đâu. Đúng không? Nó đâu có bởi vì nó vẫn đang dính với cái thằng Sqlite này. Đây đây đây mới là lúc thiếu dependency injection đúng không? Ờ thì chỗ này anh phải có dependency injection vào nữa thì nó mới là chuẩn SOLID. Theo theo nói nôm na là mình tiêm cái thằng UserDataProvider từ nơi khác vào đây. Và anh có thể inject nó thông qua constructor nhá. Đấy nó không phải là hình thức đúng không? Mình Đấy nó phải như thế này. Cũng không được dùng default parameter ở đây như này nhé. Thế này nó vẫn đang depend vào. Không, như này nếu như ở chỗ anh gọi đến nó, khởi tạo nó anh truyền vào thằng khác thì vẫn là không depend mà. Nó chỉ là trong điều kiện không truyền thì nó lấy thằng này thôi. Không, nếu mà anh để default parameter vẫn là ở trong file này ấy, anh vẫn phải import cái file mà chứa cái thằng Sqlite này này. Ví dụ anh define nó trong một cái package nhỏ nhá. À, em em phải import package kia vào đây. Nó nó nằm trong ví dụ Sqlite Kit. Thì có nghĩa là anh muốn lấy thằng Sqlite UserDataProvider ra ở đây thì anh vẫn phải import, anh vẫn phải depend vào cái library này. Có nghĩa là cả cái file này của anh nó không generic. Nó không generic. Tức là nếu anh quản nếu anh quản sang một cái một cái project khác hoặc một cái chỗ khác đi thì nó sẽ bị import ngay đúng không? Nó vẫn dính vào cái thằng này. Thế nên ấy mục tiêu của mình ấy là phải lỏng nhất có thể. Đã DI rồi, đã làm cho mọi thứ lỏng lẻo rồi thì nó chả quan tâm về công nghệ nữa. Nó chả quan tâm là Sqlite hay gì nữa. Thằng thằng nào dùng cái thằng UserScreen này này thì đi mà truyền data provider tương ứng vào. Ví dụ anh có hẳn cái file khác đi. MainScreen đi. Anh mới bắt đầu anh import Sqlite Kit kia của anh vào. Rồi chỗ này anh mới gọi là gì? Sqlite. Xong anh mới truyền vào. Khởi tạo và truyền vào. Thì cái file UserScreen này này thì nó xài cả hai thằng này chính xác hơn là nó phải nằm ở trong một cái file khác. Cái file này của anh nó sẽ chỉ có từng này thôi.