SlideShare uma empresa Scribd logo
Princípios SOLID
André Minelli
Julho/2014
O que é software de qualidade?
Software de Qualidade:
Alta Coesão
e
Baixo Acoplamento
Sintomas da Baixa Qualidade:
Sintomas da Baixa Qualidade:
• Rigidez
Sintomas da Baixa Qualidade :
• Rigidez
• Fragilidade
Sintomas da Baixa Qualidade :
• Rigidez
• Fragilidade
• Imobilidade
Sintomas da Baixa Qualidade :
• Rigidez
• Fragilidade
• Imobilidade
Then what???
S.O.L.I.D.
To The Rescue!
Lembre-se!
Princípio ≠ Regra
Single Responsibility Principle (SRP)
Open-Closed Principle (OCP)
Liskov Substitution Principle (LSP)
Interface Segregation Principle (ISP)
Dependency Inversion Principle (DIP)
Single Responsibility Principle (SRP)
“Uma classe deve ter somente uma
razão para mudar”
Responsabilidade = O que a classe faz?
Responsabilidade Única = Alta Coesão!
Quanto mais for feito, maior será a
chance de alterar!
Quanto mais for alterado, maior será a
chance de introduzir bugs!
Benefícios:
Benefícios:
• Reuso
Benefícios:
• Reuso
• Clareza
Benefícios:
• Reuso
• Clareza
• Nomeação
Benefícios:
• Reuso
• Clareza
• Nomeação
• Leitura Fácil
Críticas:
Críticas:
• ‘Granularidade’ da Responsabilidade
Críticas:
• ‘Granularidade’ da Responsabilidade
• Explosão de classes
DEMO
Open-Closed Principle (OCP)
“Módulos devem ser abertos para
extensão e fechados para modificação”
• Aberto para extensão
Comportamento pode ser estendido
• Fechado para modificação
Estender não significa alterar o código
original diretamente
Técnicas:
Técnicas:
• Parametrização
Técnicas:
• Parametrização
• Herança
Técnicas:
• Parametrização
• Herança
• Eventos
Técnicas:
• Parametrização
• Herança
• Eventos
• Métodos de extensão
Técnicas:
• Parametrização
• Herança
• Eventos
• Métodos de extensão
• Composição
Benefícios:
Benefícios:
• Bugs apenas em código novo
Benefícios:
• Bugs apenas em código novo
• Baixo acoplamento
Críticas:
• Exige planejamento antecipado
DEMO
Liskov Substitution Principle (LSP)
“Tipos derivados devem poder
substituir seu tipo base”
Código não deve precisar saber que o
tipo atual é um sub-tipo específico
Violação Mais Comum:
if (obj is <SubType>)
O comportamento deve ser
indistinguível entre tipo base e
qualquer sub-tipo
Violações Comuns em Sub-tipos:
• Lançar novas exceções
Violações Comuns em Sub-tipos:
• Lançar novas exceções
• Pré-condições mais restritivas
Violações Comuns em Sub-tipos:
• Lançar novas exceções
• Pré-condições mais restritivas
• Pós-condições menos restritivas
Violações Comuns em Sub-tipos:
• Lançar novas exceções
• Pré-condições mais restritivas
• Pós-condições menos restritivas
• Invariantes menos restritivos
Soluções Comuns:
Soluções Comuns:
• Documentação
Soluções Comuns:
• Documentação
• Utilizar Code Contracts For .NET
Soluções Comuns:
• Documentação
• Utilizar Code Contracts For .NET
• Criar hierarquias separadas
Soluções Comuns:
• Documentação
• Utilizar Code Contracts For .NET
• Criar hierarquias separadas
• Aplicar “Tell, Don´t Ask” Principle
DEMO
Interface Segregation Principle (ISP)
“Clientes não devem ser forçados a
depender de interfaces que eles não
usam”
Não crie interfaces grandes
(com vários métodos)!
Interface menor => Alta Coesão
Benefícios:
Benefícios:
• Facilidade para implementar
Benefícios:
• Facilidade para implementar
• Mais fácil de usar
DEMO
ASP.NET MembershipProvider
Na maioria das vezes bastaria:
bool ValidateUser(string username, string password)
Versão Mais Recente:
ASP.NET Identity
Dependency Inversion Principle (DIP)
“Dependa de abstrações, não dependa
de implementações”
Técnicas:
Técnicas:
• Strategy pattern
Técnicas:
• Strategy pattern
• Adapter pattern
Técnicas:
• Strategy pattern
• Adapter pattern
• Dependency Injection
Benefícios:
Benefícios:
• Bugs apenas em código novo
• Baixo acoplamento
Benefícios:
• Bugs apenas em código novo
• Baixo acoplamento
• Testabilidade
Benefícios:
• Bugs apenas em código novo
• Baixo acoplamento
• Testabilidade
• Extensibilidade
Críticas:
• Menos controle sobre detalhes
Críticas:
• Menos controle sobre detalhes
• “Navegação” é mais difícil
DEMO
Lembre-se!
Princípio ≠ Regra
“Programar não é apenas
escrever código, assim como
cozinhar não é apenas misturar
ingredientes”
Referências:
• http://www.objectmentor.com/resources/articles/Principle
s_and_Patterns.pdf
• http://www.infoq.com/presentations/design-principles-
code-structures
• http://www.slideshare.net/Hitheshh/solid-31661700
• www.craigberntson.com/docs/SOLID.pptx
• http://channel9.msdn.com/Events/TechEd/NorthAmerica/2
014/DEV-B315
• http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id
=92
• http://research.microsoft.com/en-us/projects/contracts/
• https://simpleinjector.codeplex.com/wikipage?title=Advanc
ed-scenarios#Interception
Princípios SOLID
Princípios SOLID

