Kiến trúc sạch cho iOS

Tram Ho

Trong những năm qua, ngành công nghiệp phần mềm di động đã phát triển với một tốc độ chóng mặt. Trước đây các ứng dụng di động chủ yếu là nhỏ và thường chứa ít màn hình. Trong khi bây giờ có rất nhiều ứng dụng khổng lồ, với giao diện người dùng và business logic rất phức tạp.

Đối với các ứng dụng phức tạp thì mô hình MVC truyền thống bộc lộ nhiều khuyết điểm như: ViewController có mối quan hệ chặt chẽ với nhau đến mức mà phần Model gần như bị tách biệt làm cho việc Testing rất khó khăn, ViewController phình to vì chưa cả logic bussiness lẫn logic view làm cho việc đọc hiểu code để bảo trì và mở rộng rất khó khăn… Clean Architecture đã ra đời để giải quyết các vấn đề trên bằng việc phân tách rõ ràng các module dựa trên các nhiệm vụ riêng biệt.

Clean Architecture

Clean Architecture được giới thiệu bởi Robert C. Martin (a.k.a. Chú Bob) và nhận được sự quan tâm lớn của các developer. Clean Architecture là một business architecture, nó tách rời những xử lý nghiệp vụ khỏi UI và framework, phân rõ vai trò và trách nhiệm của từng layer trong kiến trúc của mình.

The Anatomy of the Clean Architecture

Có rất nhiều biến thể của Clean Architecture, trong iOS bạn có thể nghe nói về VIPER hoặc CleanSwift. Khi nhảy sang các nền tảng khác như .NET hay Android thậm chí còn có nhiều biến thể hơn. Tuy nhiên các biến thể đều có nhiệm vụ như nhau là tách rời những xử lý nghiệp vụ khỏi UI và framework và tuân thủ theo các qui tắc của Clean Architecture.

Dưới đây là danh sách các thành phần trong kiến trúc:

  • View: Giao diện hiển thị nơi xảy ra tương tác giữa app và người dùng, như Storyboard hoặc XIB.
  • Controller: Nhận các hành động hoặc event từ view và update nó.
  • Interactor: Lớp logic nghiệp vụ nơi Controller gửi các yêu cầu.
  • Presenter: Nhận phản hổi từ Interactor để gửi lại cho Controller.
  • Router: Có nhiệm vụ điều hướng các ViewController.

Phần cốt lõi của kiến trúc là Controller, Interactor, và Presenter. Một điều quan trọng cần lưu ý đây là kiến trúc unidirectional Data Flow tức là dữ liệu sẽ di chuyển theo 1 luồng xác định, điều này làm giảm đáng kể sự phức tạp, dễ dàng để quản lý.

Cách hoạt động:

  1. Người dùng tương tác với View
  2. Controller nhận sự kiện từ View để gửi đến Interactor.
  3. Interactor thực hiện các logic business và trả về kết quả cho Presenter
  4. Presenter format lại dữ liệu sau đó gửi lại về cho Controller thông qua viewModel
  5. Controller nhận dữ liệu từ Presenter sau đó update lại view.

Practice

Chúng ta định nghĩa các use-case cho từng layer tương ứng

Đây là flow xảy ra tại viewDidload interactor.fetchProducts > presenter.presentFetchedProducts > controller.displayFetchedProducts.

Controller :

Controller tạo một router và một instances đến Interactor thông qua 1 presenter. Gọi InteractorviewDidload để fetch list product.

Inject 1 productsWorker ở Interactor để xử lý API.

Presenter sẽ làm nhiệm vụ format lại dữ liệu respone và gọi controller để hiện thị lên View

Các Model được gói gọn trong một enum và chỉ liên quan đến trường hợp sử dụng riêng của nó.

Cuối cùng Router chịu trách nhiệm điều khiển các luồng đi của ứng dụng:

router.showProduct(for: productID)

Conclusion

Clean architechture rất linh hoạt, dễ dàng bảo trì và mở rộng.Mặc dù nó dài dòng hơn các kiến trúc khác, nhưng nó là cần thiết để làm giảm sự phụ thuộc giứa các layer trong ứng dụng.

Link tham khảo: https://basememara.com/swift-clean-architecture/

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo