D de SOLID: Reduzindo o vendor
lock-in em aplicações PHP
Flávio Gomes da Silva Lisboa, Ph. D.
www.fgsl.eti.br
Quem sou eu?
●
Mestre e doutor em Tecnologia e Sociedade pela UTFPR;
●
Cientista da computação, com especialização em programação
orientada a objetos e Tecnologia Java;
●
Engenheiro e arquiteto certificado pela Zend;
●
Analista de sistemas e programador com mais de duas décadas
de experiência;
●
Professor de ensino médio e técnico, com experiência no ensino
superior e em cursos corporativos.
‘
FREE/LIBRE E OPEN SOURCE
SOFTWARE
Quem sou eu?
●
Autor dos livros:
Escrevo sobre Zend Framework desde 2008
Escrevo sobre Zend Framework desde 2008
Escrevi o primeiro livro exclusivo sobre Symfony
Quem sou eu?
●
Autor do livro:
Quem sou eu?
●
Autor do livro:
Quem sou eu?
●
Autor do livro:
Preâmbulo
Tudo que falaremos aqui trata de manutenção de
software. Se você vai fazer software pra ser
jogado fora, não há aplicação para o que
falaremos.
Preâmbulo
Mas se você vai fazer software que será mantido,
atualizado, evoluído e aperfeiçoado, então
deveria se preocupar com os tópicos que
abordaremos.
Mudança: requisito não funcional
Mudança: requisito não funcional
Mudança: requisito não funcional
Não se pode
entrar duas
vezes no
mesmo rio
Ἡράκλειτος ὁ Ἐφέσιος
Heráclito, de Éfeso
Mudança: requisito não funcional
TEM UM
BUG, E
AGORA?
A LEI
MUDOU, E
AGORA?
O CLIENTE
MUDOU DE
IDEIA, E
AGORA?
Mudança: requisito não funcional
A MUDANÇA
É
INEVITÁVEL!
Mudança: requisito não funcional
É melhor estar preparado para a mudança
Arquitetura de software não é
arquitetura de sistema
Como substantivo,
arquitetura pode ser
resumida como sendo
sobre estrutura.
Arquitetura de software não é
arquitetura de sistema
Como verbo, arquitetura (ou
seja, o processo, arquitetar)
trata de entender o que você
precisa construir, criar uma
visão para construí-lo e tomar
as decisões de design
apropriadas.
Arquitetura de software não é
arquitetura de sistema
Arquitetura de sistema é
uma mistura de software e hardware.
Na arquitetura de sistema, você se preocupa com
as máquinas onde o software será executado.
E a escolha de um hardware específico antes do
software pode limitar o software a ser utilizado.
Arquitetura de software não é
arquitetura de sistema
Se você escolhe a casa antes dos móveis, os
móveis serão limitados pela casa.
Se você escolhe os móveis antes da casa, a casa
será limitada pelos móveis.
Arquitetura de software não é
arquitetura de sistema
Quando pensamos em
desenvolvimento de software como
desenvolvedores de software, a
maior parte do nosso foco é
colocada no código. Aqui, estamos
pensando em coisas como princípios
orientados a objetos, classes,
interfaces, inversão de controle,
refatoração, testes unitários
automatizados, código limpo e
inúmeras outras práticas técnicas
que nos ajudam a construir um
software melhor.
Arquitetura de software não é
arquitetura de sistema
O software sempre será limitado pelo hardware.
Mas limitar um software por um hardware
específico é como limitar um algoritmo por uma
linguagem de programação específica.
Arquitetura de software não é
arquitetura de sistema
É ASSIM QUE EU
TRABALHO, CARA!
VOCÊ TEM QUE
MUDAR SEU
ALGORITMO PARA SE
AJUSTAR À MINHA
IMPLEMENTAÇÃO!
LINGUAGEM DE
PROGRAMAÇÃO
Arquitetura de software não é
arquitetura de sistema
Diz que trabalha com microsserviços
Mas faz um sistema usando só uma
linguagem de programação!
Que microsserviço é esse?
Arquitetura de software não é
arquitetura de sistema
MAIS UM MICROSSERVIÇO QUE
PODERIA TER SIDO
IMPLEMENTADO EM PHP, MAS
FOI FEITO NA MESMA
LINGUAGEM DO
SISTEMA TODO
Arquitetura de software não é
arquitetura de sistema
PENSE
NISSO!
Como se tornar dependente
A arquitetura do
sistema é descrita
em termos de
níveis mais
elevados de
abstração
Como se tornar dependente
●
A arquitetura do sistema envolve a definição de
hardware.
●
Essa definição deve se referir à função de
hardware e não a uma marca de um
determinado fornecedor.
Como se tornar dependente
●
Na nuvem, esse problema parece inexistente,
porque você não “vê” o hardware.
●
Aí surge outro problema: o software de
infraestrutura, que opera como um hardware
virtual.
SOU QUASE
UM
HARDWARE!
Como se tornar dependente
É ASSIM QUE EU
TRABALHO, CARA!
VOCÊ TEM QUE
MUDAR SUA
APLICAÇÃO PARA SE
AJUSTAR AO MEU
AMBIENTE!
PROVEDOR DE
NUVEM
Como se tornar dependente
TENHO
SERVIÇOS E
COMPONENTES
QUE VÃO DEIXAR
SUA APLICAÇÃO
MUITO LOUCA,
CARA!
PROVEDOR DE
NUVEM
E me deixar
louco de
raiva?
Como se tornar dependente
VOCÊ USA COMPONENTES INADEQUADOS OU DE FORMA INADEQUADA?
Como se tornar dependente
VOCÊ ENTENDEU REALMENTE O DESIGN PATTERN ADAPTER?
Como se tornar dependente
ESTE COMPONENTE PELO MENOS TEM FRACO ACOPLAMENTO...
Como se tornar dependente
O SEU CÓDIGO É EMERGENCIAL?
Precisamos fazer
uma GRANDE
mudança
IMEDIATAMENTE!
Preciso fazer
um código que
funcione
LOGO!
Como se tornar dependente
O CENÁRIO É ESTE:
●
Você precisa implementar rápido
●
Não dá tempo de aplicar a melhor solução
●
Não dá tempo de achar alguém que
implementou a melhor solução.
●
A equipe trabalha sobre o Princípio
Scooby-Doo.
Como se tornar dependente
VOU FAZER DE
QUALQUER JEITO
AGORA, DEPOIS EU
MELHORO.
NUNCA VAI
MELHORAR!
Invertendo a dependência com vigor
●
Você pode criar um componente incompleto.
●
Só precisa prepará-lo para crescer.
Invertendo a dependência com vigor
●
Pense no futuro!
●
Cidades e código-fonte crescem!
Invertendo a dependência com vigor
Hoje você não precisa traduzir sua aplicação.
Mas e amanhã?
Ninguém pediu ainda, então não posso perder tempo fazendo algo que
não me pagaram pra fazer.
Você pode criar uma função ou método para tradução... que apenas
devolva o que recebeu.
Isso evitará que no futuro você tenha de alterar dezenas (ou centenas)
de arquivos para dar suporte à tradução.
E quando implementar essa função ou método… não acople ela
fortemente a nada!
Invertendo a dependência com vigor
Crie código extensível.
Permita que alguém conclua sua obra.
Invertendo a dependência com vigor
Faça seu software conversar com outros.
Use protocolos de comunicação compreensíveis por outros
componentes e aplicações, preferencialmente abertos.
EVITE IMPLEMENTAÇÕES EXCLUSIVAS DE UM
FORNECEDOR!
No caso de PHP, faça com que seus componentes possam
utilizar ou ser utilizados por outros componentes PHP
facilmente.
Invertendo a dependência com vigor
NÃO CRIE LAÇOS!
SUA APLICAÇÃO
COMPONENTE
DE TERCEIRO 1
COMPONENTE
DE TERCEIRO 2
COMPONENTE
DE TERCEIRO 3
FORTE ACOPLAMENTO
Invertendo a dependência com vigor
NÃO CRIE LAÇOS!
SUA APLICAÇÃO
COMPONENTE
DE TERCEIRO 1
COMPONENTE
DE TERCEIRO 2
COMPONENTE
DE TERCEIRO 3
Invertendo a dependência com vigor
NÃO CRIE LAÇOS!
SUA APLICAÇÃO
COMPONENTE
DE TERCEIRO 1
COMPONENTE
DE TERCEIRO 2
COMPONENTE
DE TERCEIRO 3
CAMADA DE INTEGRAÇÃO
Cuidado com frameworks!
“Frameworkitis é a doença que um framework quer fazer
muito por você ou faz de uma forma que você não quer, mas
você não pode mudar. É divertido obter toda essa
funcionalidade de graça, mas dói quando a funcionalidade
gratuita atrapalha. Mas agora você está preso ao framework.
Para obter o comportamento desejado, você começa a lutar
contra o framework. E nesse ponto você geralmente começa
a perder, porque é difícil dobrar o framework em uma direção
que ele não antecipou.”
ERICH GAMMA http://www.artima.com/lejava/articles/reuseP.html
Cuidado com frameworks!
MVC: O Ponto Crítico dos Frameworks
A implementação do architecture pattern MVC (Model
View Controller) geralmente é a que tem o maior conjunto
de acoplamentos.
Cuidado com frameworks!
MVC: O Ponto Crítico dos Frameworks
Ao optar por uma implementação MVC específica,
estamos assinando um contrato com várias cláusulas de
obrigação, para usufruir de benefícios oferecidos por ela.
Cuidado com frameworks!
MVC: O Ponto Crítico dos Frameworks
Procure uma implementação flexível, configurável, que
permita injeção de dependências, para que você possa
trocar implementações custosas por alternativas mais
leves (ou ter a possibilidade de obliterar processos).
Cuidado com frameworks!
MVC: O Ponto Crítico dos Frameworks
A implementação MVC não pode ser um televisor que não
funciona sem controle remoto!
Cuidado com frameworks!
MVC: O Ponto Crítico dos Frameworks
A implementação MVC deve permitir que você escolha os
componentes que realmente precisa.
Ela deve ser capaz de não fazer nada além do
necessário.
E o que o SOLID
tem a ver com isso?
E o que o SOLID
tem a ver com isso?
“O princípio de inversão de dependências [a letra D do
SOLID] diz respeito à depender de uma abstração e
não de uma implementação. Nesse caso, todos os
demais princípios são aplicados, garantindo que os
sistemas sejam o mais desacoplados e coesos possível”.
MAGNO SANTOS, citando ROBERT CECIL MARTIN
E o que o SOLID
tem a ver com isso?
Esse princípio deriva da orientação de Erich Gamma e
seus incríveis amigos no livro Design Patterns:
Programe para uma interface, não para uma
implementação.
CRIE CÓDIGO INDEPENDENTE!
OBRIGADO!
www.fgsl.eti.br

