Lewati ke konten utama

Clean Architecture

Semua project mobile di Bit Group Asia wajib mengikuti prinsip Clean Architecture untuk memastikan separation of concerns, testability, dan maintainability.

Prinsip Utama​

  1. Independence of Frameworks — Arsitektur tidak bergantung pada framework tertentu.
  2. Testable — Business logic dapat ditest tanpa UI, database, atau API.
  3. Independence of UI — UI dapat berubah tanpa mengubah business logic.
  4. Independence of Database — Database dapat diganti tanpa mengubah business logic.

Layer Structure​

Dependency Rule​

Dependencies hanya boleh mengarah ke dalam (dari luar ke dalam).

  • Presentation → boleh depend ke Domain
  • Data → boleh depend ke Domain
  • Domain → TIDAK BOLEH depend ke Presentation atau Data

Implementasi per Platform​

// Domain Layer - Use Case
class GetUserUseCase(
private val repository: UserRepository // Interface
) {
suspend operator fun invoke(id: String): Result<User> {
return repository.getUser(id)
}
}

// Domain Layer - Repository Interface
interface UserRepository {
suspend fun getUser(id: String): Result<User>
}

// Data Layer - Repository Implementation
class UserRepositoryImpl(
private val api: UserApiService,
private val dao: UserDao,
) : UserRepository {
override suspend fun getUser(id: String): Result<User> {
return try {
val dto = api.getUser(id)
dao.insertUser(dto.toEntity())
Result.success(dto.toDomain())
} catch (e: Exception) {
val cached = dao.getUser(id)
if (cached != null) Result.success(cached.toDomain())
else Result.failure(e)
}
}
}
Mapping

Setiap layer memiliki model sendiri:

  • DTO (Data Transfer Object) — untuk komunikasi API
  • Entity — untuk penyimpanan lokal
  • Domain Model — untuk business logic dan presentation

Gunakan mapper/extension function untuk konversi antar model.