Android MVVM Clean Architecture Reference Guide

CORE · cross-cutting · shared across all layers DATA LAYER Repository impl · Room · Retrofit · DataStore DOMAIN LAYER Pure Kotlin · no Android deps · testable in isolation PRESENTATION LAYER ViewModel · UI State · Compose / XML ViewModel StateFlow UI / Screen Compose UseCase Business logic Repository Interface only Models Pure Kotlin Repo impl Implements contract Remote DS Retrofit / API Local DS Room / DS Mappers DTO → Entity dependencies flow inward →
core cross-cutting data data layer domain domain layer ui presentation

Naming Conventions

Domain layer
domain/model/
Job.ktnoun only, no suffix
JobStatus.ktnoun only, no suffix
User.ktnoun only, no suffix
SortOrder.ktnoun only, no suffix
domain/repository/
JobRepository.ktnoun + Repository (interface)
UserRepository.ktnoun + Repository (interface)
domain/usecase/job/
GetJobsUseCase.ktVerb + noun + UseCase
GetJobByIdUseCase.ktVerb + noun + UseCase
AddJobUseCase.ktVerb + noun + UseCase
UpdateJobStatusUseCase.ktVerb + noun + UseCase
DeleteJobUseCase.ktVerb + noun + UseCase
domain/util/
JobValidator.ktnoun + Validator
PaginationHelper.ktnoun + Helper
Data layer
data/local/entity/
JobEntity.ktnoun + Entity (never just Job.kt)
UserEntity.ktnoun + Entity
data/local/entity/converters/
JobStatusConverter.ktnoun + Converter
InstantConverter.ktnoun + Converter
data/local/db/
AppDatabase.ktApp + Database
JobDao.ktnoun + Dao
UserDao.ktnoun + Dao
data/local/assets/
AssetDataSource.ktAsset + DataSource
JobAssetDto.ktnoun + Asset + Dto
AssetJobParser.ktAsset + noun + Parser
data/local/datastore/
UserPreferencesDataStore.ktnoun + Preferences + DataStore
data/remote/api/
JobApiService.ktnoun + ApiService
UserApiService.ktnoun + ApiService
data/remote/dto/
JobDto.ktnoun + Dto (never JobResponse.kt)
UserDto.ktnoun + Dto
ApiResponseWrapper.ktApi + Response + Wrapper
PaginatedResponse.ktPaginated + Response
data/remote/interceptor/
AuthInterceptor.ktnoun + Interceptor
LoggingInterceptor.ktnoun + Interceptor
NetworkErrorInterceptor.ktnoun + Interceptor
data/repository/
JobRepositoryImpl.ktnoun + Repository + Impl
UserRepositoryImpl.ktnoun + Repository + Impl
data/mapper/
JobMapper.ktnoun + Mapper (all directions in one file)
UserMapper.ktnoun + Mapper
data/di/
DataModule.ktlayer + Module
NetworkModule.ktconcern + Module
DatabaseModule.ktconcern + Module
Presentation layer
presentation/jobs/
JobsScreen.ktnoun (plural) + Screen
JobsViewModel.ktnoun (plural) + ViewModel
JobsUiState.ktnoun (plural) + UiState
presentation/jobs/components/
JobCard.ktnoun + Card
JobStatusChip.ktnoun + Chip
JobListItem.ktnoun + ListItem
presentation/jobdetail/
JobDetailScreen.ktnoun + Detail + Screen
JobDetailViewModel.ktnoun + Detail + ViewModel
JobDetailUiState.ktnoun + Detail + UiState
presentation/core/components/
LoadingView.ktstate + View
EmptyStateView.ktstate + View
ErrorView.ktstate + View
AppButton.ktApp + element type
AppTextField.ktApp + element type
presentation/core/theme/
AppTheme.ktApp + Theme
Color.ktnoun only
Typography.ktnoun only
Spacing.ktnoun only
Shape.ktnoun only
presentation/core/navigation/
AppNavGraph.ktApp + NavGraph
Routes.ktnoun only
NavExt.ktNav + Ext
presentation/core/extensions/
ModifierExt.kttype + Ext
ComposeExt.kttype + Ext
ContextExt.kttype + Ext
presentation/core/enums/
ScreenState.ktnoun only
BottomSheetType.ktnoun + Type
SnackbarType.ktnoun + Type
presentation/core/util/
ResourceProvider.ktnoun + Provider (interface)
ResourceProviderImpl.ktnoun + Provider + Impl
presentation/di/
PresentationModule.ktlayer + Module
Core layer
core/di/
AppModule.ktApp + Module
CoroutineModule.ktconcern + Module
core/util/
BitmapUtil.kttype + Util
DateUtil.kttype + Util
NetworkUtil.kttype + Util
FileUtil.kttype + Util
core/extensions/
FlowExt.kttype + Ext
StringExt.kttype + Ext
ContextExt.kttype + Ext
NumberExt.kttype + Ext
core/result/
Result.ktnoun only
ResultExt.ktnoun + Ext
core/constants/
AppConstants.ktApp + Constants
PreferenceKeys.ktnoun + Keys