VIPER - Arquitetura limpa em nossos APPs

VIPER - Arquitetura limpa em nossos APPs

Apresentação da arquitetura de software denominada VIPER. A VIPER é baseada na Clean Architecture, apresentada por Robert Martin em 2012, mas com foco nos dispositivos móveis. Primeiramente apresentada para o mundo iOS, pode ser aplicada também para o mundo Android. MVC (Massive View Controller) nunca mais :).

Será feito uma abordagem dos problemas atuais enfrentados no desenvolvimento de software e proposto uma solução para o caos atual com a arquitetura VIPER. Também será transmitido conhecimento sobre as facilidades de se aplicar TDD (Test Driven Development) nesta arquitetura.

https://www.youtube.com/watch?v=xidkO2xVfPk

A928e0a8375d93d165ad90bb860c05d9?s=128

Ronan Rodrigo Nunes

July 26, 2016
Tweet

Transcript

  1. VIPER Arquitetura limpa em nossos APPs Ronan R. Nunes

  2. None
  3. None
  4. None
  5. None
  6. None
  7. None
  8. None
  9.    Model Controller  View Didicil de testar

    Didicil de dar manutenção Fácil de aparecer bugs Difícil de corrigir bugs Difícil de trocar um banco de dados Difícil de trocar um serviço Difícil de seguir o SOLID Difícil de reaproveitar código Arquivos gigantes Difícil saber do que se trata Desorganização
  10. Clean Architecture

  11. Frameworks & drivers Interface adapters Application business rules Enterprise business

    rules UI External Interfaces Web Devices DB Controllers Gateways Presenters Use Cases Entities
  12. View Interactor <I>Presenter Entity Router

  13. View Interactor <I>Presenter Entity <I>Router <I>Repository

  14. ! ronanrodrigo/my-customers

  15. func didTouchAtSaveCustomer() { func didTouchAtSaveCustomer() { CreateCustomerInputPresenterApp(newCustomerForm: self).createCustomer() } }

    View
  16. class CreateCustomerInputPresenterApp: CreateCustomerInputPresenter { func createCustomer() { CreateCustomerInteractor( customerRepository: customerRepositoryStore,

    createCustomerOutputPresenter: createCustomerOutputPresenter ).create( customer: generateCustomerEntity() ) } // Proximo Slide } Presenter
  17. Presenter class CreateCustomerInputPresenterApp: CreateCustomerInputPresenter { // Slide anterior func generateCustomerEntity()

    -> Customer { return CustomerEntity( name: newCustomerForm.enteredName, phone: newCustomerForm.enteredPhone, email: newCustomerForm.enteredEmail, address: newCustomerForm.enteredAddress ) } }
  18. public struct CreateCustomerInteractor { public func create(customer: Customer) { customerRepository.create(customer:

    customer) createCustomerOutputPresenter.show() } } Interaction CreateCustomerInteractor customerRepository. createCustomerOutputPresenter
  19. Presenter class CreateCustomerOutputPresenterApp: CreateCustomerOutputPresenter { func show() { customersAppRouter.backToList() }

    }
  20. Router class CustomersRouterApp: UINavigationController, CustomersRouter { func backToList() { popToViewController(listCustomersViewController,

    animated: true) } }
  21. Entity public struct CustomerEntity: Customer { public var name: String?

    public var phone: String? public var email: String? public var address: String? }
  22. E agora…

  23. SOLID

  24. Conhecer o projeto

  25. Reaproveitar código

  26. Independência de frameworks e serviços

  27. Testar

  28. Criar e alterar telas

  29. Independência de banco

  30. bit.ly/issue-13-architecture bit.ly/clean-architecture bit.ly/viper-beyond-mvc

  31. ronan.nunes@me.com github.com/ronanrodrigo medium.com/@ronanrodrigo