Clean Architecture helps organize app code into clear parts. This makes apps easier to build, test, and change.
When building an app that will grow bigger over time.
When you want to keep your app easy to test and fix bugs.
When working in a team so everyone understands the code structure.
When you want to separate app logic from UI and data storage.
When you want to reuse parts of your app in other projects.
Syntax
Android Kotlin
interface UseCase {
fun execute()
}
class Repository {
fun getData(): String {
return"Data"
}
}
class ViewModel(private val useCase: UseCase) {
fun load() {
useCase.execute()
}
}
The layers communicate only in one direction.
Each layer has its own responsibility.
Examples
This is the domain layer interface. It defines app rules.
Android Kotlin
interface UseCase {
fun execute()
}
This is the data layer. It handles data fetching and storage.
Android Kotlin
class Repository {
fun getData(): String {
return"Data"
}
}
This is the presentation layer. It connects UI with app logic.
Android Kotlin
class ViewModel(private val useCase: UseCase) {
fun load() {
useCase.execute()
}
}
Sample App
This simple program shows three layers: domain, data, and presentation. The ViewModel calls the UseCase, which returns a greeting string.
Android Kotlin
interface UseCase {
fun execute(): String
}
class GetGreetingUseCase : UseCase {
override fun execute(): String {
return"Hello from Domain Layer!"
}
}
class Repository {
fun fetchData(): String {
return"Data from Data Layer"
}
}
class ViewModel(private val useCase: UseCase) {
fun showGreeting(): String {
return useCase.execute()
}
}
fun main() {
val useCase = GetGreetingUseCase()
val viewModel = ViewModel(useCase)
println(viewModel.showGreeting())
}
OutputSuccess
Important Notes
Keep dependencies pointing inward: outer layers depend on inner layers.
Domain layer should not depend on Android or any framework.
Presentation layer handles UI and user input only.
Summary
Clean Architecture divides app into layers: domain, data, and presentation.
Each layer has a clear job and talks only to the next layer inside.
This makes apps easier to maintain, test, and grow.
Practice
(1/5)
1. Which layer in Clean Architecture is responsible for business rules and logic? domain, data, or presentation?
easy
A. Presentation layer
B. Domain layer
C. Data layer
D. UI layer
Solution
Step 1: Understand the role of each layer
The domain layer contains business rules and logic, independent of UI or data sources.
Step 2: Match the layer to its responsibility
Since business logic is in the domain layer, it is the correct answer.
Final Answer:
Domain layer -> Option B
Quick Check:
Business logic = Domain layer [OK]
Hint: Business rules live in domain layer, not UI or data [OK]
Common Mistakes:
Confusing data layer with domain layer
Thinking UI handles business logic
Mixing presentation with domain
2. Which Kotlin syntax correctly defines a repository interface in the domain layer?
?
easy
A. interface UserRepository { fun getUser(id: Int): User }
B. class UserRepository { fun getUser(id: Int): User }
C. fun UserRepository() = User()
D. val UserRepository = object { fun getUser() = User() }
Solution
Step 1: Identify interface syntax in Kotlin
Interfaces use the keyword interface followed by function signatures without bodies.
Step 2: Check each option
interface UserRepository { fun getUser(id: Int): User } correctly declares an interface with a function signature. Others define classes or objects incorrectly for an interface.
Final Answer:
interface UserRepository { fun getUser(id: Int): User } -> Option A
Quick Check:
Kotlin interface syntax = interface UserRepository { fun getUser(id: Int): User } [OK]
Hint: Interfaces use 'interface' keyword with function signatures [OK]
Common Mistakes:
Using class instead of interface for repository
Defining function bodies inside interface
Using val or fun incorrectly for interface
3. Given this code snippet in the data layer:
class UserRepositoryImpl(private val api: UserApi) : UserRepository {
override fun getUser(id: Int): User {
return api.fetchUser(id)
}
}
What does getUser(5) return?
medium
A. Null because fetchUser returns nothing
B. An error because UserRepositoryImpl lacks a constructor
C. A User object fetched from the API with id 5
D. A compile-time syntax error
Solution
Step 1: Understand class and method behavior
UserRepositoryImpl implements UserRepository and calls api.fetchUser(id) to get a User.
Step 2: Analyze getUser(5) call
Calling getUser(5) returns the User object fetched by api.fetchUser(5), assuming api works correctly.
Final Answer:
A User object fetched from the API with id 5 -> Option C
Quick Check:
Method calls API and returns User [OK]
Hint: Implementation calls API method and returns result [OK]
Common Mistakes:
Assuming missing constructor causes error
Thinking fetchUser returns null by default
Confusing syntax errors with runtime behavior
4. Identify the error in this presentation layer code snippet:
class UserViewModel(private val repo: UserRepository) {
fun loadUser(id: Int) {
val user = repo.getUser(id)
println(user.name)
}
}
medium
A. UserViewModel should not call repository directly
B. User object might be null causing a crash
C. No error; code is correct
D. UserRepository interface is not implemented
Solution
Step 1: Recall Clean Architecture dependencies
The presentation layer (ViewModel) should depend on use cases in the domain layer, not directly on repository interfaces.
Step 2: Identify the violation
Directly injecting and calling UserRepository in ViewModel bypasses use cases, mixing concerns and violating layer separation.
Final Answer:
UserViewModel should not call repository directly -> Option A
Quick Check:
ViewModel -> UseCase -> Repository [OK]
Hint: ViewModels call UseCases, not Repositories directly [OK]
Common Mistakes:
Focusing on null safety (type system prevents null here)
Thinking no architecture error in the code
Assuming missing interface implementation
5. You want to add caching to your app using Clean Architecture. Where should the cache logic be placed? Options: A) In the domain layer B) In the data layer C) In the presentation layer D) In the UI components
hard
A. Domain layer to keep business rules
B. UI components for faster display
C. Presentation layer to update UI directly
D. Data layer to manage data sources including cache
Solution
Step 1: Understand caching responsibility
Caching is a data management concern, related to how data is stored and retrieved.
Step 2: Match caching to Clean Architecture layer
The data layer handles data sources like network, database, and cache, so caching logic belongs here.
Final Answer:
Data layer to manage data sources including cache -> Option D
Quick Check:
Cache logic = Data layer [OK]
Hint: Cache belongs in data layer managing data sources [OK]
Common Mistakes:
Putting cache in domain layer (business logic)
Adding cache in UI or presentation layers
Mixing UI concerns with data management
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.