Sobes.tech
Middle+

¿Conoce la arquitectura con ciclo VIP?

sobes.tech AI

Respuesta de la IA

VIP (Vista, Interactor, Presentador) - es un patrón arquitectónico que representa una variante de la Arquitectura Limpia, utilizado en el desarrollo de iOS para separar responsabilidades y mejorar la testabilidad del código. La base es un flujo de datos unidireccional entre componentes.

Componentes VIP:

  • Vista: Muestra datos y envía acciones del usuario (acciones del usuario) al Interactor. La Vista (UIView, UIViewController o simplemente protocolo) no contiene lógica de negocio.
  • Interactor: Contiene la lógica de negocio. Recibe acciones de la Vista, realiza las operaciones necesarias (por ejemplo, acceder a datos, realizar cálculos) y envía el resultado al Presentador. No depende de la UI.
  • Presentador: Recibe datos del Interactor, los formatea para su visualización y los envía a la Vista. No contiene lógica de negocio, solo se encarga de la presentación de datos.

Ciclo de interacción:

  1. El usuario realiza una acción en la Vista.
  2. La Vista envía una "solicitud" (request - struct/enum) al Interactor.
  3. El Interactor procesa la solicitud, realiza la lógica de negocio y envía una "respuesta" (response - struct/enum) al Presentador.
  4. El Presentador recibe la respuesta, formatea los datos en un "ViewModel" (struct/enum) y lo envía a la Vista.
  5. La Vista recibe el ViewModel y actualiza la interfaz de usuario.

Componentes adicionales (opcional):

  • Router: Gestiona la navegación entre módulos VIP (escenas). Normalmente llamado por el Interactor o el Presentador.
  • Worker: Componente del Interactor encargado de realizar tareas específicas (por ejemplo, solicitudes de red, trabajo con Core Data).

Ventaja principal de VIP:

  • Separación de responsabilidades: Claramente separa la UI, la lógica de negocio y la lógica de presentación.
  • Testabilidad: Es fácil probar cada componente por separado, simulando dependencias.
  • Mantenibilidad: Los cambios en un componente afectan menos a los otros.

Ejemplo de estructura de carpetas para un módulo VIP (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Estructuras para Request, Response, ViewModel
├── UserProtocols.swift // Protocolos para comunicación entre componentes

Ejemplo de interacción (carga de datos del usuario):

// En UserViewController
func viewDidLoad() {
    super.viewDidLoad()
    interactor?.fetchUserData(request: UserModels.FetchUser.Request())
}

// En UserInteractor
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... lógica de negocio para cargar datos ...
    let response = UserModels.FetchUser.Response(userData: fetchedData)
    presenter?.presentUserData(response: response)
}

// En UserPresenter
func presentUserData(response: UserModels.FetchUser.Response) {
    let viewModel = UserModels.FetchUser.ViewModel(
        displayName: response.userData.name,
        displayEmail: response.userData.email
    )
    viewController?.displayUserData(viewModel: viewModel)
}

// En UserViewController (implementación del protocolo UserDisplayLogic)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
    nameLabel.text = viewModel.displayName
    emailLabel.text = viewModel.displayEmail
}