Phần tiếp theo từ trong ra ngoài, sau Domain là Platform. Nếu chưa đọc phần đầu của mình thì các bạn có thể đọc lại ở đây để nắm rõ hơn.
Platform ở đây là nơi implement các useCases theo platform thực sự của mình. Ví dụ ở Local Database phần Domain chỉ là nơi mà ta định nghĩa các useCases đối với các entries. Còn việc cụ thể thì platform Realm, CoreData sẽ làm. Ví dụ:
Trong Class PostsUseCases bên trong RealmPlatform:
Repository là gì? Các bạn khoan quan tâm, mình sẽ giải thích sau, hiện giờ tạm hiểu là 1 repo nơi mà làm các việc như storage, save, delete, v..v. Như vậy các bạn sẽ dễ hình dung hơn.
Như class trên, thì rõ ràng PostsUseCase đã conform Domain.PostsUseCase. Nó giống như 1 người thợ xây nhận bản vẽ của kiến trúc sư vậy, sau khi đọc xong bản vẽ và hiểu các yêu cầu, việc dùng cái gì là việc của thợ xây. Miễn cho ra output như Domain (kiến trúc sư) mong đợi là được.
Tiếp theo là class UseCaseProvider, đây giống như là 1 nơi tập hợp các useCases của các Entries khác nhau:
Như mình đã nói, để focus vào phần chính nên sẽ không giải thích các phần code bên lề để tránh bị loạn. Do đó tạm thời các bạn khoan để ý sâu code, mình sẽ có loạt bài giải thích riêng. Phần này để có cái nhìn tổng quát.
Thì nhiệm vụ của makePostsUseCase() là tương ứng với các Platform khác nhau sẽ có những makePostsUseCase() của những platform. Từ makePostsUseCase(), ta có thể gọi các implementation của các UsesCases đó ở phần Application.
a. Entities:
Entities là nơi ta tạo các Object thoả mãn các requirement của Platform của ta, ví dụ Realm thì phải conform Object, Codable thì conform Decodable và ngoài ra các property phải tương ứng với Entries bên phía Domain nếu cần. Ví dụ:
b. Convertion:
Câu hỏi đặt ra ở đây là một khi bạn tạo ra 2 Object riêng biệt ở 2 phần cũng riêng biệt, thì làm sao để mà có sự kết dính ở đây ? Do đó ta cần đến việc convert qua lại giữa các object. Ví dụ:
Thì mối quan hệ là như sau, RealmPlatform sẽ lấy giá trị bên Domain qua. Các bạn đọc phần code sau sau để hiểu rõ:
Trước hết mình sẽ giải thích code, sau đó mình sẽ giải thích lý do tại sao dùng?
+ Code bên protocol DomainConvertibleType: ta dùng associatedtype DomainType để sau này khi dùng ta sẽ gắn định nghĩa các Entries cho nó. Và hàm asDomain sẽ dùng để convert/ trả về DomainType đó.
+ Code bên RealmRepresentable: ta cũng tạo tương tự 1 associatedtype RealmType nhưng có ràng buộc 1 chút là phải conform thêm protocol DomainConvertibleType, với mục đích là object nào conform chú này thì có khả năng convert qua lại giữa DomainType và PlatformType (ở đây cụ thể là RealmType)
+ Nơi dùng 2 phần này thì chỉ cần extension nó là được:
Đến đoạn này mình thấy nên tạm dừng, phần sau sẽ kết hợp giải thích lý do tại sao dùng sau khi đi qua 1 lượt phần Application sau. Các bạn nắm rõ cho mình đoạn này là Object Type ở bên Platform có khả năng convert qua lại giữa DomainType và PlatformType.