Hola! si debo dar formato a unos datos, por ejemplo fecha
o moneda
, esto lo deber铆a hacer en el UseCase
o en el ViewModel
?
Introducci贸n
Qu茅 aprender谩s sobre Clean Architecture en Android
驴Qu茅 es clean architecture?
Repaso de Conceptos Generales
Principios SOLID
Repository Pattern
Presentaci贸n del proyecto
Presentaci贸n del proyecto: Rick and Morty
Uso de RxJava y RxAndroid en el proyecto
Capa de Presentaci贸n
Introducci贸n a la capa de presentaci贸n
Implementaci贸n de la capa de presentaci贸n
Soluci贸n del reto
Capa de Casos de Uso
Introducci贸n a la capa de casos de uso
Soluci贸n del reto: capa de casos de uso
Capa de Dominio
Introducci贸n a la capa de dominio
Implementaci贸n de la capa de dominio: mappers
Migraci贸n entidades de framework a dominio
Soluci贸n del reto: capa de dominio
Capa de Datos
Introducci贸n a la capa de datos
Implementaci贸n de la capa de datos: repositorio
Implementaci贸n de la capa de datos: fuente de datos
Soluci贸n del reto: capa de datos
Extras: Migraci贸n de Capa de Casos de Uso
Migraci贸n de la capa de casos de uso
Capa de Framework
Introducci贸n a la capa de framework
Implementaci贸n de Image Manager (Glide)
Implementaci贸n de Database Manager (Room)
Implementaci贸n de Request Manager (Retrofit)
Inyecci贸n de Dependencias
Introducci贸n a la inyecci贸n de dependencias
Implementaci贸n de Dagger (M贸dulos)
Implementaci贸n de Dagger (Componente)
Soluci贸n del reto: inyecci贸n de dependencias
Pruebas unitarias a nivel general
Implementaci贸n de pruebas unitarias (conceptos generales)
Pruebas unitarias en la capa de presentaci贸n
Pruebas unitarias en las capas de casos de uso y datos
Conclusiones
C贸mo seguir mejorando la arquitectura
Lectura
Para tener una idea m谩s clara de c贸mo se puede separar la l贸gica de cada nivel dependiendo de su responsabilidad, se puede migrar las clases relacionadas con los casos de uso a un nuevo m贸dulo.
Nota: Para ver el resultado de esta migraci贸n, puedes revisar el c贸digo a partir de la rama extra_use_cases_module.
1.- Da clic derecho sobre la carpeta principal del proyecto y selecciona la opci贸n Nuevo -> M贸dulo.
2.- Selecciona el tipo de m贸dulo que vas a crear como se indica en la siguiente imagen (para los casos de uso, bastar谩 crear una biblioteca de tipo Android o Android Library).
3.- Nombra al nuevo m贸dulo usecases y cambia su nombre de paquete como se muestra en la siguiente imagen. Selecciona la opci贸n de finalizar.
1.- Implementa las dependencias con las que los casos de uso trabajan: los niveles de datos, entidades, Kotlin y RxJava como se muestra en el siguiente fragmento de c贸digo.
build.gradle (usecases)
dependencies {
//Project
implementation project(":data")
implementation project(":domain")
//Kotlin
implementation kotlinLib
//RxJava
implementation rxJavaLib
}
2.- Agrega la dependencia de casos de uso a la aplicaci贸n como se muestra en el siguiente fragmento de c贸digo.
build.gradle (app)
dependencies {
//Project
...
implementation project(":usecases")
...
}
1.- Toma todos los cases de uso en el m贸dulo de app y mueve cada uno de ellos a un nuevo archivo que puedas llamar UseCases en el m贸dulo que acabas de crear.
UseCases.kt
package com.platzi.android.rickandmorty.usecases
import com.platzi.android.rickandmorty.data.CharacterRepository
import com.platzi.android.rickandmorty.data.EpisodeRepository
import com.platzi.android.rickandmorty.domain.Character
import com.platzi.android.rickandmorty.domain.Episode
import io.reactivex.Flowable
import io.reactivex.Maybe
import io.reactivex.Single
class GetAllCharactersUseCase(
private val characterRepository: CharacterRepository
) {
fun invoke(currentPage: Int): Single<List<Character>> =
characterRepository.getAllCharacters(currentPage)
}
class GetAllFavoriteCharactersUseCase(
private val characterRepository: CharacterRepository
) {
fun invoke(): Flowable<List<Character>> = characterRepository.getAllFavoriteCharacters()
}
class GetEpisodeFromCharacterUseCase(
private val episodeRepository: EpisodeRepository
) {
fun invoke(episodeUrlList: List<String>): Single<List<Episode>> =
episodeRepository.getEpisodeFromCharacter(episodeUrlList)
}
class GetFavoriteCharacterStatusUseCase(
private val characterRepository: CharacterRepository
) {
fun invoke(characterId: Int): Maybe<Boolean> =
characterRepository.getFavoriteCharacterStatus(characterId)
}
class UpdateFavoriteCharacterStatusUseCase(
private val characterRepository: CharacterRepository
) {
fun invoke(character: Character): Maybe<Boolean> =
characterRepository.updateFavoriteCharacterStatus(character)
}
2.- Aseg煤rate de que tanto Activities y Fragments, as铆 como ViewModels, utilicen los casos de uso a partir del m贸dulo que creaste. Ejemplo: CharacterListViewModel utiliza el caso de uso GetAllCharactersUseCase a partir del m贸dulo usecases como se muestra en el siguiente fragmento de c贸digo.
CharacterListViewModel.kt
...
import com.platzi.android.rickandmorty.usecases.GetAllCharactersUseCase
...
class CharacterListViewModel(
private val getAllCharactersUseCase: GetAllCharactersUseCase
): ViewModel() {
...
}
Podemos llegar a la conclusi贸n de que, al separar parte de nuestra l贸gica en distintos m贸dulos o paquetes, tienes un panorama m谩s amplio de las clases que se llevan a cabo en tus proyectos, y de esa manera, se vuelve m谩s f谩cil agregar, modificar o quitar funcionalidades.
Aportes 2
Preguntas 0
Hola! si debo dar formato a unos datos, por ejemplo fecha
o moneda
, esto lo deber铆a hacer en el UseCase
o en el ViewModel
?
Otra pregunta, cada UseCase
es la clase y el m茅todo invoke
solamente? o puede haber un UseCase
con multiples m茅todos?
驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.