3. Evolução$do$So8ware$
“Grandes( sistemas( de( so-ware( nunca( são( concluídos,( eles( simplesmente(
con6nuam(evoluindo”![Lehman]!
UML e Padrões de Projeto Centro Universitário do Triângulo 3
4. Evolução$do$So8ware$
“Grandes( sistemas( de( so-ware( nunca( são( concluídos,( eles( simplesmente(
con6nuam(evoluindo”![Lehman]!
• MoRvos!e!consequências!(algumas!Leis!de!Lehman)!
• Mudança!ConYnua!e!Crescimento!ConYnuo!
- Mudanças!são!inevitáveis!para!que!o!so[ware!conRnue!úRl!
- Adição!de!funcionalidades!para!manter!a!saRsfação!do!usuário!
UML e Padrões de Projeto Centro Universitário do Triângulo 4
5. Evolução$do$So8ware$
“Grandes( sistemas( de( so-ware( nunca( são( concluídos,( eles( simplesmente(
con6nuam(evoluindo”![Lehman]!
• MoRvos!e!consequências!(algumas!Leis!de!Lehman)!
• Mudança!ConYnua!e!Crescimento!ConYnuo!
- Mudanças!são!inevitáveis!para!que!o!so[ware!conRnue!úRl!
- Adição!de!funcionalidades!para!manter!a!saRsfação!do!usuário!
• Complexidade!Crescente!e!Qualidade!Decrescente!
- Mudanças!aumentam!a!complexidade!do!so[ware!
- Qualidade!diminui!a!não!ser!que!haja!adaptações!
UML e Padrões de Projeto Centro Universitário do Triângulo 5
6. Como$devemos$proceder?$
UML e Padrões de Projeto Centro Universitário do Triângulo 6
Pensar antes de agir!
Algumas$ações:$
• Analisar!impactos!
• Modelar,!antes!de!codificar!
• URlizar!soluções!e!técnicas!validadas!
- Não!reinventar!a!roda!!
27. O$Cenário$
Manoel! trabalha! em! uma! empresa! que! criou! um! jogo! de!
simulação! de! um! lago! com! patos.! O! jogo! pode! mostrar! uma!
grande! variedade! de! espécies! de! patos! nadando! e! produzindo$
sons.!Os!arquitetos!do!sistema!usaram!técnicas!OO!e!chegaram!ao!
seguinte!modelo!de!classes.!
!
UML e Padrões de Projeto Centro Universitário do Triângulo 27
Todos!os!patos!
grasnam!e!nadam$
O!método!display()!é!
abstrato!já!que!todos!
os!subRpos!de!patos!
são!diferentes!!$
Um método abstrato obriga a classe em que ele se encontra
ser abstrata. Dessa forma, podemos assumir que a classe
Duck é abstrata.
30. Surge$uma$manutenção$no$sistema...$
Os! execuRvos! da! empresa! decidiram! que! fazer! os!
patos!voarem!é!o!que!o!simulador!precisa!para!acabar!
com!a!concorrência.!
UML e Padrões de Projeto Centro Universitário do Triângulo 30
31. Surge$uma$manutenção$no$sistema...$
Os! execuRvos! da! empresa! decidiram! que! fazer! os!
patos!voarem!é!o!que!o!simulador!precisa!para!acabar!
com!a!concorrência.!
UML e Padrões de Projeto Centro Universitário do Triângulo 31
O que precisamos fazer para os patos voarem?
32. Surge$uma$manutenção$no$sistema...$
Os! execuRvos! da! empresa! decidiram! que! fazer! os!
patos!voarem!é!o!que!o!simulador!precisa!para!acabar!
com!a!concorrência.!
UML e Padrões de Projeto Centro Universitário do Triângulo 32
33. Surge$uma$manutenção$no$sistema...$
Os! execuRvos! da! empresa! decidiram! que! fazer! os!
patos!voarem!é!o!que!o!simulador!precisa!para!acabar!
com!a!concorrência.!
UML e Padrões de Projeto Centro Universitário do Triângulo 33
Todas!as!subclasses!
agora!herdam!o!
comportamento!de!voar$
34. Surge$uma$manutenção$no$sistema...$
Após! a! atualização! do! sistema,! em! plena!
demonstração!do!simulador!para!os!acionistas,!patos$
de$borracha!começaram!a!voar!pela!tela.!
UML e Padrões de Projeto Centro Universitário do Triângulo 34
35. Surge$uma$manutenção$no$sistema...$
Após! a! atualização! do! sistema,! em! plena!
demonstração!do!simulador!para!os!acionistas,!patos$
de$borracha!começaram!a!voar!pela!tela.!
UML e Padrões de Projeto Centro Universitário do Triângulo 35
Ao!incluirmos!o!método!fly()!
na!superclasse,!demos!a!
capacidade!de!voar!a!todos!os!
Rpos!de!patos,!incluindo!os!
que!não!deveriam!voar!$
36. Surge$uma$manutenção$no$sistema...$
Após! a! atualização! do! sistema,! em! plena!
demonstração!do!simulador!para!os!acionistas,!patos$
de$borracha!começaram!a!voar!pela!tela.!
UML e Padrões de Projeto Centro Universitário do Triângulo 36
Patos!de!borracha!
não$grasnam,!quack()!
foi!sobrescrito!para!
implementar!o!som!
de!“Squeak”$
Ao!incluirmos!o!método!fly()!
na!superclasse,!demos!a!
capacidade!de!voar!a!todos!os!
Rpos!de!patos,!incluindo!os!
que!não!deveriam!voar!$
37. Surge$uma$manutenção$no$sistema...$
Após! a! atualização! do! sistema,! em! plena!
demonstração!do!simulador!para!os!acionistas,!patos$
de$borracha!começaram!a!voar!pela!tela.!
UML e Padrões de Projeto Centro Universitário do Triângulo 37
Após a manutenção, objetos inanimados estavam voando no simulador.
A utilização de herança para fins de reutilização não é bem recebida
quando temos uma manutenção pela frente.
39. Pensando$sobre$herança...$
Poderíamos! sobrescrever! o! método! fly()! na! classe!
RubberQuack,! similar! ao! que! fizemos! com! o! método!
quack().!
UML e Padrões de Projeto Centro Universitário do Triângulo 39
O!método!fly()!foi!
sobrescrito,!mas!não!
possui!nenhum!
comportamento!para!
implementar!
!$
40. Pensando$sobre$herança...$
UML e Padrões de Projeto Centro Universitário do Triângulo 40
E!se!surgissem!novo!Rpos!de!patos!a!serem!tratados!pelo!
simulador?! Como! um! pato$ de$ madeira.! Ele! não! deve!
voar!nem!grasnar...!
41. Pensando$sobre$herança...$
UML e Padrões de Projeto Centro Universitário do Triângulo 41
E!se!surgissem!novo!Rpos!de!patos!a!serem!tratados!pelo!
simulador?! Como! um! pato$ de$ madeira.! Ele! não! deve!
voar!nem!grasnar...!
42. Pensando$sobre$herança...$
UML e Padrões de Projeto Centro Universitário do Triângulo 42
E!se!surgissem!novo!Rpos!de!patos!a!serem!tratados!pelo!
simulador?! Como! um! pato$ de$ madeira.! Ele! não! deve!
voar!nem!grasnar...!
Os!métodos!quack()!e!fly()!
foram!sobrescritos!mas!não!
possuem!comportamentos!
!$
43. Pensando$sobre$herança...$
UML e Padrões de Projeto Centro Universitário do Triângulo 43
Com!o!que!vimos!até!agora,!quais!opções!a!seguir!podem!
ser!consideradas!desvantagens!ao!se!uRlizar!herança!para!
produzir!o!comportamento!de!Duck?!
44. Pensando$sobre$herança...$
UML e Padrões de Projeto Centro Universitário do Triângulo 44
a) O!código!é!duplicado!entre!subclasses.!
b) Não!podemos!fazer!patos!dançar.!
c) É!dimcil!conhecer!o!comportamento!de!todos!os!patos.!
d) Os!patos!não!conseguem!voar!e!grasnar!ao!mesmo!tempo.!
e) As!alterações!podem!afetar!sem!querer!outros!patos.!
!
Com!o!que!vimos!até!agora,!quais!opções!a!seguir!podem!
ser!consideradas!desvantagens!ao!se!uRlizar!herança!para!
produzir!o!comportamento!de!Duck?!
45. Pensando$sobre$herança...$
UML e Padrões de Projeto Centro Universitário do Triângulo 45
a) O!código!é!duplicado!entre!subclasses.!
b) Não!podemos!fazer!patos!dançar.!
c) É!dimcil!conhecer!o!comportamento!de!todos!os!patos.!
d) Os!patos!não!conseguem!voar!e!grasnar!ao!mesmo!tempo.!
e) As!alterações!podem!afetar!sem!querer!outros!patos.!
!
Com!o!que!vimos!até!agora,!quais!opções!a!seguir!podem!
ser!consideradas!desvantagens!ao!se!uRlizar!herança!para!
produzir!o!comportamento!de!Duck?!
52. Que$tal$uma$Interface?$
UML e Padrões de Projeto Centro Universitário do Triângulo 52
Interpretação da Interface
Quem desejar ser “Flyable” precisa saber voar.
Quem desejar ser “Quackable” precisa saber grasnar.
53. Que$tal$uma$Interface?$
UML e Padrões de Projeto Centro Universitário do Triângulo 53
Interpretação de quem implementa a Interface
A classe RubberDuck se compromete a ser tratada como
Quackable, sendo obrigada a ter os métodos necessários,
definidos neste contrato.
54. Que$tal$uma$Interface?$
UML e Padrões de Projeto Centro Universitário do Triângulo 54
E se precisarmos fazer uma pequena alteração no
comportamento de vôo... de todas as inúmeras subclasses de
Duck que voam?
62. A$Constante$no$Desenvolvimento$de$So8ware$
UML e Padrões de Projeto Centro Universitário do Triângulo 62
Muitas!coisas!podem!causar!mudanças.!Relacione!alguns!
moRvos! pelos! quais! você! precisou! alterar! o! código! de!
alguma!aplicação?!
66. #1$Princípios$de$Projeto$
Iden_fique$ os$ aspectos$ de$ sua$ aplicação$ que$ variam$ e$ separePos$ do$ que$
permanece$igual.$
• Em!outras!palavras:!Pegue!as!partes!que!variam!e!encapsuleKas!para!depois!
poder!alterar!ou!estender!estas!partes!sem!afetar!as!que!não!variam.!
UML e Padrões de Projeto Centro Universitário do Triângulo 66
67. #1$Princípios$de$Projeto$
Iden_fique$ os$ aspectos$ de$ sua$ aplicação$ que$ variam$ e$ separePos$ do$ que$
permanece$igual.$
• Em!outras!palavras:!Pegue!as!partes!que!variam!e!encapsuleKas!para!depois!
poder!alterar!ou!estender!estas!partes!sem!afetar!as!que!não!variam.!
UML e Padrões de Projeto Centro Universitário do Triângulo 67
Isso traz menos consequências indesejadas nas alterações
realizadas no código e maior flexibilidade.
73. Pensando$na$Solução...$
Como$ vamos$ desenvolver$ o$ conjunto$ de$ classes$ que$
implementam$os$comportamentos$de$voar$e$grasnar?$
!
!
UML e Padrões de Projeto Centro Universitário do Triângulo 73
74. Pensando$na$Solução...$
Como$ vamos$ desenvolver$ o$ conjunto$ de$ classes$ que$
implementam$os$comportamentos$de$voar$e$grasnar?$
• Gostaríamos!de!manter!a!arquitetura!flexível.!
• Queremos!atribuir!comportamentos!às!instâncias!da!
classe!Duck;!
• Poderíamos! alterar! o! comportamento! de! uma!
instância!de!Duck!em!tempo!de!execução.!
UML e Padrões de Projeto Centro Universitário do Triângulo 74
80. #2$Princípios$de$Projeto$
Programa$para$uma$Interface$e$não$para$uma$implementação.$
UML e Padrões de Projeto Centro Universitário do Triângulo 80
Cada!comportamento!
será!!representado!por!
uma!Interface$
Implementa!o!vôo!do!
pato$
Não!possui!
implementação,!pois!é!
um!comportamento!para!
quem!não!sabe!voar$
Dessa forma, as classes derivadas de Duck não precisam conhecer
nenhum detalhe de implementação dos seus comportamentos
81. #2$Princípios$de$Projeto$
UML e Padrões de Projeto Centro Universitário do Triângulo 81
Com o novo design, as classes derivadas de Duck irão
usar um comportamento representado por uma
Interface.
A implementação real do comportamento não fica
acoplada às classes derivadas de Duck.
84. Implementando$os$Comportamentos$
UML e Padrões de Projeto Centro Universitário do Triângulo 84
Somente!as!classes!de!
vôo!implementam!
esta!Interface$
Implementação!de!
voar!para!todos!os!
patos!que!têm!asas$
85. Implementando$os$Comportamentos$
UML e Padrões de Projeto Centro Universitário do Triângulo 85
Somente!as!classes!de!
vôo!implementam!
esta!Interface$
Implementação!de!
voar!para!todos!os!
patos!que!têm!asas$
Implementação!dos!
patos!que!não!
sabem!voar$
86. Implementando$os$Comportamentos$
UML e Padrões de Projeto Centro Universitário do Triângulo 86
Somente!as!classes!de!
vôo!implementam!
esta!Interface$
Implementação!de!
voar!para!todos!os!
patos!que!têm!asas$
Implementação!dos!
patos!que!não!
sabem!voar$
Implementação!de!
grasnar!para!os!Rpos!
de!patos!que!
grasnam$
87. Implementando$os$Comportamentos$
UML e Padrões de Projeto Centro Universitário do Triângulo 87
Somente!as!classes!de!
vôo!implementam!
esta!Interface$
Implementação!de!
voar!para!todos!os!
patos!que!têm!asas$
Implementação!dos!
patos!que!não!
sabem!voar$
Implementação!para!
os!Rpos!de!patos!que!
não!emitem!som!$
Implementação!de!
grasnar!para!os!Rpos!
de!patos!que!
grasnam$
88. Implementando$os$Comportamentos$
UML e Padrões de Projeto Centro Universitário do Triângulo 88
Outros tipos de objetos podem reutilizar nossos
comportamentos de voar e grasnar.
Além disso, podemos adicionar novos comportamentos
sem modificar nenhuma de nossas classes de
comportamentos existentes.
89. Pensando$em$reuso...$
UML e Padrões de Projeto Centro Universitário do Triângulo 89
Usando! o! nosso! novo! projeto,! o! que! você! faria! se!
precisasse!adicionar!um!vôo!de!foguete!à!aplicação?!
!
Você! consegue! pensar! numa! classe! que! poderia! usar! o!
comportamento!de!Quack!que!não!seja!um!pato?!
!
!
!
90. Pensando$em$reuso...$
UML e Padrões de Projeto Centro Universitário do Triângulo 90
Usando! o! nosso! novo! projeto,! o! que! você! faria! se!
precisasse!adicionar!um!vôo!de!foguete!à!aplicação?!
Poderíamos$ criar$ uma$ classe$ FlyRocket$ que$
implementasse$a$interface$FlyBehaviour.!
Você! consegue! pensar! numa! classe! que! poderia! usar! o!
comportamento!de!Quack!que!não!seja!um!pato?!
Uma$classe$que$representasse$um$disposi_vo$eletrônico$
que$simula$sons$de$pato.!
!
!
!
95. Modelo$x$Implementação$
UML e Padrões de Projeto Centro Universitário do Triângulo 95
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
// outros métodos aqui..
}
97. Mais$integração...$
• Como! agora! estamos! delegando! o! comportamento! de! voar! e! grasnar,!
temos!que!definir!as!variáveis!de!instância!flyBehaviour!e!quackBehaviour!
nas!subclasses!de!Duck.!!
UML e Padrões de Projeto Centro Universitário do Triângulo 97
98. Mais$integração...$
• Como! agora! estamos! delegando! o! comportamento! de! voar! e! grasnar,!
temos!que!definir!as!variáveis!de!instância!flyBehaviour!e!quackBehaviour!
nas!subclasses!de!Duck.!!
UML e Padrões de Projeto Centro Universitário do Triângulo 98
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
99. Mais$integração...$
• Como! agora! estamos! delegando! o! comportamento! de! voar! e! grasnar,!
temos!que!definir!as!variáveis!de!instância!flyBehaviour!e!quackBehaviour!
nas!subclasses!de!Duck.!!
UML e Padrões de Projeto Centro Universitário do Triângulo 99
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
A!classe!MallarDuck!
herda!a!variáveis!de!
instância!de!Quack$$
100. Mais$integração...$
• Como! agora! estamos! delegando! o! comportamento! de! voar! e! grasnar,!
temos!que!definir!as!variáveis!de!instância!flyBehaviour!e!quackBehaviour!
nas!subclasses!de!Duck.!!
UML e Padrões de Projeto Centro Universitário do Triângulo 100
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
A!responsabilidade!de!
grasnar!é!delegada!ao!
objeto!Quack$$
101. Mais$integração...$
• Como! agora! estamos! delegando! o! comportamento! de! voar! e! grasnar,!
temos!que!definir!as!variáveis!de!instância!flyBehaviour!e!quackBehaviour!
nas!subclasses!de!Duck.!!
UML e Padrões de Projeto Centro Universitário do Triângulo 101
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
Como!MallarDuck!
sabe!como!voar!este!
comportamento!é!
uRlizado$
102. Comportamento$Dinâmico$
UML e Padrões de Projeto Centro Universitário do Triângulo 102
Como$podemos$alterar$o$comportamento$de$um$Duck$
após$sua$instanciação?$
103. Comportamento$Dinâmico$
UML e Padrões de Projeto Centro Universitário do Triângulo 103
Como$podemos$alterar$o$comportamento$de$um$Duck$
após$sua$instanciação?$
Como$podemos$alterar$este$comportamento$de$forma$
dinâmica$(em$tempo$de$execução)?$
104. Comportamento$Dinâmico$
UML e Padrões de Projeto Centro Universitário do Triângulo 104
Como$podemos$alterar$o$comportamento$de$um$Duck$
após$sua$instanciação?$
Como$podemos$alterar$este$comportamento$de$forma$
dinâmica$(em$tempo$de$execução)?$
Por meio da mágica do polimorfismo, podemos atribuir dinamicamente
uma classe de implementação diferente em tempo de execução.
106. Comportamento$Dinâmico$
• Criaremos!um!novo!Rpo!de!pato.!
!
!
!
UML e Padrões de Projeto Centro Universitário do Triângulo 106
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("I'm a model duck");
}
}
107. Comportamento$Dinâmico$
• Criaremos!um!novo!Rpo!de!pato.!
!
!
!
UML e Padrões de Projeto Centro Universitário do Triângulo 107
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("I'm a model duck");
}
}
O!novo!modelo!de!
pato!começa!a!vida!no!
chão,!sem!nenhuma!
maneira!de!voar!