SlideShare una empresa de Scribd logo
1 de 24
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/

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

MVVM & RxSwift
MVVM & RxSwiftMVVM & RxSwift
MVVM & RxSwift
 
React and redux
React and reduxReact and redux
React and redux
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
 
Angular Material (2) - NgVikingsConf
Angular Material (2) - NgVikingsConfAngular Material (2) - NgVikingsConf
Angular Material (2) - NgVikingsConf
 
Redux workshop
Redux workshopRedux workshop
Redux workshop
 
Life Cycle hooks in VueJs
Life Cycle hooks in VueJsLife Cycle hooks in VueJs
Life Cycle hooks in VueJs
 
Redux Thunk
Redux ThunkRedux Thunk
Redux Thunk
 
State management in react applications (Statecharts)
State management in react applications (Statecharts)State management in react applications (Statecharts)
State management in react applications (Statecharts)
 
Introduction to React Hooks
Introduction to React HooksIntroduction to React Hooks
Introduction to React Hooks
 
React js
React jsReact js
React js
 
SwiftUI and Combine All the Things
SwiftUI and Combine All the ThingsSwiftUI and Combine All the Things
SwiftUI and Combine All the Things
 
React workshop
React workshopReact workshop
React workshop
 
Dependency Injection in iOS
Dependency Injection in iOSDependency Injection in iOS
Dependency Injection in iOS
 
Ngrx
NgrxNgrx
Ngrx
 
Mobile iOS Application Architectures
Mobile iOS Application ArchitecturesMobile iOS Application Architectures
Mobile iOS Application Architectures
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.
 
React js
React jsReact js
React js
 
Testing Spring Applications
Testing Spring ApplicationsTesting Spring Applications
Testing Spring Applications
 
Understanding REST APIs in 5 Simple Steps
Understanding REST APIs in 5 Simple StepsUnderstanding REST APIs in 5 Simple Steps
Understanding REST APIs in 5 Simple Steps
 
reactJS
reactJSreactJS
reactJS
 

Destacado

Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRAMBLER&Co
 
Sexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroidsSexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroidsDmytro Zaitsev
 
Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER ArchitectureHendy 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 RamblerRAMBLER&Co
 
[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPERSilicon 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 iOSJinkyu 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 ModulesNicola 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 VujaklijaInfinum
 
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPERRambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPERRAMBLER&Co
 
Clean architecture workshop
Clean architecture workshopClean architecture workshop
Clean architecture workshopJorge Ortiz
 
iOS Architecture
iOS ArchitectureiOS Architecture
iOS ArchitectureJacky Lian
 
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWeare-Legion
 
An (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPERAn (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPERdenicija
 
VIPER Architecture
VIPER ArchitectureVIPER Architecture
VIPER ArchitectureAhmed Lotfy
 

Destacado (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
 
VIPER Architecture
VIPER ArchitectureVIPER Architecture
VIPER Architecture
 

Similar a VIPER design pattern: arquitetura limpa e responsabilidade única

Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no NubankDevCamp 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
 
2° estuda ControlLogix Motion.ppt
2° estuda ControlLogix Motion.ppt2° estuda ControlLogix Motion.ppt
2° estuda ControlLogix Motion.pptjulyocarlos
 
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 designMaurício Aniche
 
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.pptxRicardo Ogliari
 
Curso boby cat.ppt
Curso boby cat.pptCurso boby cat.ppt
Curso boby cat.pptsiderlei1230
 
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 CONNECTIVITYraquelcarsi
 
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.pdfPatrickFerreira67
 
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
 

Similar a VIPER design pattern: arquitetura limpa e responsabilidade única (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: arquitetura limpa e responsabilidade única

  • 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