Mais conteúdo relacionado

Mais procurados

AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트:: AWS S...
AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트::  AWS S...AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트::  AWS S...
AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트:: AWS S...Amazon Web Services Korea
 
Arquitetura de Serviços - SOA, REST, Microservices e a plataforma .NET
Arquitetura de Serviços - SOA, REST, Microservices e a plataforma .NETArquitetura de Serviços - SOA, REST, Microservices e a plataforma .NET
Arquitetura de Serviços - SOA, REST, Microservices e a plataforma .NETRenato Groff
 
Api gateway
Api gatewayApi gateway
Api gatewayenyert
 
Agentes Moveis - Aspectos De Desenvolvimento
Agentes Moveis - Aspectos De  DesenvolvimentoAgentes Moveis - Aspectos De  Desenvolvimento
Agentes Moveis - Aspectos De DesenvolvimentoLuiz Matos
 
Modelos de Processo de Software Parte 4
Modelos de Processo de Software Parte 4Modelos de Processo de Software Parte 4
Modelos de Processo de Software Parte 4Elaine Cecília Gatto
 
Arquitetura Cliente-Servidor - Modelos
Arquitetura Cliente-Servidor - ModelosArquitetura Cliente-Servidor - Modelos
Arquitetura Cliente-Servidor - ModelosIsrael Messias
 
Sistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de ProjetoSistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de ProjetoAdriano Teixeira de Souza
 
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성KwangSeob Jeong
 
Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1Cristiano Pires Martins
 
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019Amazon Web Services Korea
 
SO-03 Comunicação e Sincronização de Processos
SO-03 Comunicação e Sincronização de ProcessosSO-03 Comunicação e Sincronização de Processos
SO-03 Comunicação e Sincronização de ProcessosEduardo Nicola F. Zagari
 
Sistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - KafkaSistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - KafkaNatã Melo
 
Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈
Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈
Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈Amazon Web Services Korea
 
Ch18-Software Engineering 9
Ch18-Software Engineering 9Ch18-Software Engineering 9
Ch18-Software Engineering 9Ian Sommerville
 
Microservices architecture
Microservices architectureMicroservices architecture
Microservices architectureAbdelghani Azri
 

Mais procurados (20)

AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트:: AWS S...
AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트::  AWS S...AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트::  AWS S...
AWS 관리형 서비스를 활용하여 Kubernetes 를 위한 Devops 환경 구축하기 - 김광영, AWS솔루션즈 아키텍트:: AWS S...
 
Arquitetura de Serviços - SOA, REST, Microservices e a plataforma .NET
Arquitetura de Serviços - SOA, REST, Microservices e a plataforma .NETArquitetura de Serviços - SOA, REST, Microservices e a plataforma .NET
Arquitetura de Serviços - SOA, REST, Microservices e a plataforma .NET
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Arquitetura orientada a serviços (SOA)
Arquitetura orientada a serviços (SOA)Arquitetura orientada a serviços (SOA)
Arquitetura orientada a serviços (SOA)
 
Api gateway
Api gatewayApi gateway
Api gateway
 
Agentes Moveis - Aspectos De Desenvolvimento
Agentes Moveis - Aspectos De  DesenvolvimentoAgentes Moveis - Aspectos De  Desenvolvimento
Agentes Moveis - Aspectos De Desenvolvimento
 
Modelos de Processo de Software Parte 4
Modelos de Processo de Software Parte 4Modelos de Processo de Software Parte 4
Modelos de Processo de Software Parte 4
 
Arquitetura Cliente-Servidor - Modelos
Arquitetura Cliente-Servidor - ModelosArquitetura Cliente-Servidor - Modelos
Arquitetura Cliente-Servidor - Modelos
 
Sistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de ProjetoSistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de Projeto
 
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
 
SI - Arquiteturas
SI - ArquiteturasSI - Arquiteturas
SI - Arquiteturas
 
Microservicios
MicroserviciosMicroservicios
Microservicios
 
Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1Aula 02-processos-e-threads-tanenbaum-parte-1
Aula 02-processos-e-threads-tanenbaum-parte-1
 
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
AWS를 위한 도커, 컨테이너 (이미지) 환경 보안 방안 - 양희선 부장, TrendMicro :: AWS Summit Seoul 2019
 
SO-03 Comunicação e Sincronização de Processos
SO-03 Comunicação e Sincronização de ProcessosSO-03 Comunicação e Sincronização de Processos
SO-03 Comunicação e Sincronização de Processos
 
Sistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - KafkaSistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - Kafka
 
Implementando una Arquitectura de Microservicios
Implementando una Arquitectura de MicroserviciosImplementando una Arquitectura de Microservicios
Implementando una Arquitectura de Microservicios
 
Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈
Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈
Amazon EC2 서비스 살펴보기 (박철수) - AWS 웨비나 시리즈
 
Ch18-Software Engineering 9
Ch18-Software Engineering 9Ch18-Software Engineering 9
Ch18-Software Engineering 9
 
Microservices architecture
Microservices architectureMicroservices architecture
Microservices architecture
 

Semelhante a Princípios SOLID

Princípios de Programação Orientada a Objetos Solid, dry e kiss
Princípios de Programação Orientada a Objetos Solid, dry  e kiss Princípios de Programação Orientada a Objetos Solid, dry  e kiss
Princípios de Programação Orientada a Objetos Solid, dry e kiss DanielChristofolli
 
Aprensentacao oo-trincheiras
Aprensentacao oo-trincheirasAprensentacao oo-trincheiras
Aprensentacao oo-trincheirasHigor César
 
TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação Icaro Camelo
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareCarlos Santana
 
Um desenvolvedor com princípios SOLID
Um desenvolvedor com princípios SOLIDUm desenvolvedor com princípios SOLID
Um desenvolvedor com princípios SOLIDHélio Medeiros
 
Test-Driven Development - Introdução
Test-Driven Development - IntroduçãoTest-Driven Development - Introdução
Test-Driven Development - IntroduçãoHélio Costa e Silva
 
boas praticas
boas praticasboas praticas
boas praticaslcbj
 
Programação de Elite - Requisito dado é código implementado
Programação de Elite - Requisito dado é código implementadoProgramação de Elite - Requisito dado é código implementado
Programação de Elite - Requisito dado é código implementadoSamuel David
 
OOD - Princípio Open/Closed
OOD - Princípio Open/ClosedOOD - Princípio Open/Closed
OOD - Princípio Open/ClosedPriscila Mayumi
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaRogerio Fontes
 

Semelhante a Princípios SOLID (20)

Aplicando SOLID com PHP7
Aplicando SOLID com PHP7Aplicando SOLID com PHP7
Aplicando SOLID com PHP7
 
Potencializando a qualidade de código
Potencializando a qualidade de códigoPotencializando a qualidade de código
Potencializando a qualidade de código
 
Refatoração de Código Legado
Refatoração de Código LegadoRefatoração de Código Legado
Refatoração de Código Legado
 
Princípios de Programação Orientada a Objetos Solid, dry e kiss
Princípios de Programação Orientada a Objetos Solid, dry  e kiss Princípios de Programação Orientada a Objetos Solid, dry  e kiss
Princípios de Programação Orientada a Objetos Solid, dry e kiss
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Aprensentacao oo-trincheiras
Aprensentacao oo-trincheirasAprensentacao oo-trincheiras
Aprensentacao oo-trincheiras
 
TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Um desenvolvedor com princípios SOLID
Um desenvolvedor com princípios SOLIDUm desenvolvedor com princípios SOLID
Um desenvolvedor com princípios SOLID
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Inversion ofcontrol
Inversion ofcontrolInversion ofcontrol
Inversion ofcontrol
 
Test-Driven Development - Introdução
Test-Driven Development - IntroduçãoTest-Driven Development - Introdução
Test-Driven Development - Introdução
 
Codigo limpo.pptx
Codigo limpo.pptxCodigo limpo.pptx
Codigo limpo.pptx
 
Esteroides JEE
Esteroides JEEEsteroides JEE
Esteroides JEE
 
Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 
boas praticas
boas praticasboas praticas
boas praticas
 
Programação de Elite - Requisito dado é código implementado
Programação de Elite - Requisito dado é código implementadoProgramação de Elite - Requisito dado é código implementado
Programação de Elite - Requisito dado é código implementado
 
Software robusto e flexível
Software robusto e flexívelSoftware robusto e flexível
Software robusto e flexível
 
OOD - Princípio Open/Closed
OOD - Princípio Open/ClosedOOD - Princípio Open/Closed
OOD - Princípio Open/Closed
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 

Princípios SOLID

Notas do Editor

  1. Quem já conhecia os princípios antes? Quem consegue citar e explicar os 5 princípios?
  2. Existem várias ‘dimensões’: eficiência, testabilidade, confiabilidade, usabilidade, monitorável, manutenibilidade, clareza Qual a mais básica?
  3. Livros de Engenharia de software sempre dizem isto, certo? Ligado ao relacionamento e interdependencias entre classes Como identificar o grau de coesão e de acoplamento? Existem métricas (complexidade ciclomática, etc), mas uma forma empírica seria: pelos sintomas da falta de qualidade!
  4. Rigidez: dificil de mudar
  5. Rigidez: dificil de mudar Fragilidade: mudança em um lugar quebra ou causa bugs em vários lugares
  6. Rigidez: dificil de mudar Fragilidade: mudança em um lugar quebra ou causa bugs em vários lugares Imobilidade: partes uteis que poderiam ser reaproveitadas dão muito esforço ou risco para separar do original....
  7. Tudo isto é o famoso ‘código spaguetti’!
  8. Uma vez identificada baixa qualidade, o que podemos fazer?
  9. Principios SOLID podem ajudar! Descritos por Robert C. Martin, aka “Uncle Bob” (objectmentor, cleancoders.com)
  10. Não deve ser aplicado cegamente, sem bom senso! Ex: TP´s, protótipos Dica: utilize o Princípio quando “sentir as dores”!
  11. A classe é focada em apenas uma coisa (conceito, regra, serviço, etc)
  12. Canivete suiço: e se for preciso trocar a faca por um abridor de lata? E se a faca quebrar?
  13. Reuso = com um unica responsabilidade é maior a chance de reaproveitar Clareza = codigo tende a ser mais curto, sem ações inesperadas Nomeaçao = com um unica responsabilidade fica mais facil encontrar um nome Leitura facil = se é claro, tem bons nomes e curtos fica bem mais facil a leitura e entendimento
  14. Reuso = com um unica responsabilidade é maior a chance de reaproveitar Clareza = codigo tende a ser mais curto, sem ações inesperadas, ou seja, menor chance de ter bugs! Nomeaçao = com um unica responsabilidade fica mais facil encontrar um nome Leitura facil = se é claro, tem bons nomes e curtos fica bem mais facil a leitura e entendimento
  15. Reuso = com um unica responsabilidade é maior a chance de reaproveitar Clareza = codigo tende a ser mais curto, sem ações inesperadas, ou seja, menor chance de ter bugs! Nomeaçao = com um unica responsabilidade fica mais facil encontrar um nome Leitura facil = se é claro, tem bons nomes e curtos fica bem mais facil a leitura e entendimento
  16. Reuso = com um unica responsabilidade é maior a chance de reaproveitar Clareza = codigo tende a ser mais curto, sem ações inesperadas, ou seja, menor chance de ter bugs! Nomeaçao = com um unica responsabilidade fica mais facil encontrar um nome Leitura facil = se é claro, tem bons nomes e curtos fica bem mais facil a leitura e entendimento
  17. Reuso = com um unica responsabilidade é maior a chance de reaproveitar Clareza = codigo tende a ser mais curto, sem ações inesperadas, ou seja, menor chance de ter bugs! Nomeaçao = com um unica responsabilidade fica mais facil encontrar um nome Leitura facil = se é claro, tem bons nomes e curtos fica bem mais facil a leitura e entendimento
  18. Granularidade: Responsabilidade pode ser tão grande ou tão pequena qto se queira! Dica: pensar em razões para mudar Explosão: pode dificultar o entendimento; porem não existirá muito mais código do que se houvessem poucas classes – a logica geral é a mesma; e a clareza, tende a facilitar
  19. Granularidade: Responsabilidade pode ser tão grande ou tão pequena qto se queira! Dica: pensar em razões para mudar Explosão: pode dificultar o entendimento; porem não existirá muito mais código do que se houvessem poucas classes – a logica geral é a mesma; e a clareza, tende a facilitar
  20. Granularidade: Responsabilidade pode ser tão grande ou tão pequena qto se queira! Dica: pensar em razões para mudar Explosão: pode dificultar o entendimento; porem não existirá muito mais código útil do que se houvessem poucas classes – a logica geral é a mesma; e a clareza, tende a facilitar
  21. Dúvidas antes da demo? ETL básico: CSV para banco de dados (é incrível como isto ainda é comum...) Depois do DEMO: SRP é a ‘mãe’ de todos os demais princípios SOLID. Os demais princípios são como técnicas adicionais ou heurísticas para aplicar SRP
  22. Usar ‘if’ ou ‘switches’ ou incluir código diretamente não deve ser a primeira opção! Exceto para corrigir bugs
  23. É necessário preparar seu código para OCP! Quais técnicas podem ajudar (das piores para as melhores)
  24. Pode ser sofisticado ao usar delegates/lambdas
  25. Herança: polimorfismo/sobrescrição de métodos (problema no C#: necessário marcar métodos como virtual); Template Method Pattern;
  26. Eventos (seja nativos – C# - ou usando frameworks): sinaliza ocorrências de interesse, expondo informaçoes e ate permitindo alterar o fluxo (ex: FormClosing) – é necessário definir quais momentos serão interessantes...
  27. Métodos de extensão (C#): OCP por definição, já que a classe original permanece intacta (mas nao comece a criar bibliotecas de classes estáticas (testabilidade vai sofrer!) Javascript e linguagens dinâmicas permitem extender classes também (protótipos, mixins)
  28. Composição: Strategy Pattern; Proxy Pattern; Decorator Pattern; Chain of responsability Pattern
  29. Não introduz bugs
  30. Não introduz bugs em código existente, já testado, pois estes são minimamente alterados
  31. Reduz gráfico de dependência de cada classe
  32. Pensar em tudo que pode vir a ser necessário, no futuro, gera desperdício de tempo (a menos que vc seja um desenvolvedor de frameworks)
  33. Dúvidas antes da demo? Novo requisito: adicionar o total de registros processados
  34. Parece lógico, certo? Mas quantas vezes já viram isto ->
  35. Desconfie quando precisar usar “if (x is T)” – você pode estar violando o LSP!!
  36. Programação por contrato – Bertrand Meyer
  37. Exceto se forem exceções derivadas de exceções lançadas pelo tipo base
  38. Ex: se parâmetro pode ser nulo no tipo base, o subtipo não pode recusar um parâmetro nulo
  39. Ex: se o retorno de um método nunca era nulo no tipo base, o subtipo não pode retornar nulo no mesmo método.
  40. Ex: propriedade readonly no tipo base passa a ser mutável no subtipo
  41. FRÁGIL!
  42. Auxilia nos 3 últimos problemas (pre-cond, pos-cond e invariantes)
  43. Auxilia principalmente na ‘violação inicial’: encapsule em outra interface/classe abstrata os métodos que precisavam do teste do subtipo – agora estaremos testando se um comportamento é implementado. Relacionado ao próximo principio (ISP)
  44. Em vez de perguntar algo sobre o estado de um objeto, decidir o que fazer e então pedir ao objeto para fazer, peça diretamente ao objeto para fazê-lo, e deixe a decisão por conta do próprio objeto (relacionado ao SRP)
  45. Dúvidas antes da demo?
  46. Interfaces grandes em geral indicam violação do SRP – está fazendo coisas demais!
  47. Interface menor = alta coesão
  48. Facil pra quem implementa
  49. Menos coisas para se entender, portanto o cliente tem menos chance de errar ao usar
  50. Dúvidas antes da demo? Demo na Web ->
  51. 7 propriedades e 17 métodos, se eu contei direito!!! Observem: usa herança
  52. Mistura de Façade (UserManager) com Strategy (IUserStore, IUserPasswordStore, etc) - usa composição
  53. Utilizar uma abstração em vez de uma implementação, para facilitar a substituição de implementações
  54. Implementações nem sempre são feitas ‘sob medida’
  55. Uso de um ‘container’, responsável por ‘resolver’ as dependências (por construtor, por um ‘setter’, por uma interface)
  56. Mesmos do OCP – forma especializada de OCP
  57. Testes de unidade ficam mais fáceis: pode-se substituir uma dependência para testar uma classe em isolamento
  58. Possibilidade de se alterar implementações (usando Decorator, Proxy, Interception, etc)
  59. Pode comprometer desempenho, por exemplo
  60. Encontrar as dependencias ao ler o código fica mais dificil, principalmente quando existem várias implementações da mesma abstração
  61. Duvidas antes da demo? (Antes de ir para próximo slide) Vale reforçar...
  62. NÃO FIQUE OBCECADO! Novamente: utilize o Princípio quando “sentir as dores”!
  63. Os melhores cozinheiros sabem a ordem de preparo, as quantidades corretas, conseguem adaptar receitas e utilizar ingredientes alternativos, etc... A analogia entre programação e cozinha é bastante útil: -panelas e ingredientes corretos fazem bastante diferença -pense em quem será servido -receba feedback dos pratos servidos