Slide 1

Slide 1 text

SOLID princípios para um melhor design de código 1

Slide 2

Slide 2 text

WHO ARE WE? • @Sobrinho • Co-founder at Code5 • Co-founder at Nohup • Co-founder at Hite • Software Architect • @MarceloCajueiro • Co-founder at Code5 • Project Leader at Nohup • Software Engineer 2

Slide 3

Slide 3 text

O QUE É SOLID? 3

Slide 4

Slide 4 text

POO 4

Slide 5

Slide 5 text

ORIENTAÇÃO A OBJETO Quais suas vantagens? 5

Slide 6

Slide 6 text

POO MAL FEITA É O MESMO QUE PROCEDURAL 6

Slide 7

Slide 7 text

HISTÓRIA • Introduzida pelo Uncle Bob (Robert Martin) em 2000 • Inspirado no subaproveitamento da POO • Com foco principal no acoplamento 7

Slide 8

Slide 8 text

SOLID • SRP - Single Responsibility Principle • OCP - Open/Closed Principle • LSP - Liskov Substitution Principle • ISP - Interface Segregation Principle • DIP - Dependency Inversion Principle 8

Slide 9

Slide 9 text

SINGLE RESPONSIBILITY PRINCIPLE • Uma entidade (classe, método, módulo) deve ter uma única responsabilidade • Responsabilidade pode ser definida como “razão para mudar” 9

Slide 10

Slide 10 text

Código ruim SRP 10

Slide 11

Slide 11 text

Aplicando o SRP SRP 11

Slide 12

Slide 12 text

OPEN-CLOSED PRINCIPLE (INICIALMENTE) • Uma classe deve estar aberta para extensão mas fechada para modificação • Alterar a classe apenas para arrumar bugs • Novas funcionalidades são adicionadas em heranças 12

Slide 13

Slide 13 text

OPEN-CLOSED PRINCIPLE (ATUALMENTE) • Uma classe deve manter a sua interface (API pública) • A implementação pode ser alterada livremente 13

Slide 14

Slide 14 text

Implementação mudou mas a interface (API pública) permeneceu OCP 14

Slide 15

Slide 15 text

LISKOV SUBSTITUTION PRINCIPLE • Deve ser possível substituir uma classe por suas classes derivadas em qualquer ponto do código • As propriedades do programa não devem ser alteradas para isso acontecer 15

Slide 16

Slide 16 text

Pode-se usar qualquer uma das heranças e não irá quebrar a classe que depende da interface (API pública) LSP 16

Slide 17

Slide 17 text

INTERFACE SEGREGATION PRINCIPLE • Classes não devem ser obrigadas a depender de interfaces que elas não utilizam • Deve-se usar interfaces concisas, com apenas o que é realmente é usado • O SRP resolve este problema 17

Slide 18

Slide 18 text

Classe bala de prata ISP 18

Slide 19

Slide 19 text

Aplicando o SRP, se aplica o ISP ISP 19

Slide 20

Slide 20 text

DEPENDENCY INVERSION PRINCIPLE • Módulos de alto nível não devem depender de módulos de baixo nível, ambos devem depender de abstrações (interface) • Abstrações não devem depender de detalhes, detalhes devem depender de abstrações 20

Slide 21

Slide 21 text

Código sem DIP (fortemente acoplado) DIP 21

Slide 22

Slide 22 text

E se eu quiser fazer cache ao invés de salvar no banco de dados? DIP 22

Slide 23

Slide 23 text

Isso parece bom? DIP 23

Slide 24

Slide 24 text

Bye bye acoplamento DIP 24

Slide 25

Slide 25 text

SOLID • SRP - Single Responsibility Principle • OCP - Open/Closed Principle • LSP - Liskov Substitution Principle • ISP - Interface Segregation Principle • DIP - Dependency Inversion Principle 25

Slide 26

Slide 26 text

DÚVIDAS? 26

Slide 27

Slide 27 text

REFERÊNCIAS • Edmilson Filho: http://www.slideshare.net/EdmilsonFilho2/princpios-solid-12117410 • Lucas Hungaro: http://www.slideshare.net/lucashungaro/solid-atravs-de-bdd-um-guia-prtico-para-rubistas • Uncle Bob: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod • Vinicius Quaiato: http://viniciusquaiato.com/blog/palestra-orientacao-a-objetos-e-principios-solid-slides-e-demos/ • Wikipedia: http://en.wikipedia.org/wiki/SOLID_(object-oriented_design) 27