Facade Pattern is like Singleton Pattern
Facade Pattern is like Singleton Pattern

Học Design Pattern: Facade Pattern – Why Always Me?

Facade Pattern đưa ra một khuyến nghị cho Dev khi viết Software mà muốn tích hợp giữa nhiều Module, Feature với nhau. Thay vì tham chiếu trực tiếp, hãy tham chiếu qua Facade để giúp đơn giản hóa sự phụ thuộc.

Vấn Đề Khi Làm Việc Cross Feature Modules

Trong phát triển dự án đương nhiên éo phải là anh em chỉ code 1 mình, hoặc chỉ code với những người gần gũi thân quen. Mà đôi khi là code với một anh bạn ở 1 múi giờ khác, 1 nền văn hóa khác hoàn toàn.

Giả sử như người bạn Dev kia đang làm việc cho Feature Login, còn anh em đang làm việc cho Feature Home Screen Layout. Và đặc tả của phần mềm là “User chưa login, vẫn có thể xem được Home Screen, nhưng khi nhấn vào bất kì Button nào đều sẽ phải hiện màn hình Login, sau khi Login thành công sẽ được trở về màn hình Home trước đó“.

Anh em đã build xong màn hình Home rồi, giờ muốn xử lý cho trường hợp user chưa login thì cần biết tối thiểu 2 thứ

  • Trạng thái Login của User: Dữ liệu này đang nằm ở SessionRepository
  • Hàm show Login Screen: Function này đang nằm ở đâu đó trong AuthNavigator

Giờ làm sao đây? Giải pháp là phải Import SessionRepository và cả AuthNavigator vào trong Home Screen? Hơi phức tạp đúng không? Vậy thì hãy để Facade Pattern giải quyết câu chuyện này cho Ae !!!

Giải Quyết Cross Feature Dependencies Với Facade Pattern

Thay vì lộ thiên SessionRepositoryAuthNavigator ra ngoài, ta tạo ra AuthFacade để chỉ cung cấp một Interface cần thiết và đơn giản nhất cho bên ngoài truy cập + sử dụng.

inteface AuthFacade {
  fun isAuth(): Boolean
  fun openLogin(): Unit
}

Trong logic của Home Screen chỉ cần tham chiếu đến AuthFacade để thực hiện các thao tác cần thiết dựa trên Business riêng của mình.

class HomeScreen : Screen {
  private val authFacade: AuthFacade by lazy { get<AuthFacade>() } // sampel code to get authFacade instance from provider
  
  fun handleInterceptClick() {
    if(authFacade.isAuth()) {
      return false
    } else {
      authFacade.openLogin()
      return true
    }
  }
}

Với cách triển khai này trong HomeScreen chỉ tham chiếu đến 1 Facade duy nhất để thực hiện lệnh điều khiển của mình lên Feature Login. Cách tiếp cận này giúp source code dễ hiểu và ngắn gọn hơn so với việc tham chiếu trực tiếp các Class / Interface của Feature / Module nhánh.

Lợi ích khi sử dụng Facade Pattern

  • Đơn Giản Hóa: Tư tưởng của Facade Pattern cung cấp một Interface đơn giản, dễ sử dụng cho các module khác.
  • Tăng tính encapsulate trong thiết kế: Ẩn đi sự phức tạp của Module, hướng đến sự giao tiếp và tách biệt.

Facade Pattern tóm lại là một công cụ giúp anh em quản lý sự phức tạp khi làm việc giữa nhiều module hoặc feature khác nhau. Bằng cách tạo ra một thực thể trung gian, anh em có thể giảm sự phụ thuộc, đơn giản hóa, và làm cho code trở nên dễ đọc hơn. Hãy sử dụng khi có thể nhé!

@dantech chúc anh em thành công!