Ở 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
- Login, logout: ko có API chỉ cần làm đúng flow
- BASE_URL: https://api.themoviedb.org
- YOUR_API_KEY: xxx
- API lấy danh sách movie: https://api.themoviedb.org/3/movie/popular?api_key=YOUR_API_KEY
- API lấy chi tiết movie: https://api.themoviedb.org/3/movie/{movie_id}?api_key=YOUR_API_KEY
- API tìm kiếm movie: https://api.themoviedb.org/3/search/movie?api_key=API_KEY&query=YOUR_QUERY&page=PAGE_NUMBER
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 | +-- app |
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 | data class Movie( |
1 | data class Movie( |
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 | dependencies { |
- Đâ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.