D de SOLID: Reduzindo o vendor lock-in em aplicações PHP

  • 1.
    D de SOLID:Reduzindo o vendor lock-in em aplicações PHP Flávio Gomes da Silva Lisboa, Ph. D. www.fgsl.eti.br
  • 2.
    Quem sou eu? ● Mestree doutor em Tecnologia e Sociedade pela UTFPR; ● Cientista da computação, com especialização em programação orientada a objetos e Tecnologia Java; ● Engenheiro e arquiteto certificado pela Zend; ● Analista de sistemas e programador com mais de duas décadas de experiência; ● Professor de ensino médio e técnico, com experiência no ensino superior e em cursos corporativos. ‘
  • 3.
    FREE/LIBRE E OPENSOURCE SOFTWARE
  • 4.
  • 5.
    Escrevo sobre ZendFramework desde 2008
  • 6.
    Escrevo sobre ZendFramework desde 2008
  • 7.
    Escrevi o primeirolivro exclusivo sobre Symfony
  • 8.
  • 9.
  • 10.
  • 12.
    Preâmbulo Tudo que falaremosaqui trata de manutenção de software. Se você vai fazer software pra ser jogado fora, não há aplicação para o que falaremos.
  • 13.
    Preâmbulo Mas se vocêvai fazer software que será mantido, atualizado, evoluído e aperfeiçoado, então deveria se preocupar com os tópicos que abordaremos.
  • 14.
  • 15.
  • 16.
    Mudança: requisito nãofuncional Não se pode entrar duas vezes no mesmo rio Ἡράκλειτος ὁ Ἐφέσιος Heráclito, de Éfeso
  • 17.
    Mudança: requisito nãofuncional TEM UM BUG, E AGORA? A LEI MUDOU, E AGORA? O CLIENTE MUDOU DE IDEIA, E AGORA?
  • 18.
    Mudança: requisito nãofuncional A MUDANÇA É INEVITÁVEL!
  • 19.
    Mudança: requisito nãofuncional É melhor estar preparado para a mudança
  • 20.
    Arquitetura de softwarenão é arquitetura de sistema Como substantivo, arquitetura pode ser resumida como sendo sobre estrutura.
  • 21.
    Arquitetura de softwarenão é arquitetura de sistema Como verbo, arquitetura (ou seja, o processo, arquitetar) trata de entender o que você precisa construir, criar uma visão para construí-lo e tomar as decisões de design apropriadas.
  • 22.
    Arquitetura de softwarenão é arquitetura de sistema Arquitetura de sistema é uma mistura de software e hardware. Na arquitetura de sistema, você se preocupa com as máquinas onde o software será executado. E a escolha de um hardware específico antes do software pode limitar o software a ser utilizado.
  • 23.
    Arquitetura de softwarenão é arquitetura de sistema Se você escolhe a casa antes dos móveis, os móveis serão limitados pela casa. Se você escolhe os móveis antes da casa, a casa será limitada pelos móveis.
  • 24.
    Arquitetura de softwarenão é arquitetura de sistema Quando pensamos em desenvolvimento de software como desenvolvedores de software, a maior parte do nosso foco é colocada no código. Aqui, estamos pensando em coisas como princípios orientados a objetos, classes, interfaces, inversão de controle, refatoração, testes unitários automatizados, código limpo e inúmeras outras práticas técnicas que nos ajudam a construir um software melhor.
  • 25.
    Arquitetura de softwarenão é arquitetura de sistema O software sempre será limitado pelo hardware. Mas limitar um software por um hardware específico é como limitar um algoritmo por uma linguagem de programação específica.
  • 26.
    Arquitetura de softwarenão é arquitetura de sistema É ASSIM QUE EU TRABALHO, CARA! VOCÊ TEM QUE MUDAR SEU ALGORITMO PARA SE AJUSTAR À MINHA IMPLEMENTAÇÃO! LINGUAGEM DE PROGRAMAÇÃO
  • 27.
    Arquitetura de softwarenão é arquitetura de sistema Diz que trabalha com microsserviços Mas faz um sistema usando só uma linguagem de programação! Que microsserviço é esse?
  • 28.
    Arquitetura de softwarenão é arquitetura de sistema MAIS UM MICROSSERVIÇO QUE PODERIA TER SIDO IMPLEMENTADO EM PHP, MAS FOI FEITO NA MESMA LINGUAGEM DO SISTEMA TODO
  • 29.
    Arquitetura de softwarenão é arquitetura de sistema PENSE NISSO!
  • 30.
    Como se tornardependente A arquitetura do sistema é descrita em termos de níveis mais elevados de abstração
  • 31.
    Como se tornardependente ● A arquitetura do sistema envolve a definição de hardware. ● Essa definição deve se referir à função de hardware e não a uma marca de um determinado fornecedor.
  • 32.
    Como se tornardependente ● Na nuvem, esse problema parece inexistente, porque você não “vê” o hardware. ● Aí surge outro problema: o software de infraestrutura, que opera como um hardware virtual. SOU QUASE UM HARDWARE!
  • 33.
    Como se tornardependente É ASSIM QUE EU TRABALHO, CARA! VOCÊ TEM QUE MUDAR SUA APLICAÇÃO PARA SE AJUSTAR AO MEU AMBIENTE! PROVEDOR DE NUVEM
  • 34.
    Como se tornardependente TENHO SERVIÇOS E COMPONENTES QUE VÃO DEIXAR SUA APLICAÇÃO MUITO LOUCA, CARA! PROVEDOR DE NUVEM E me deixar louco de raiva?
  • 35.
    Como se tornardependente VOCÊ USA COMPONENTES INADEQUADOS OU DE FORMA INADEQUADA?
  • 36.
    Como se tornardependente VOCÊ ENTENDEU REALMENTE O DESIGN PATTERN ADAPTER?
  • 37.
    Como se tornardependente ESTE COMPONENTE PELO MENOS TEM FRACO ACOPLAMENTO...
  • 38.
    Como se tornardependente O SEU CÓDIGO É EMERGENCIAL? Precisamos fazer uma GRANDE mudança IMEDIATAMENTE! Preciso fazer um código que funcione LOGO!
  • 39.
    Como se tornardependente O CENÁRIO É ESTE: ● Você precisa implementar rápido ● Não dá tempo de aplicar a melhor solução ● Não dá tempo de achar alguém que implementou a melhor solução. ● A equipe trabalha sobre o Princípio Scooby-Doo.
  • 40.
    Como se tornardependente VOU FAZER DE QUALQUER JEITO AGORA, DEPOIS EU MELHORO. NUNCA VAI MELHORAR!
  • 41.
    Invertendo a dependênciacom vigor ● Você pode criar um componente incompleto. ● Só precisa prepará-lo para crescer.
  • 42.
    Invertendo a dependênciacom vigor ● Pense no futuro! ● Cidades e código-fonte crescem!
  • 43.
    Invertendo a dependênciacom vigor Hoje você não precisa traduzir sua aplicação. Mas e amanhã? Ninguém pediu ainda, então não posso perder tempo fazendo algo que não me pagaram pra fazer. Você pode criar uma função ou método para tradução... que apenas devolva o que recebeu. Isso evitará que no futuro você tenha de alterar dezenas (ou centenas) de arquivos para dar suporte à tradução. E quando implementar essa função ou método… não acople ela fortemente a nada!
  • 44.
    Invertendo a dependênciacom vigor Crie código extensível. Permita que alguém conclua sua obra.
  • 45.
    Invertendo a dependênciacom vigor Faça seu software conversar com outros. Use protocolos de comunicação compreensíveis por outros componentes e aplicações, preferencialmente abertos. EVITE IMPLEMENTAÇÕES EXCLUSIVAS DE UM FORNECEDOR! No caso de PHP, faça com que seus componentes possam utilizar ou ser utilizados por outros componentes PHP facilmente.
  • 46.
    Invertendo a dependênciacom vigor NÃO CRIE LAÇOS! SUA APLICAÇÃO COMPONENTE DE TERCEIRO 1 COMPONENTE DE TERCEIRO 2 COMPONENTE DE TERCEIRO 3 FORTE ACOPLAMENTO
  • 47.
    Invertendo a dependênciacom vigor NÃO CRIE LAÇOS! SUA APLICAÇÃO COMPONENTE DE TERCEIRO 1 COMPONENTE DE TERCEIRO 2 COMPONENTE DE TERCEIRO 3
  • 48.
    Invertendo a dependênciacom vigor NÃO CRIE LAÇOS! SUA APLICAÇÃO COMPONENTE DE TERCEIRO 1 COMPONENTE DE TERCEIRO 2 COMPONENTE DE TERCEIRO 3 CAMADA DE INTEGRAÇÃO
  • 49.
    Cuidado com frameworks! “Frameworkitisé a doença que um framework quer fazer muito por você ou faz de uma forma que você não quer, mas você não pode mudar. É divertido obter toda essa funcionalidade de graça, mas dói quando a funcionalidade gratuita atrapalha. Mas agora você está preso ao framework. Para obter o comportamento desejado, você começa a lutar contra o framework. E nesse ponto você geralmente começa a perder, porque é difícil dobrar o framework em uma direção que ele não antecipou.” ERICH GAMMA http://www.artima.com/lejava/articles/reuseP.html
  • 50.
    Cuidado com frameworks! MVC:O Ponto Crítico dos Frameworks A implementação do architecture pattern MVC (Model View Controller) geralmente é a que tem o maior conjunto de acoplamentos.
  • 51.
    Cuidado com frameworks! MVC:O Ponto Crítico dos Frameworks Ao optar por uma implementação MVC específica, estamos assinando um contrato com várias cláusulas de obrigação, para usufruir de benefícios oferecidos por ela.
  • 52.
    Cuidado com frameworks! MVC:O Ponto Crítico dos Frameworks Procure uma implementação flexível, configurável, que permita injeção de dependências, para que você possa trocar implementações custosas por alternativas mais leves (ou ter a possibilidade de obliterar processos).
  • 53.
    Cuidado com frameworks! MVC:O Ponto Crítico dos Frameworks A implementação MVC não pode ser um televisor que não funciona sem controle remoto!
  • 54.
    Cuidado com frameworks! MVC:O Ponto Crítico dos Frameworks A implementação MVC deve permitir que você escolha os componentes que realmente precisa. Ela deve ser capaz de não fazer nada além do necessário.
  • 55.
    E o queo SOLID tem a ver com isso?
  • 56.
    E o queo SOLID tem a ver com isso? “O princípio de inversão de dependências [a letra D do SOLID] diz respeito à depender de uma abstração e não de uma implementação. Nesse caso, todos os demais princípios são aplicados, garantindo que os sistemas sejam o mais desacoplados e coesos possível”. MAGNO SANTOS, citando ROBERT CECIL MARTIN
  • 57.
    E o queo SOLID tem a ver com isso? Esse princípio deriva da orientação de Erich Gamma e seus incríveis amigos no livro Design Patterns: Programe para uma interface, não para uma implementação.
  • 58.
  • 59.