SlideShare uma empresa Scribd logo
VIPER
DESIGN PATTERN
Padrão de projeto arquitetural
▪ Arquitetura "limpa"
▪ Divisão em módulos
▪ Princípio da responsabilidade única
class Car {
func accelerate() {}
func brake() {}
func turnLeft() {}
func turnRight() {}
func addFuel() {}
func changeOil() {}
func rotateTires() {}
}
class Car {
func accelerate() {}
func brake() {}
func turnLeft() {}
func turnRight() {}
func addFuel() {}
func changeOil() {}
func rotateTires() {}
func adjustDriverSeat() {}
func turnOnAC() {}
func playCD() {}
}
Violação do princípio
▪Um carro pode ser dirigido
▪Um carro deve receber manutenção
▪Um carro deve prover conforto
class DrivableCar {
func accelerate() {}
func brake() {}
func turnLeft() {}
func turnRight() {}
}
class MaintainableCar {
func addFuel() {}
func changeOil() {}
func rotateTires() {}
}
class ComfortableCar {
func adjustDriverSeat() {}
func turnOnAC() {}
func playCD() {}
}
protocol Drivable {
func accelerate() {}
func brake() {}
func turnLeft() {}
func turnRight() {}
}
protocol Maintainable {
func addFuel() {}
func changeOil() {}
func rotateTires() {}
}
protocol Comfortable {
func adjustDriverSeat() {}
func turnOnAC() {}
func playCD() {}
}
class Car: Drivable, Maintainable, Comfortable {
func accelerate() {}
func brake() {}
func turnLeft() {}
func turnRight() {}
func addFuel() {}
func changeOil() {}
func rotateTires() {}
func adjustDriverSeat() {}
func turnOnAC() {}
func playCD() {}
}
class Car: Drivable, Maintainable, Comfortable {
let drivable = DrivableCar()
let maintenable = MaintainableCar()
let confortable = ComfortableCar()
func accelerate() { drivable.accelerate() }
func brake() { drivable.brake() }
func turnLeft() { drivable.turnLeft() }
func turnRight() { drivable.turnRight() }
func addFuel() { maintenable.addFuel() }
func changeOil() { maintenable.changeOil() }
func rotateTires() { maintenable.rotateTires() }
func adjustDriverSeat() { confortable.adjustDriverSeat() }
func turnOnAC() { confortable.turnOnAC() }
func playCD() { confortable.playCD() }
}
View
View
▪ Mostra informações para o usuário
▪ Recebe comandos vindos do Presenter
sobre o que exibir
▪Detecta interações e notificar o Presenter
Presenter
Presenter
▪ Diz para a View o que ela deve executar
▪ Responsável por cuidar do estado da View
▪Recebe callbacks do Interactor
Interactor
Interactor
▪ Implementação dos casos de uso
▪ Integração com API, DB...
▪ Envia os dados recebidos externamente
para o Presenter realizar o tratamento
necessário antes de atualizar a View
▪O trabalho realizado pelo Interactor deve
ser independente de qualquer UI
Entity
Entity
▪ São modelos manipulados pelo Interactor
▪ Entity != Data Access Layer
▪Na maioria das vezes os modelos acabam
sendo PONSOs
Router
Router
▪ Responsável pela transação entre
diferentes módulos
▪ Responsável pela inicialização do próximo
módulo a ser chamado.
▪Responsável pela customização de
animações entre telas
Conclusão
▪ Maior facilidade em encontrar e resolver bugs
▪ Código mais "limpo" e compacto
▪ Gera uma maior reusabilidade do código
▪ Maior facilidade em adicionar/modificar features
▪ Fácil e rápido de escrever testes automatizados
confiáveis
Dúvidas?
https://br.linkedin.com/in/pedrohperalta
pedrohperalta
@pedrohperalta
Referências
http://clean-swift.com/single-responsibility-principle-
for-class/
https://www.objc.io/issues/13-architecture/viper/
https://www.ckl.io/blog/ios-project-architecture-
using-viper/

Mais conteúdo relacionado

Mais procurados

