The Clean Architecture - Part 2

phần 1, mình đã trình bày những kiến thức cơ bản liên quan đến Clean Architecture. Phần này mình sẽ đi cụ thể về cách triển khai nó cho 1 dự án Android.

Dự án: The Movie Db

Yêu cầu

  • Login: login done -> danh sách movies
  • Logout: logout done -> login screen
  • Danh sách movies: click 1 movie -> chi tiết movie
  • Chi tiết movie
  • Tìm kiêm movie theo tên
  • Cho phép người dùng thay đổi theme ứng dụng
  • Hiẹn loading khi tải dữ liệu
  • Thông báo khi có lỗi xảy ra

Tài liệu

1. Công nghệ áp dụng

Jetpack component

view more component at https://developer.android.com/jetpack/androidx/explorer

UI component

how to use theme, style

sample: https://github.com/material-components/material-components-android-examples

API Network

Database

Thread & Asynchronous

Dependency Injection

Images

Testing

run test coverage: ./gradlew clean testDevDebugUnitTestCoverage

view jacoco report at: app/build/reports/jacoco/testDevDebugUnitTestCoverage/html/index.html

view more at gradle.build.kts file

Style coding

./gradlew ktlintCheck

./gradlew ktlintFormat

2. Cấu trúc project

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+-- app
| +-- model
| +-- di
| +-- ui
| +-- utils
+-- data
| +-- model
| +-- di
| +-- remote
| +-- local
| +-- repository
+-- domain
| +-- usecase
| +-- reopsitory
+-- entity
+-- base
| +-- ui
| +-- uikit

Về cơ bản bạn chỉ cần quan tâm đến 5 module lớn là app, base, data, domain, entity (ngoài ra còn 1 số module phụ dùng để cấu hình project, tiện ích…). Vậy các module này tương ứng khi tạo trên Android Studio sẽ như thế nào???

  • app: Android Application (module mặc định khi tạo mới project)
  • data, base: Android Library

  • domain, entity: Java or Kotlin Library

3. Coding entity module

  • Đây là module độc lập nhất, không bị phụ thuộc bởi module nào. Đây là nơi chứa các entity: Movie, User…
1
2
3
4
5
6
7
8
9
data class Movie(
val id: Int,
val title: String? = null,
val posterPath: String? = null,
val backdropPath: String? = null,
val voteAverage: Float? = null,
val overview: String? = null,
val releaseDate: Long? = null
)
1
2
3
4
5
data class Movie(
val id: Int,
val username: String,
val password: String
)

4. Coding domain module

  • Module này có 1 phụ thuộc là entity module, do cần add thêm dependency trong gradle.
1
2
3
4
5
6
dependencies {

...
implementation(project(Modules.entity))
...
}
  • Đây là nơi định nghĩa các use case: login, logout, get movie, search movie…. Để việc thực hiện các use case này được trong suốt với database, network… và quan trọng là không vi phạm quy tắc của kiến trúc, thì sẽ cần có thêm các Repository Interface tương ứng.

5. Coding data module

6. Coding base module

7. Coding app module