Arquitecturas de Diseño (Actualizado 2025)¶
Los patrones arquitectónicos son la base de cualquier aplicación moderna, escalable y mantenible. Proporcionan una forma organizada de separar responsabilidades, reducir el acoplamiento y mejorar la calidad y testabilidad del software.
En desarrollo Android (Compose + Kotlin), los más utilizados son:
- MVC
- MVP
- MVVM (el estándar recomendado por Google en 2025)
Model View Controller¶
MVC divide la aplicación en tres responsabilidades claras:
Modelo¶
Representa:
- los datos
- la lógica empresarial
- las reglas del negocio
Ejemplo simple:
data class Usuario(val nombre: String, val edad: Int)
Vista¶
Es la interfaz de usuario.
En Android moderno, una vista sería una pantalla en Compose.
@Composable
fun UsuarioView(nombre: String, edad: Int) {
Text("Usuario: $nombre, Edad: $edad")
}
Controlador¶
Recibe las acciones del usuario desde la Vista, actualiza el Modelo y luego actualiza la Vista.
class UsuarioController(private val modelo: Usuario) {
fun actualizarEdad(nuevaEdad: Int): Usuario {
return modelo.copy(edad = nuevaEdad)
}
}
Flujo MVC¶
Vista → Controlador → Modelo → Controlador → Vista
Model View Presenter¶
MVP surge como evolución de MVC, especialmente útil en Android clásico (XML). Está formado por:
Modelo¶
Datos + lógica del negocio.
Vista (totalmente pasiva)¶
Solo muestra datos. No tiene lógica.
interface UsuarioView {
fun mostrarNombre(nombre: String)
fun mostrarEdad(edad: Int)
}
Presentador (el cerebro)¶
Maneja eventos, actualiza el modelo y actualiza la vista.
class UsuarioPresenter(private val vista: UsuarioView) {
fun cargarUsuario() {
val usuario = Usuario("Ginés", 30)
vista.mostrarNombre(usuario.nombre)
vista.mostrarEdad(usuario.edad)
}
}
Model View ViewModel¶
MVVM es el patrón oficial para Android moderno con Compose. Sus partes son:
Modelo¶
Fuente de datos:
data class Producto(val nombre: String, val precio: Double)
Vista (Compose reactiva)¶
Observa el estado del ViewModel y se redibuja automáticamente.
@Composable
fun ProductoView(uiState: ProductoUiState) {
Text("Producto: ${uiState.nombre}")
}
ViewModel¶
Mantiene el estado y expone datos observables (StateFlow / LiveData).
class ProductoViewModel : ViewModel() {
private val _uiState = MutableStateFlow(ProductoUiState())
val uiState: StateFlow<ProductoUiState> = _uiState
fun cargarProducto() {
_uiState.value = ProductoUiState(
nombre = "Portátil",
precio = 1200.0
)
}
}
Flujo MVVM¶
ViewModel → expone datos → Vista observa → Vista renderiza
Vista → acciones usuario → ViewModel procesa
Comparativa MVC vs MVP vs MVVM¶
| Característica | MVC | MVP | MVVM |
|---|---|---|---|
| Vista | Activa | Pasiva | Reactiva |
| Comunicación | Vista → Controlador | Vista ↔ Presentador | Vista observa al ViewModel |
| Testabilidad | Media | Alta | Muy alta |
| Complejidad | Baja | Media | Media/Alta |
| Uso Android 2025 | Obsoleto | Moderado | Recomendado |