002- JavaFX Tutorial - Getting Started
002- JavaFX Tutorial - Getting Started002- JavaFX Tutorial - Getting Started
002- JavaFX Tutorial - Getting Started
Mohammad Hossein Rimaz
 
Programacion orientada a objetos en javascript
Programacion orientada a objetos en javascriptProgramacion orientada a objetos en javascript
Programacion orientada a objetos en javascript
Robert Moreira
 
JDBC Java Database Connectivity
JDBC Java Database ConnectivityJDBC Java Database Connectivity
JDBC Java Database Connectivity
Ranjan Kumar
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
Shai Yallin
 
javascript-basics.ppt
javascript-basics.pptjavascript-basics.ppt
javascript-basics.ppt
ahmadfaisal744721
 
Servlets
ServletsServlets
Lezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in RESTLezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in REST
Andrea Della Corte
 
SOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean ArchitectureSOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean Architecture
Fabio Collini
 
Final keyword in java
Final keyword in javaFinal keyword in java
Final keyword in java
Lovely Professional University
 
C# Events
C# EventsC# Events
C# Events
Prem Kumar Badri
 
Linguagem Java
Linguagem JavaLinguagem Java
Linguagem Java
Loiane Groner
 
Complete Notes on Angular 2 and TypeScript
Complete Notes on Angular 2 and TypeScriptComplete Notes on Angular 2 and TypeScript
Complete Notes on Angular 2 and TypeScript
EPAM Systems
 

Mais procurados (12)

002- JavaFX Tutorial - Getting Started
002- JavaFX Tutorial - Getting Started002- JavaFX Tutorial - Getting Started
002- JavaFX Tutorial - Getting Started
 
Programacion orientada a objetos en javascript
Programacion orientada a objetos en javascriptProgramacion orientada a objetos en javascript
Programacion orientada a objetos en javascript
 
JDBC Java Database Connectivity
JDBC Java Database ConnectivityJDBC Java Database Connectivity
JDBC Java Database Connectivity
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
 
javascript-basics.ppt
javascript-basics.pptjavascript-basics.ppt
javascript-basics.ppt
 
Servlets
ServletsServlets
Servlets
 
Lezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in RESTLezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in REST
 
SOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean ArchitectureSOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean Architecture
 
Final keyword in java
Final keyword in javaFinal keyword in java
Final keyword in java
 
C# Events
C# EventsC# Events
C# Events
 
Linguagem Java
Linguagem JavaLinguagem Java
Linguagem Java
 
Complete Notes on Angular 2 and TypeScript
Complete Notes on Angular 2 and TypeScriptComplete Notes on Angular 2 and TypeScript
Complete Notes on Angular 2 and TypeScript
 

Destaque

From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
Krzysztof Profic
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
RAMBLER&Co
 
Sexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroidsSexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroids
Dmytro Zaitsev
 
Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER Architecture
Hendy Christianto
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
RAMBLER&Co
 
[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER
Silicon Straits
 
Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)
65apps
 
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOSSoftware architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Jinkyu Kim
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
병한 유
 
Break the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER ModulesBreak the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER Modules
Nicola Zaghini
 
iOS Viper architecture for CocoaHeadsBY (RU)
iOS Viper architecture for CocoaHeadsBY (RU)iOS Viper architecture for CocoaHeadsBY (RU)
iOS Viper architecture for CocoaHeadsBY (RU)
Vladimir Hudnitsky
 
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum
 
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPERRambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
RAMBLER&Co
 
Clean architecture workshop
Clean architecture workshopClean architecture workshop
Clean architecture workshop
Jorge Ortiz
 
iOS Architecture
iOS ArchitectureiOS Architecture
iOS ArchitectureJacky Lian
 
Viper
ViperViper
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
e-Legion
 
EMC SCALEIO
EMC SCALEIOEMC SCALEIO
EMC SCALEIO
Cisco Russia
 
