VIPER - Design Pattern

24
VIPER DESIGN PATTERN

Transcript of VIPER - Design Pattern

Page 1: VIPER - Design Pattern

VIPERDESIGN PATTERN

Page 2: VIPER - Design Pattern

Padrão de projeto arquitetural▪ Arquitetura "limpa"

▪ Divisão em módulos

▪ Princípio da responsabilidade única

Page 3: VIPER - Design Pattern
Page 4: VIPER - Design Pattern

class Car {func accelerate() {}func brake() {}func turnLeft() {}func turnRight() {}func addFuel() {}func changeOil() {}func rotateTires() {}

}

Page 5: VIPER - Design Pattern

class Car {func accelerate() {}func brake() {}func turnLeft() {}func turnRight() {}func addFuel() {}func changeOil() {}func rotateTires() {}func adjustDriverSeat()

{}func turnOnAC() {}func playCD() {}

}

Page 6: VIPER - Design Pattern

Violação do princípio

▪Um carro pode ser dirigido

▪Um carro deve receber manutenção

▪Um carro deve prover conforto

Page 7: VIPER - Design Pattern

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() {}

}

Page 8: VIPER - Design Pattern

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() {}

}

Page 9: VIPER - Design Pattern

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() {}

}

Page 10: VIPER - Design Pattern

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() }

}

Page 11: VIPER - Design Pattern
Page 12: VIPER - Design Pattern

View

Page 13: VIPER - Design Pattern

View▪ Mostra informações para o usuário

▪ Recebe comandos vindos do Presenter sobre o que exibir

▪Detecta interações e notificar o Presenter

Page 14: VIPER - Design Pattern

Presenter

Page 15: VIPER - Design Pattern

Presenter▪ Diz para a View o que ela deve executar

▪ Responsável por cuidar do estado da View

▪Recebe callbacks do Interactor

Page 16: VIPER - Design Pattern

Interactor

Page 17: VIPER - Design Pattern

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

Page 18: VIPER - Design Pattern

Entity

Page 19: VIPER - Design Pattern

Entity▪ São modelos manipulados pelo

Interactor

▪ Entity != Data Access Layer

▪Na maioria das vezes os modelos acabam sendo PONSOs

Page 20: VIPER - Design Pattern

Router

Page 21: VIPER - Design Pattern

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

Page 22: VIPER - Design Pattern

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

Page 23: VIPER - Design Pattern

Dúvidas?

https://br.linkedin.com/in/pedrohperalta

pedrohperalta

@pedrohperalta

Page 24: VIPER - Design Pattern

Referênciashttp://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/