From f6a470de6343830da3df2698e63a7de05c6c9850 Mon Sep 17 00:00:00 2001 From: ali Date: Sat, 7 Mar 2026 19:40:47 +0100 Subject: [PATCH] fix: resolve semantic mismatch between UseCase naming and ViewModel usage --- rules/kotlin/patterns.md | 13 ++++++++++--- rules/kotlin/testing.md | 2 +- skills/compose-multiplatform-patterns/SKILL.md | 2 +- skills/kotlin-coroutines-flows/SKILL.md | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/rules/kotlin/patterns.md b/rules/kotlin/patterns.md index ee5e4f14..23071cde 100644 --- a/rules/kotlin/patterns.md +++ b/rules/kotlin/patterns.md @@ -15,14 +15,14 @@ Prefer constructor injection. Use Koin (KMP) or Hilt (Android-only): // Koin — declare modules val dataModule = module { single { ItemRepositoryImpl(get(), get()) } - factory { GetItemUseCase(get()) } + factory { GetItemsUseCase(get()) } viewModelOf(::ItemListViewModel) } // Hilt — annotations @HiltViewModel class ItemListViewModel @Inject constructor( - private val getItem: GetItemUseCase + private val getItems: GetItemsUseCase ) : ViewModel() ``` @@ -36,7 +36,7 @@ data class ScreenState( val isLoading: Boolean = false ) -class ScreenViewModel(private val useCase: GetItemUseCase) : ViewModel() { +class ScreenViewModel(private val useCase: GetItemsUseCase) : ViewModel() { private val _state = MutableStateFlow(ScreenState()) val state = _state.asStateFlow() @@ -58,6 +58,7 @@ class ScreenViewModel(private val useCase: GetItemUseCase) : ViewModel() { ```kotlin interface ItemRepository { suspend fun getById(id: String): Result + suspend fun getAll(): Result> fun observeAll(): Flow> } ``` @@ -72,6 +73,12 @@ class GetItemUseCase(private val repository: ItemRepository) { return repository.getById(id) } } + +class GetItemsUseCase(private val repository: ItemRepository) { + suspend operator fun invoke(): Result> { + return repository.getAll() + } +} ``` ## expect/actual (KMP) diff --git a/rules/kotlin/testing.md b/rules/kotlin/testing.md index 1356ec82..98a2e38d 100644 --- a/rules/kotlin/testing.md +++ b/rules/kotlin/testing.md @@ -21,7 +21,7 @@ paths: fun `loading state emitted then data`() = runTest { val repo = FakeItemRepository() repo.addItem(testItem) - val viewModel = ItemListViewModel(GetItemUseCase(repo)) + val viewModel = ItemListViewModel(GetItemsUseCase(repo)) viewModel.state.test { assertEquals(ItemListState(), awaitItem()) // initial state diff --git a/skills/compose-multiplatform-patterns/SKILL.md b/skills/compose-multiplatform-patterns/SKILL.md index 62b01e28..70e4ac65 100644 --- a/skills/compose-multiplatform-patterns/SKILL.md +++ b/skills/compose-multiplatform-patterns/SKILL.md @@ -31,7 +31,7 @@ data class ItemListState( ) class ItemListViewModel( - private val getItems: GetItemUseCase + private val getItems: GetItemsUseCase ) : ViewModel() { private val _state = MutableStateFlow(ItemListState()) val state: StateFlow = _state.asStateFlow() diff --git a/skills/kotlin-coroutines-flows/SKILL.md b/skills/kotlin-coroutines-flows/SKILL.md index 12c8756d..6650b0b7 100644 --- a/skills/kotlin-coroutines-flows/SKILL.md +++ b/skills/kotlin-coroutines-flows/SKILL.md @@ -218,7 +218,7 @@ viewModelScope.launch { @Test fun `search updates item list`() = runTest { val fakeRepository = FakeItemRepository(items = testItems) - val viewModel = ItemListViewModel(GetItemUseCase(fakeRepository)) + val viewModel = ItemListViewModel(GetItemsUseCase(fakeRepository)) viewModel.state.test { assertEquals(ItemListState(), awaitItem()) // initial