An (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPERAn (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPER
denicija
 
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
65apps
 

Destaque (20)

From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
Sexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroidsSexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroids
 
Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER Architecture
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
 
[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER
 
Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)
 
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOSSoftware architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
Break the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER ModulesBreak the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER Modules
 
iOS Viper architecture for CocoaHeadsBY (RU)
iOS Viper architecture for CocoaHeadsBY (RU)iOS Viper architecture for CocoaHeadsBY (RU)
iOS Viper architecture for CocoaHeadsBY (RU)
 
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
 
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPERRambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
 
Clean architecture workshop
Clean architecture workshopClean architecture workshop
Clean architecture workshop
 
iOS Architecture
iOS ArchitectureiOS Architecture
iOS Architecture
 
Viper
ViperViper
Viper
 
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
 
EMC SCALEIO
EMC SCALEIOEMC SCALEIO
EMC SCALEIO
 
An (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPERAn (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPER
 
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
 

Semelhante a VIPER - Design Pattern

Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no Nubank
DevCamp Campinas
 
PÁ CARREGADEIRA CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
PÁ CARREGADEIRA  CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!PÁ CARREGADEIRA  CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
PÁ CARREGADEIRA CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
Daniel Andrade
 
Caterpila950h
Caterpila950hCaterpila950h
Caterpila950heeemba
 
216 b, 226b, 236b, 242b e 252b
216 b, 226b, 236b, 242b e 252b216 b, 226b, 236b, 242b e 252b
216 b, 226b, 236b, 242b e 252b
As Máquinas Pesadas
 
2° estuda ControlLogix Motion.ppt
2° estuda ControlLogix Motion.ppt2° estuda ControlLogix Motion.ppt
2° estuda ControlLogix Motion.ppt
julyocarlos
 
Test-Driven Development e sua influência no design
Test-Driven Development e sua influência no designTest-Driven Development e sua influência no design
Test-Driven Development e sua influência no design
Maurício Aniche
 
Hangout servo motor 2016 2810
Hangout  servo motor 2016 2810Hangout  servo motor 2016 2810
Hangout servo motor 2016 2810
Kalatec Automação
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)
Luís Cobucci
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
Ricardo Ogliari
 
Curso boby cat.ppt
Curso boby cat.pptCurso boby cat.ppt
Curso boby cat.ppt
siderlei1230
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Willian Magalhães
 
Tudo que você precisa saber sobre Servo Motores + Servoacionamentos
Tudo que você precisa saber sobre Servo Motores + Servoacionamentos Tudo que você precisa saber sobre Servo Motores + Servoacionamentos
Tudo que você precisa saber sobre Servo Motores + Servoacionamentos
Sala da Elétrica
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
raquelcarsi
 
ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
Daniel Andrade
 
Dimensionamento de servo motores.pdf
Dimensionamento de servo motores.pdfDimensionamento de servo motores.pdf
Dimensionamento de servo motores.pdf
PatrickFerreira67
 
Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)
Loiane Groner
 

Semelhante a VIPER - Design Pattern (17)

Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no Nubank
 
PÁ CARREGADEIRA CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
PÁ CARREGADEIRA  CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!PÁ CARREGADEIRA  CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
PÁ CARREGADEIRA CATERPILLAR 924H - MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
 
Caterpila950h
Caterpila950hCaterpila950h
Caterpila950h
 
216 b, 226b, 236b, 242b e 252b
216 b, 226b, 236b, 242b e 252b216 b, 226b, 236b, 242b e 252b
216 b, 226b, 236b, 242b e 252b
 
2° estuda ControlLogix Motion.ppt
2° estuda ControlLogix Motion.ppt2° estuda ControlLogix Motion.ppt
2° estuda ControlLogix Motion.ppt
 
Test-Driven Development e sua influência no design
Test-Driven Development e sua influência no designTest-Driven Development e sua influência no design
Test-Driven Development e sua influência no design
 
Hangout servo motor 2016 2810
Hangout  servo motor 2016 2810Hangout  servo motor 2016 2810
Hangout servo motor 2016 2810
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
 
Curso boby cat.ppt
Curso boby cat.pptCurso boby cat.ppt
Curso boby cat.ppt
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Tudo que você precisa saber sobre Servo Motores + Servoacionamentos
Tudo que você precisa saber sobre Servo Motores + Servoacionamentos Tudo que você precisa saber sobre Servo Motores + Servoacionamentos
Tudo que você precisa saber sobre Servo Motores + Servoacionamentos
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
420 e
420 e420 e
420 e
 
ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
ESCAVADEIRA320D/DL MANUAL DE ESPECIFICAÇÕES DA MÁQUINA!
 
Dimensionamento de servo motores.pdf
Dimensionamento de servo motores.pdfDimensionamento de servo motores.pdf
Dimensionamento de servo motores.pdf
 
Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)
 

VIPER - Design Pattern

  • 2. Padrão de projeto arquitetural ▪ Arquitetura "limpa" ▪ Divisão em módulos ▪ Princípio da responsabilidade única
  • 3.
  • 4. class Car { func accelerate() {} func brake() {} func turnLeft() {} func turnRight() {} func addFuel() {} func changeOil() {} func rotateTires() {} }
  • 5. class Car { func accelerate() {} func brake() {} func turnLeft() {} func turnRight() {} func addFuel() {} func changeOil() {} func rotateTires() {} func adjustDriverSeat() {} func turnOnAC() {} func playCD() {} }
  • 6. Violação do princípio ▪Um carro pode ser dirigido ▪Um carro deve receber manutenção ▪Um carro deve prover conforto
  • 7. class DrivableCar { func accelerate() {} func brake() {} func turnLeft() {} func turnRight() {} } class MaintainableCar { func addFuel() {} func changeOil() {} func rotateTires() {} } class ComfortableCar { func adjustDriverSeat() {} func turnOnAC() {} func playCD() {} }
  • 8. protocol Drivable { func accelerate() {} func brake() {} func turnLeft() {} func turnRight() {} } protocol Maintainable { func addFuel() {} func changeOil() {} func rotateTires() {} } protocol Comfortable { func adjustDriverSeat() {} func turnOnAC() {} func playCD() {} }
  • 9. class Car: Drivable, Maintainable, Comfortable { func accelerate() {} func brake() {} func turnLeft() {} func turnRight() {} func addFuel() {} func changeOil() {} func rotateTires() {} func adjustDriverSeat() {} func turnOnAC() {} func playCD() {} }
  • 10. class Car: Drivable, Maintainable, Comfortable { let drivable = DrivableCar() let maintenable = MaintainableCar() let confortable = ComfortableCar() func accelerate() { drivable.accelerate() } func brake() { drivable.brake() } func turnLeft() { drivable.turnLeft() } func turnRight() { drivable.turnRight() } func addFuel() { maintenable.addFuel() } func changeOil() { maintenable.changeOil() } func rotateTires() { maintenable.rotateTires() } func adjustDriverSeat() { confortable.adjustDriverSeat() } func turnOnAC() { confortable.turnOnAC() } func playCD() { confortable.playCD() } }
  • 11.
  • 12. View
  • 13. View ▪ Mostra informações para o usuário ▪ Recebe comandos vindos do Presenter sobre o que exibir ▪Detecta interações e notificar o Presenter
  • 15. Presenter ▪ Diz para a View o que ela deve executar ▪ Responsável por cuidar do estado da View ▪Recebe callbacks do Interactor
  • 17. Interactor ▪ Implementação dos casos de uso ▪ Integração com API, DB... ▪ Envia os dados recebidos externamente para o Presenter realizar o tratamento necessário antes de atualizar a View ▪O trabalho realizado pelo Interactor deve ser independente de qualquer UI
  • 19. Entity ▪ São modelos manipulados pelo Interactor ▪ Entity != Data Access Layer ▪Na maioria das vezes os modelos acabam sendo PONSOs
  • 21. Router ▪ Responsável pela transação entre diferentes módulos ▪ Responsável pela inicialização do próximo módulo a ser chamado. ▪Responsável pela customização de animações entre telas
  • 22. Conclusão ▪ Maior facilidade em encontrar e resolver bugs ▪ Código mais "limpo" e compacto ▪ Gera uma maior reusabilidade do código ▪ Maior facilidade em adicionar/modificar features ▪ Fácil e rápido de escrever testes automatizados confiáveis