Sobes.tech
Middle+

Você conhece a arquitetura com ciclo VIP?

sobes.tech IA

Resposta da IA

VIP (View, Interactor, Presenter) é um padrão arquitetural que representa uma variante da Arquitetura Limpa, utilizado no desenvolvimento iOS para separar responsabilidades e melhorar a testabilidade do código. A base é um fluxo de dados unidirecional entre componentes.

Componentes VIP:

  • View: Exibe dados e envia ações do utilizador (ações do utilizador) ao Interactor. A View (UIView, UIViewController ou simplesmente protocolo) não contém lógica de negócio.
  • Interactor: Contém a lógica de negócio. Recebe ações da View, realiza as operações necessárias (por exemplo, acesso a dados, cálculos) e envia o resultado ao Presenter. Não depende da UI.
  • Presenter: Recebe dados do Interactor, formata-os para exibição e envia-os à View. Não contém lógica de negócio, apenas se encarrega da apresentação dos dados.

Ciclo de interação:

  1. O utilizador realiza uma ação na View.
  2. A View envia uma "solicitação" (request - struct/enum) ao Interactor.
  3. O Interactor processa a solicitação, realiza a lógica de negócio e envia uma "resposta" (response - struct/enum) ao Presenter.
  4. O Presenter recebe a resposta, formata os dados em um "ViewModel" (struct/enum) e envia-o à View.
  5. A View recebe o ViewModel e atualiza a UI.

Componentes adicionais (opcional):

  • Router: Gerencia a navegação entre módulos VIP (cenas). Normalmente chamado pelo Interactor ou pelo Presenter.
  • Worker: Componente do Interactor responsável por executar tarefas específicas (por exemplo, requisições de rede, trabalho com Core Data).

Vantagem principal do VIP:

  • Separação de responsabilidades: Claramente separa a UI, a lógica de negócio e a lógica de apresentação.
  • Testabilidade: Facilita testar cada componente separadamente, simulando dependências.
  • Manutenção: Alterações num componente têm menor impacto nos outros.

Exemplo de estrutura de pastas para um módulo VIP (UserScene):

UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Estruturas para Request, Response, ViewModel
├── UserProtocols.swift // Protocolos para comunicação entre componentes

Exemplo de interação (carregamento de dados do utilizador):

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

// No UserInteractor
func fetchUserData(request: UserModels.FetchUser.Request) {
    // ... lógica de negócio para carregar dados ...
    let response = UserModels.FetchUser.Response(userData: fetchedData)
    presenter?.presentUserData(response: response)
}

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

// No UserViewController (implementação do protocolo UserDisplayLogic)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
    nameLabel.text = viewModel.displayName
    emailLabel.text = viewModel.displayEmail
}