programação orientada a objetos: desenvolvimento avançado...

86
FACULDADE DE ENGENHARIA ELÉTRICA E DE COMPUTAÇÃO Slide 1 Programação orientada a objetos: Desenvolvimento avançado em C++ Ivan Luiz Marques Ricarte DCA/FEEC/UNICAMP Slide 2 Objetivos Apresentar principais tendências no desenvolvimento de software; Compreender conceitos da orientação a objetos de modo a obter software que pode ser (de fato) reutilizado; e Como aplicar esses conceitos para o desenvolvimento de software reutilizável em C++. ilmr 3

Upload: others

Post on 11-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide1

Programaçãoorientada a objetos:

Desenvolvimento avançadoemC++

IvanLuiz MarquesRicarte

DCA/FEEC/UNICAMP

Slide2

Objetivos

� Apresentarprincipaistendênciasno desenvolvimentodesoftware;

� Compreenderconceitosdaorientaçãoaobjetosdemodoaobter

software quepodeser(defato)reutilizado;e

� Comoaplicaressesconceitosparao desenvolvimentodesoftware

reutilizável emC++.

ilmr 3

Page 2: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide3

Público-alvo

ProgramadorescomconhecimentodeC++ e comexperiênciade

participaçãoemprojetosdesistemasdesoftware.

� Comovocêsedescreveriaemtermosdesuaatividadeprofissional?

� Porquedesenvolversoftware é partedesuaatividade?

Slide4

Visãogeral

� Desenvolvimentodesoftware

– Estratégiasbásicas

– Tendênciasatuais

– Problemasno desenvolvimentodeprojetos

� Soluçõesparao desenvolvimentodeprojetos

– padrõesdeprojetos

– técnicasparaprogramaçãogenérica

– usoefetivo deC++ e STL

ilmr 5

Page 3: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide5

Desenvolvimento

de

software

Slide6

Por queseinvestetanto no desenvolvimento desoftware?

� Dependênciadasociedadeemrelaçãoaosprodutosdesoftware

– Atividadescotidianas

– Sistemascríticos

� Buscapelamelhorqualidadedo software

– Confiabilidade

� Usodesoftwareno processodedesenvolvimentodesoftware

ilmr 7

Page 4: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide7

Evoluçãodo desenvolvimento desoftware

1950–60’s Softwareorientadopelohardware

1960–70’s Softwarecomoproduto

bibliotecasdesoftware

1970–80’s Softwareemsistemascomplexos

popularizaçãodemicroprocessadores

sistemasdistribuídos

1990’s–?? Softwareresponsávelpelamaiorpartedocustoem

sistemascomputacionais

Slide8

Disciplina no desenvolvimento desoftware

� O foconaqualidadeemdesenvolvimentodesoftware dependeda

aplicaçãoconsistenteedisciplinadade

processos:estabelecimentodeumabasesólidaparao

desenvolvimentodesoftware

métodos: estratégiase técnicasparaaconstruçãodesoftware

ferramentas: suporteautomatizadoparaprocessose métodos

ilmr 9

Page 5: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide9

A promessada Engenhariade Software

Qualidade de software

Processo

Métodos

Ferramentas

Slide10

Modelospara processos

� Combinaçõesevariaçõesemtornode

Análise: capturarinformaçãosobreo domíniodo problemae construir

modelosoperacionaisparao sistema

Projeto: transformarmodelosdaanáliseemmodelosdeelementos

computacionais

Codificação: implementaroselementoscomputacionaisdo sistema

Teste: encontrarerrosnaimplementação

Manutenção: tudodenovo a cadamudança

� Resultado:código(o produtofinal)

ilmr 11

Page 6: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide11

Por quedesenvolver softwareé difícil?

� FrederickBrooks:No SilverBullet paraconstruirsoftware

– Conjuntodeconstruçõesconceituais

– Complexo e não-linear

– Sujeitoamudançase modificações

– Invisível e não-visualizável

� Phillip Armour: software nãoé um produto,masumaformade

armazenarconhecimento

– desenvolver software nãoé “produzirumproduto”,masadquirir

conhecimento

Slide12

Comodesenvolver bom software?

� Balançoentreênfaseno produtovs.ênfaseno processo

– construçõese linguagensdeprogramação

– estratégiase metodologias

� “Porémo produtonãoé o código,massim o conhecimentonele

embutido” P. Armour

– Encerradoo desenvolvimento,todoo software deveriaserreescrito

ilmr 13

Page 7: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide13

As cinco ordensde ignorância

� OI-0: faltadeignorância

– conhecealgumacoisaepodedemonstraresseconhecimento

� OI-1: faltadeconhecimento

– nãosabealgumacoisae sabeidentificarestefato

� OI-2: faltadeconsciência

– nãosabealgumacoisae nemsabequenãosabe

� OI-3: faltadeprocesso

– OI-2 e nãosabecomofazerparadescobrirquehácoisasquenãosabe

� OI-4: meta-ignorância

– nãosabesobreascincoordensdeignorância

Slide14

Ordens de ignorância edesenvolvimento desoftware

� OI-0: sistemafuncionandocorretamento

– tema resposta

� OI-1: variáveissãoconhecidas

– tema questão

� OI-2: ondemuitosprojetoscomeçam.. .

– nemaresposta,nema questão

� OI-3: ondemorao perigo.. .

– metodologiasdedesenvolvimentodevemmostrarondefaltaconhecimento

ilmr 15

Page 8: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide15

O papelda orientaçãoa objetos

� Porsi, nãoéa respostadefinitivaàsnossaspreces

– Porém,éno momentoa melhormaneiradeexpressarnossoconhecimento

sobresoftware

� Diversasmetodologias

� Diversaslinguagens

– UML

– Java

– . . .

– C++

Slide16

O desenvolvimento orientado a objetos

� Desenvolvimentonãocomeçanacodificação

� Visõesdaarquiteturado sistema

– Sistema:coleçãodesubsistemas

– Subsistema:agrupamentodeelementos

� Modelos

– Abstraçãodeumsistemasemanticamentefechada

� Diagramassobreaspectosestáticosedinâmicos

– Apresentaçãográficadeumconjuntodeelementos

ilmr 17

Page 9: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide17

A programaçãoorientada a objetos

� Transiçãodosmodelosdeprojetoparao códigoé facilitadapelo

vocabuláriocomum

� Linguagensorientadasa objetospermitemexpressardiretamenteos

conceitosusadosno desenvolvimentoorientadoa objetos

– classes,atributose métodos

– objetos

– associaçõese composições

– herança:reaproveitamentodedefinições

Slide18

A velhapromessanãocumprida. . .

� “Com a orientaçãoa objetos,vocêpoderáreaproveitarcódigojá

desenvolvido e assimacelerara produçãodesoftware.”

� Porém,muitasvezesusamossoftware “genérico”emnossos

desenvolvimentos

– naformacomoestáouadaptadoàsnossasnecessidades.

ilmr 19

Page 10: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide19

Comodesenvolver softwarequepodeser reaproveitado,semcair nasvelhasarmadilhas do desenvolvimento de

software?

Slide20

Reaproveitando experiênciasno desenvolvimento desoftware

� Boasexperiências

– Padrões:soluçõesreconhecidas

� Másexperiências

– Antipadrões:enganosusuais

ilmr 21

Page 11: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide21

Por queestudarantipadrões?

� Cincoemcadaseisprojetosnãosãoconsideradosdesucesso

– Um terçodeprojetoscancelados

– Recursosdecustoe tempoinadequados

– Resultadospoucoflexíveisouextensíveis

� Antipadrões:soluçãoparaumproblemaquegeradecididamente

conseqüênciasnegativas

– Antipadrõesdedesenvolvimento:problemastécnicosencontradospelos

programadores

– Antipadrõesdearquitetura:problemasnaestruturado sistema

– Antipadrõesdegerência:problemasnaorganizaçãodeprocessose

desenvolvimento

Slide22

Antipadrões: causasprimárias (7 pecadoscapitais)

Pressa: quandoo deadlineseaproxima,qualquercoisaqueparece

funcionaréaceitável

Apatia: nãoresolverproblemasconhecidos

Mente estreita: nãopraticarsoluçõesreconhecidascomoefetivas

Preguiça: tomardecisõespobresusandoa “respostafácil”

Avareza: apegar-seadetalhesexcessivosnamodelagem

Ignorância: nãobuscarcompreender(e.g.,migraçãodecódigo)

Orgulho: síndromedo “não-foi-feito-por-nós”

ilmr 23

Page 12: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide23

Como usar antipadrões

� Nãoé para“caçarbruxas”� A empresanãonecessariamenteprecisaestarlivre deantipadrões

– endereçarproblemascrônicos

� Propósitoé desenvolvere implementarestratégiaspararesolverosproblemasdecorrentesdasmáspráticas

� Seháproblemas,é precisomotivarpessoasaassumiremresponsabilidades

1. Qualé o problema?

2. O queoutraspessoasestãofazendoparacontribuir paraa soluçãodesteproblema?

3. O quevocêestáfazendoparacontribuir paraa soluçãodesteproblema?

Slide24

Antipadrões no desenvolvimento desoftware

� Nãobastaapontarondeestáo problema,masé precisoindicar

caminhosparaasolução

� No desenvolvimentodesoftware, técnicasbásicasderefabricaçãode

programasincluem:

– Abstraçãoparasuperclasse

– Eliminaçãocondicional

– Abstraçãoagregada

ilmr 25

Page 13: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide25

Abstraçãopara superclasse

� Aplicável a duasou maisclassessimilares

1. Transformarassinaturasdemétodossimilaresemassinaturas

comuns

2. Criar superclasseabstrata

3. Modificarcódigoparacombinarimplementaçõesselecionadas

4. Migrar métodoscomunsparasuperclasse

Slide26

Eliminação condicional

� Estruturae comportamentodeumaclasseé muito dependentedeum

comandocondicional

1. Criar novassubclassescorrespondentesacadacondição

2. Migrar o códigodeaçãoassociadoa cadacondiçãoparaanova

subclasse

3. Redirecionarasreferênciasàsclassesparaindicarasubclasse

adequada

– Podeafetarconstrutores,declaraçõesdetipo e invocaçõesa métodos

sobrecarregados

ilmr 27

Page 14: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide27

Abstraçãoagregada

� Reorganizarelacionamentosdeclassesparamelhorarestruturae

extensibilidade

� Possíveisformas

– Transformarrelacionamentosdeherançaemrelacionamentosde

agregação

– Migrar classesagregadaspararelacionamentosdecomponentes

– Migrar relacionamentosdecomponentespararelacionamentosde

agregação

Slide28

Antipadrão: A Bolha

Estaclasseé o coraçãodenossaarquitetura!

Forma geral: Umaclassemonopolizao processamento,outrasclasses

encapsulamdados� Tipicamente,herançadeprojetoprocedimental(processosvs. dados)

Sintomaseconseqüências:classescomgrandenúmerodeatributosou

métodos,perdendoasvantagensdaorientaçãoaobjetose tornando

difícil testee reuso

Solução: identificaratributoseoperaçõesrelacionadasdeacordocom

contratoscoesos,migrandoessascoleçõesdefuncionalidadesparaseus

“laresnaturais”;revisarassociações

ilmr 29

Page 15: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide29

Antipadrão: Fluxo de Lava

Achoquenãoé usado,masnãotenhocerteza.. .deixepor aí.

Forma geral: fragmentosdecódigo,variáveisdeclassesaparentementenãorelacionadoscomo sistema

Sintomaseconseqüências:segmentoscomplexossemdocumentação,

blocosdecódigocomentadossemexplicação;senãoremovido,continuaaproliferarpelosistemae outrosdesenvolvedores

(apressados,intimidados)vãotrabalhandoaoredordosfluxosdelava,

gerandoum sistemaimpossível deseentenderou documentar

Solução: no desenvolvimento,terumaarquiteturasólida(interfaces

estáveis,bemdefinidase documentadas)antesdegerarcódigo;na

manutenção,trabalhodedetetive(descobertadesistema)

Slide30

Antipadrão: Decomposiçãofuncional

A rotinaprincipal estáaqui,naclasseListener.

Forma geral: Desenvolvimentobaseadonadecomposiçãofuncional,

fazendoclassesa partir de“subrotinas”

Sintomaseconseqüências:classescomnomesde‘funções’,contendoum

únicométodo,enenhumusodeprincípiosbásicosdaorientaçãoa

objetos;nenhumaesperançadereusarsoftware

Solução: definir modelosdeanáliseedeprojetoparatentarcompreendere

explicaro sistema;paraclasses“fora” do modelodeprojeto,tentar

combinarcomclassesexistentesou transformá-lasemfunçõesdeuso

geral

ilmr 31

Page 16: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide31

Antipadrão: Poltergeists

Eunãoseibemo queessaclassefaz,mascertamenteé importante.

Forma geral: Classescomciclo devida breve,queaparecembrevementee

depoisdesaparecem

Sintomaseconseqüências:Objetose classestemporários,com

associaçõestransientes,levandoa modelosdeobjetos

desnecessariamentecomplexos

Soluções:açõesassociadasa poltergeistsdevemsermovidasparaas

classesqueelasreferenciavam,removendoas“classesfantasmas”do

modelo

Slide32

Antipadrão: Martelo Dourado

Quandoa únicaferramentadisponívelé ummartelo,todoo restovira prego.

Forma geral: Todasassoluçõesdeumaequipeusamum produtono quala

equipetornou-seproficiente

Sintomaseconseqüências:Mesmasferramentase produtosusadasemprodutosconceitualmentediversos,comaarquiteturado sistemasendo

melhordescritapeloproduto,ambienteou ferramenta;resultadoem

geralpodemter baixodesempenhoeescalabilidade,sendodependentes

do vendedorou datecnologia

Solução: Suportarfilosofiadebuscarnovastecnologias;projetare

desenvolversistemascomlimites clarosparaa substituiçãode

componentesindividuais.

ilmr 33

Page 17: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide33

Antipadrão: Código espaguete

Vocêsabiaqueessalinguagemsuportamaisdeumafunção?

Forma geral: Programasou sistemascompoucaestruturadesoftware

Sintomaseconseqüências:Métodosmuitoorientadosaprocessos,como

fluxo deexecuçãoditadopelaimplementaçãodeobjetos;muitos

métodossemparâmetros,usandovariáveisdeclasse(“globais”), sendo

dedifícil reuso

Solução: prevenção(usoapropriadodeorientaçãoaobjetos);manutenção

paralimpezadecódigo(estratégiasderefabricaçãodeprogramas),

principalmentequandofor acrescentaralgumanovafuncionalidadeao

códigoespaguete

Slide34

Antipadrão: ProgramaçãoCut-and-Paste

Isto queéeficiência:100000linhasdecódigoemduassemanas!

Forma geral: Presençadeváriossegmentossimilaresdecódigo

espalhadospelosistema

Sintomaseconseqüências:Osmesmosbugsreaparecendo,apesarde

váriascorreçõeslocais;maiortempoderevisãoe inspeçãodecódigo;

maiorcustonamanutençãodo software

Solução: Enfatizarestratégiadereusocaixa-pretano desenvolvimentoou

re-estruturaçãodocódigo

ilmr 35

Page 18: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide35

Antipadrões de arquitetura desoftware

Sistemasencanamento: integraçãoponto-a-ponto

Travamentoao vendedor: nãoseesqueçaderenovara licença� Ingressodo lobo: suportamospadrãoX (masinterfacessãoproprietárias)

Ar quitetura por implicação: já fizemossistemasassimantes

Projeto por comitê: camelo(s.m.): cavaloprojetadopor um comitê� Canivetesuíço:tudoquepensamosfoi incluídonoprojeto

Reinventar a roda: nossoproblemaédiferentedosoutros

Slide36

Antipadrões degerênciadeprojetosde software

Paralisia da análise: é melhorrepensaressesmodelosdeanálisepara

torná-losmaisorientadosa objetos

Morte por planejamento: nãopodemoscomeçarenquantonãohouverum

planocompletodeprogramação

Espigasde milho: sujeitinhodifícil detrabalhar.. .

Gerenciamentoirracional: asprioridadesdo projetosãoasminhas!

Falta degerenciamento: o queaconteceudeerrado?Estava tudoindo tão

bem

ilmr 37

Page 19: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide37

Padrõesde projeto

Ondeestãooscaminhospara asboassoluções?

Slide38

O queéum padrão de projeto?

� Soluçõesparaproblemasespecíficosemprojetodesoftware orientado

a objetos

– Desenvolvidasatravésdarevisãoe evoluçãoaolongodeváriosprojetos

� Descriçãogeraldeum padrãocompostapor

Nome: criaçãodeumvocabulário

Problema: quandoaplicaro padrão

Solução: descriçãoabstratadeelementosquecompõemo projeto

Conseqüências:resultadose compromissosassociadosà aplicaçãodo padrão

ilmr 39

Page 20: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide39

Por que reusarprojetosao invésde código?

� Podeseraplicadoemmaiscontextos

– maiscompartilhável

� Ocorremaiscedono processodedesenvolvimento

– maiorimpacto

Projeto

Código

Slide40

Problemasde projeto abordadospor padrões

Identificação de objetos: auxiliama identificarabstraçõesrecorrentesde

formagenérica

Granularidade de objetos: indicamcomorepresentarsubsistemascomo

objetosousuportarváriosobjetospequenos

Especificaçãode interfaces: indicamosconceitoschavesquedevem(ou

nãodevem)estarnainterfacedeum objeto,assimcomo

relacionamentosentreinterfaces

Especificaçãode implementação: indicamqueclassesdevemser

abstratas(puras)ou concretas,emboraa implementaçãodevasempre

favorecerreferênciasa interfaces

ilmr 41

Page 21: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide41

Padrões,orientaçãoa objetose reuso

� Objetos,interfaces,classese herançanãogarantemreuso

� Abordagensdereusonaorientaçãoa objetos:

Herançade classes:reusocaixa-branca,definiçãoestática(tempode

compilação),simples,masexpõesuperclasse

Composiçãode objetos: reusocaixa-preta,definiçãodinâmica(obter

referênciaduranteexecução),maiscomplexo decompreender(uso

dedelegação,principalmente)

� Padrõesdeprojetofavorecemequilíbriodessesmecanismos

� Outraabordagemdereuso,nãoligadaàOO: templates(C++)

Slide42

Derivaçãovs delegação

Rectangle

area( )

widthheight

Window

return width* height

Window

area( )

Rectangle

area( )

widthheight

rectangle

return rectangle−>area()

ilmr 43

Page 22: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide43

Agregaçãovsassociação

� Agregação:objetoé compostopor outrosobjetosouum objetoé parte

deoutroobjeto

– mesmotempodevida

� Associação:objetoreferenciaoutroobjeto

– acoplamentomenor

� Naprogramação,construçõessimilares

– Referênciasouponteirosparaobjetosdaoutraclasse

Slide44

Potenciaisproblemasno projeto de sistemasmodificáveis: Criar objetosespecificandoexplicitamente

suaclasse

� Assumecompromissocomumaimplementaçãoemparticular, podendo

comprometerfuturasmodificações

� Padrõesdeprojetoassociados:MétodoFábrica,FábricaAbstrata,

Protótipo

ilmr 45

Page 23: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide45

Padrão: Método Fábrica

Objetivo: Definir umainterfaceparacriarum objeto,masdeixarqueas

subclassesdecidamqualclasseinstanciar

Moti vação: o sistemasabequeseráprecisocriar um objeto,masnaquele

pontodo códigonãosabequetipo deobjetoserácriado

Conseqüências:isolaclassesespecíficasdaaplicaçãodo códigodo

sistema;ofereceum pontodeextensão(hook) parasubclasses

Aspectosde implementação: métodofábricapodeter implementação

padrãoouserabstratoemCriador;podeter parâmetrosparaindicar

tipo deobjetoa criar; emC++, templatespodemserutilizados;um

padrãodenomeaçãodeveserutilizado

Slide46

Estrutura:

Produto

ProdutoConcreto

Criador

metodoFabrica()umaOperacao()

CriadorConcreto

metodoFabrica() return new ProdutoConcreto

produto = metodoFabrica()

ilmr 47

Page 24: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide47

Padrão: Fábrica Abstrata

Objetivo: Oferecerumainterfaceparacriar famíliasdeobjetosrelacionadosou dependentessemespecificarsuasclassesconcretas

Moti vação: trabalharcomumainterfaceno códigoquesejacomumpara

distintasalternativasdeimplementaçãodaqueleconjuntodefuncionalidades

Conseqüências:isolaclassesconcretasdosistema;permitefacilmentetrocarfamíliasdeprodutos;promoveconsistênciaentreprodutos;nãoésimplesestendera fábricaparacriar novostiposdeprodutos

Aspectosde implementação: tipicamente,apenasum objetodo tipofábricaparaumafamíliadeprodutosexisteno sistema;a criaçãodoprodutodá-setipicamenteatravésdeum métodofábrica

Slide48

Estrutura:

Cliente

ProdutoAAbstrato

ProdutoA1

Fábr icaAbstrata

cr iaProdutoA()cr iaProdutoB()

Fábr icaConcreta2

criaProdutoA()criaProdutoB()

ProdutoA2Fábr icaConcreta1

criaProdutoA()criaProdutoB()ProdutoBAbstrato

ProdutoB1 ProdutoB2

ilmr 49

Page 25: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide49

Padrão: Protótipo

Objetivo: Especificaro tipo deobjetoquedevesercriadousandoumainstânciadeprotótipoe criar novosobjetoscopiandoesteprotótipo

Aplicabilidade: sistemadeveserindependentedecomoobjetosdevemser

criados,compostosou representados,e� classesa sereminstanciadassãoconhecidasapenasno momentoda

execução,ou� paraevitar construirumahierarquiadefábricasparalelaà hierarquiade

classesdeprodutos

Conseqüências:permiteacrescentare removerprodutosemtempode

execução;reduznúmerodesubclasses;classesdevemimplementarummétodoclone(nemsempresimples)

Slide50

Estrutura:

Cliente

operacao()

Prototipo

clone()

PrototipoConcreto1

clone()

prototype

p = prototype −> clone() PrototipoConcreto2

clone()

ilmr 51

Page 26: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide51

Potenciaisproblemasno projeto de sistemasmodificáveis: Estar dependentede operaçõesespecíficas

� Assumecompromissocomumaformadeatendera umarequisição;

seriamelhornãoteressadefiniçãoamarradaaocódigo

� Padrõesdeprojetoassociados:Cadeiaderesponsabilidade,Comando

Slide52

Padrão: Cadeiade responsabilidade

Objetivo: Evitar o acoplamentodiretodeum solicitanteemrelaçãoao

atendentedeumarequisiçãodandoa oportunidadedetermaisdeum

objetorespondendoà solicitação.Osatendentessãoencadeadose a

requisiçãopassadaporelesatéqueum dosobjetosaatenda.

Conseqüências:reduzacoplamentoeobtémmaiorflexibilidadena

atribuiçãoderesponsabilidadesa objetos,porémnãohágarantiadeque

algumobjetoatenderáasolicitação.

Aspectosde implementação: comoimplementara cadeiadesucessores

(referênciasnovasouexistentes),comorepresentarassolicitações

(métodos,objetos)

ilmr 53

Page 27: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide53

Estrutura:

Cliente Handler

handleRequest( )

ConcreteHandler1

handleRequest( )

ConcreteHandler2

handleRequest( )

successor

Slide54

Padrão: Comando

Objetivo: encapsularumarequisiçãocomoum objeto,permitindo

parametrizarclientescomdiferentessolicitações,enfileirarou registrar

solicitaçõese suportaroperaçõesquepodemserdesfeitas.

Conseqüências:desacoplaobjetoqueinvocao serviçodaquelequesabe

comoexecutá-lo;solicitações,sendoobjetos,podemsermanipuladase

compostascomotais.

ilmr 55

Page 28: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide55

Estrutura:

ClientInvoker Command

Receiver ConcreteCommand

execute( )

execute( )

state

action( ) receiver −> action( );

receiver

Slide56

Potenciaisproblemasno projeto de sistemasmodificáveis: Dependerda plataforma de hardwaree

software

� UsardiretamenteAPIs e interfacesparasistemasexternosque

dependemdaplataformadeexecuçãotornaportabilidadee mesmo

atualizaçãonaprópriaplataformadifíceis

� Padrõesdeprojetoassociados:Fábricaabstrata,Ponte

ilmr 57

Page 29: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide57

Padrão: Ponte

Objetivo: desacoplarumaabstraçãodesuaimplementaçãodeformaque

osdoispossamvariarindependentemente.

Moti vação: umaformadeevitar o acoplamentodefinitivo entreabstraçãoe

implementaçãoquesedáatravésdeherança

Conseqüências:desacoplainterfacee implementação,melhora

extensibilidadee escondedetalhesdeimplementaçãodeclientes.

Slide58

Estrutura:

Abstraction

RefinedAbstraction

operation( )

usesOperation( )

Client

Implementor

ConcreteImplementorA

operationImp( )

operationImpl( )

impl

impl −> operationImpl( );

ilmr 59

Page 30: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide59

Potenciaisproblemasno projeto de sistemasmodificáveis: Dependerde representaçõesou

implementaçõesdeobjetos

� Clientesquesabemcomoumobjetoé representado,armazenado,

localizadoou implementadopodemter quesofrermodificaçõesquando

o objetomuda.

� Padrõesdeprojetoassociados:Fábricaabstrata,Memento,Proxy

Slide60

Padrão: Memento

Objetivo: Semviolar encapsulação,capturareexternalizaro estado

internodeum objetodeformaqueelepossaserrestauradoparaesse

estadoemum momentoposterior.

Moti vação: Um mementoéum objetoquearmazenao estadointernode

um outroobjeto(o originadordomemento).

Aplicabilidade: usarquandouminstantâneo(total ou parcial)deum

objetodevesersalvo paraposteriorrecuperaçãoeumainterfacedireta

paraobteresseestadoexporiadetalhesdeimplementação,quebrandoa

encapsulaçãodo objeto.

ilmr 61

Page 31: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide61

Estrutura:

Or iginator

setMemento(Memento m)createMemento()

state

M emento

getState()setState()

state

Caretaker

s t at e = m−>get St at e( ) ;m = new Mement o( ) ;m−>s et St at e( s t at e) ;r et ur n m;

memento

Slide62

Padrão: Proxy

Objetivo: Oferecerum surrogateparaoutroobjetoparacontrolaro acesso

a ele.

Aplicabilidade: Semprequefor necessárioter umareferênciaparaum

objetoquesejamaisversátilou sofisticadaqueum simplesponteiro—

proxy remoto(referênciasforado espaçodeendereçamentolocal),

proxyvirtual (atrasacriaçãodeobjetos“caros” atéquehajademanda

real),proxydeproteção(controlaacessoaoobjetooriginal) e

referências“espertas”comfuncionalidadesadicionais(contarnúmero

dereferênciasparaliberaçãoautomática,carregarobjetospersistentes

naprimeirareferência,locking).

ilmr 63

Page 32: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide63

Estrutura:

Client Subject

request( )

RealSubject

request( )

Proxy

request( )

real

...

. . .r eal −>r eques t ( ) ;. . .

Slide64

Potenciaisproblemasno projeto de sistemasmodificáveis: Dependerde algoritmos

� Algoritmospodemserestendidos,otimizadosou substituídosdurante

desenvolvimentoou reuso;seobjetodependerdeum algoritmo

especificamente,tambémdeveráseralteradonessescasos

� Padrõesdeprojetoassociados:Estratégia,MétodoGabarito,Iterador

ilmr 65

Page 33: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide65

Padrão: Estratégia

Objetivo: definir umafamíliadealgoritmos,encapsulá-lose torná-losintercambiáveis,permitindoqueo algoritmovarieindependentemente

deseusclientes

Aplicabilidade: usarquandoclassesrelacionadasdiferemapenasemseu

comportamento;quandodiferentesvariantesdeum algoritmosãonecessárias;quandosedesejaencapsularestruturasdedados

complexas,específicasdoalgoritmo;quandoa classedefinediversos

comportamentoscommúltiplasocorrênciasdeum padrãocondicional

Conseqüências:emfamíliasdealgoritmosrelacionados,herançapodefatorarfuncionalidadescomuns;umaalternativaparaderivaçãodireta;

clienteexpostoàsdiferentesestratégiasdisponíveis

Slide66

Estrutura:

Context

contextInterface( )

Strategy

algor ithmInterface( )

ConcreteStrategyA

algorithmInterface( )

ConcreteStrategyB

algorithmInterface( )

ilmr 67

Page 34: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide67

Padrão: Método Gabarito

Objetivo: definir o esqueletodeum algoritmoemumaoperação,

postergandoalgunspassosparasubclasses

Moti vação: permitea descriçãodo algoritmoemtermosdeoperaçõesabstratas,quedeverãoserredefinidasnassubclasses

Aplicabilidade: usarparaimplementaraspartesinvariantesdeumalgoritmoumaúnicavez;quandocomportamentocomumpodeser

fatoradoemumasuperclasse

Conseqüências:algumasoperaçõesusadaspelométodogabaritopodem

serhooks(podemserredefinidas)ouoperaçõesabstratas(temqueserredefinidas);levaaoPrincípiodeHolywood(superclasseinvocamétodosdeclassederivadaenãoaocontrário)

Slide68

Estrutura:

AbstractClass

templateMethod( )pr imitiveOperation1( )pr imitiveOperation2( )

ConcreteClass

primitiveOperation1( )primitiveOperation2( )

...primitiveOperation1( );...primitiveOperation2( );...

ilmr 69

Page 35: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide69

Padrão: Iterador

Objetivo: oferecerumaformadeacessaroselementosdeum objeto

agregadoseqüencialmentesemexporsuarepresentaçãointerna

Moti vação: suportarformas(eventualmente,alternativas)devarrer

agregadossemterdeincorporaressasfuncionalidadesà interfacedo

agregado;ter mecanismouniformedevarrerestruturasagregadas

distintas

Conseqüências:simplificaa interfacedo agregado;podetermaisdeuma

varredurasobreo mesmoagregadoemum dadomomento

Slide70

Estrutura:

Aggregate

createIterator( )

ConcreteAggregate

createIterator( )

I terator

first( )next( )current( )isDone( )

ConcreteI terator

Cliente

ilmr 71

Page 36: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide71

Potenciaisproblemasno projeto de sistemasmodificáveis: Acoplamentoforte

� Classesfortementeacopladassãodifíceisdereutilizarisoladamente,

levandoa sistemasmonolíticose dedifícil manutenção

� Padrõesdeprojetoassociados:FábricaAbstrata,Ponte,Cadeiade

Responsabilidade,Comando,Fachada,Mediador, Observador

Slide72

Padrão: Fachada

Objetivo: oferecerumainterfaceunificadaparaum conjuntodeinterfaces

emum subsistema

Moti vação: definirumainterfacedenível maisalto paratornaro

subsistemamaisfácil deutilizar

Aplicabilidade: usarquandoquiseroferecerumainterfacesimplespara

um subsistemacomplexo; quandohouvermuitasdependênciasentre

clientese asclassesdeimplementaçãodeumaabstração;quando

quiserestruturarossubsistemasemcamadas

ilmr 73

Page 37: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide73

Estrutura:

Facade

Slide74

Padrão: Mediador

Objetivo: definir umobjetoqueencapsulacomoconjuntosdeoutros

objetosinteragem

Moti vação: reduziro númerodeinterconexõesentreobjetosfazendocom

queelessecomuniquematravésdo mediador

Conseqüências:desacoplaobjetos“colegas”;simplificaprotocolosentre

objetos;porém,mediadorcentralizacontrole,tornando-se

eventualmenteumelementocomplexo e dedifícil reuso

ilmr 75

Page 38: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide75

Estrutura:

Mediator

ConcreteMediator

Colleague

ConcreteColleague1 ConcreteColleague2

mediator

Slide76

Padrão: Observador

Objetivo: definirumadependênciadeumobjetoparamuitosdeformaque,

quandoum objetomudadeestado,todososseusdependentessão

notificadose automaticamenteatualizados

Moti vação: manterconsistênciaentreobjetosdaaplicaçãosemrecorrera

um forteacoplamentoentreeles

Aplicabilidade: usarquandoumaabstraçãotemdoisaspectos,um

dependentedo outro;quandomudançaemum objetorequermudanças

emoutros;quandoum objetodevepodernotificaroutrossemassumir

nenhumconhecimentosobrequaissãoessesoutrosobjetos

ilmr 77

Page 39: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide77

Estrutura:

Subject

attach(Observer)detach(Observer)notify( )

ConcreteSubject

getState( )setState( )

subjectState

Observer

update( )

ConcreteObserver

update( )

observerState

observers

subject

f or al l o i n obs er v er s o−>updat e( )

obs er v er St at e = s ubj ec t −>get St at e( ) ;

r et ur n s ubj ec t St at e

Slide78

Outr ospadrõesdeprojeto emGoF

Adaptador: convertea interfacedeumaclasseemoutrainterfacedo tipoqueo clienteespera(padrãoestrutural);

Composto: representahierarquiasparte-todoepermitetrataracomposiçãoe osobjetosindividuaisdeformauniforme(padrãoestrutural);

Construtor: separaa construçãodeum objetocomplexo desuarepresentaçãodeformaqueo mesmoprocessodeconstruçãopossacriar representaçõesdiferentes(padrãodecriação);

Decorador: acrescentafuncionalidadesadicionaisa um objetodeformadinâmica(padrãoestrutural);

Estado: permitequeum objetomodifiqueseucomportamentoquandoseuestadointernomuda(padrãodecomportamento);

ilmr 79

Page 40: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide79

Inter pretador: definea representaçãoparaumagramáticaeum

interpretadorparasentençasnessalinguagem(padrãode

comportamento);

Peso-pena:usacompartilhamentoparalidar comgrandenúmerode

pequenosobjetosdeformaeficiente(padrãoestrutural);

Visitante: representaumaoperaçãoaserexecutadanoselementosda

estruturadeum objeto;

Singleton: garantequeumaclassetemapenasumainstânciae ofereceum

pontodeacessoparaessainstância(padrãodecriação);

Slide80

Padrõese frameworks

Padrõesde projeto: descriçõesdesoluçõesdeprojetorecorrentesque

foramaprovadaspelousoaolongodo tempo;

Frameworks: projetoreutilizável do todoou departedeumsistemaqueé

representadapor umconjuntodeclassesabstratase pelaformaque

suasinstânciasinteragem� menosabstratosquepadrões� tipicamentecontêmváriospadrões

ilmr 81

Page 41: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide81

Frameworkse reuso

� Reusodeprojeto

– um framework defineumesqueletodeaplicaçãoquepodeseradaptadopor

umdesenvolvedordeaplicação

– é umtipo dearquiteturavoltadaparaumdomínio

� Reusodecódigo

– frameworkssãoexpressosemlinguagensdeprogramação— sãoprogramas

– facilita usodecomponentesqueseconformemàsinterfacesdo framework

– tornam-sedependentesdaslinguagens

Slide82

Característicasde frameworks

Modularidade: detalhesdeimplementaçãosãoencapsuladospor trásde

interfacesestáveis

Reusabilidade: definemcomponentesgenéricosassociadosàsinterfaces

estáveisquepodemserreutilizadosparacriar novasaplicações

Extensabilidade: definempontosdeadaptaçãoe extensãonasinterfaces

estáveis(pontosvariáveis,métodoshook)

Inversãode controle: framework defineseqüênciadeinvocaçãoda

aplicação� PrincípiodeHollywood

ilmr 83

Page 42: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide83

Formasde adaptaçãoem frameworks

Formasbásicasdeassociarosmétodosdaaplicaçãoaosmétodosdoframework:

Adaptaçãocaixa-branca: reusoporherança— aplicaçãodevedefinirclassesqueestendemasclassesabstratasdo framework eredefinirmétodos

Adaptaçãocaixa-preta: reusopor composição— aplicaçãoescolhesubclasseconcreta(dentreasdisponíveis)eutiliza suasfuncionalidadesvia suainterface

Adaptaçãocaixa-cinza: oferecealternativasdeimplementação(comocaixa-preta)maspermiteimplementaçõesespecíficas(comocaixa-branca)

Slide84

Pontosdeadaptaçãono framework

Ponto variável X

Framework

Xk

Ponto variável X

Framework

XkX1

Xn

ilmr 85

Page 43: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide85

Tipos de frameworks

Frameworkscaixa-branca: todosospontosvariáveissãocaixa-branca;

Frameworkscaixa-preta: todososseuspontosvariáveissãocaixa-preta;

Frameworkscaixa-cinza: apresentapontos-variáveiscaixa-cinza.

Slide86

Aspectosdedesenvolvimento eutilização dosdiferentestipos de frameworks

� Frameworkscaixa-brancasãomaissimplesdeseprojetaredesenvolver

– nãoprecisaoferecerimplementaçõesdospontosvariáveis

� Frameworkscaixa-pretasãodeutilizaçãomaissimples

� Frameworkscaixa-cinzatendema caixa-preta

– Implementaçõesrealizadaspassamafazerpartedoconjuntode

implementaçõesdisponíveis

ilmr 87

Page 44: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide87

Desenvolvimento desoftware centradoem frameworks

� Trêsfasesprincipais:

1. Desenvolvimentodo framework

2. Usodo framework

3. Manutençãodo framework

Slide88

Tarefaspara o desenvolvimento de frameworks

1. identificardomínioespecíficodeaplicaçãodo framework

2. determinarosprincipaiscasosdeusosuportadose atoresinteragindocomo framework

3. determinarpadrões/soluçõesparaauxiliardesenvolvimentodoframework

4. projetarinterfacesecomponentesdo framework; mapearatoresepapéisparaasinterfaces

5. desenvolver implementaçãopadrãoparainterfacesdo framework

6. descrevere documentarospontosdeextensãodo framework

7. criar planose casosdeteste

ilmr 89

Page 45: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide89

Desenvolvimento de framework baseadoempontosvariáveis

� Análisedo domínioidentificapontosvariáveis

– quaisaspectosdo framework diferementreaplicações?

– qualo graudeflexibilidadedesejado?

– o comportamentoflexível precisaseralteradoduranteo

funcionamentodaaplicação?

Slide90

Ciclo de desenvolvimento baseadoempontosvariáveis

identificarobjetos eclasses

identificarpontos

variáveis

(Re)projetodo

framework

Adaptaçãodo

framework

pontosvariáveis

satisfazem?

S

N

MetapadrõesEspecialistado domínio

Desenvolvedor

ilmr 91

Page 46: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide91

Metapadrões

� Estabelecempadrõesderelaçãoentreclassesgenéricas(template

classes)eclassescomponentes(hookclasses)

– Classesgenéricaspossuemosmétodosgabaritos,quedefinem

comportamentoabstrato,fluxo decontrolegenérico,relaçãoentre

objetos

– Classescomponentespossuemosmétodoscomponentes,quefazem

partedasimplementaçõesdosmétodosgabaritose podemser

abstratos,regularesounovosgabaritos.

Slide92

Metapadrõesde unificação

TH TH TH

*thRef thList

Unificação Unificaçãorecursiva 1:1

Unificaçãorecursiva 1:n

ilmr 93

Page 47: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide93

Metapadrõesde conexão

T

H

hRef

T

H

hList

*T

hRef

H

ThList

H*

Conexão 1:1 Conexão 1:n Conexão recursiva 1:1

Conexão recursiva 1:n

Slide94

Desenvolvimento de framework baseadoemgeneralizaçãosistemática

� Criaçãodeum modelodeaplicaçãono domínio

� Análisedealto nível dospontosvariáveis

� Paracadapontovariável detectado

– análisee especificaçãodetalhada

– projetodealtonível

– transformaçãodomodelodeclassesporgeneralizaçãocomo subsistemade

pontovariável

ilmr 95

Page 48: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide95

Subsistemasdeponto variável (hot spots)

� Outraformadeestabelecerospadrõesbásicosderelaçãoentreas

classesgenéricase suasconcretizações

� Variabilidadeé obtidapor meiodeumareferênciapolimórfica,que

estabelecea ligaçãodinâmicaentreo métodogenéricoe asoperações

concretas

� Quandoa ligaçãofazreferênciaa serviçosdentrodo própriosistema,o

subsistemadepontovariável é recursivo

Slide96

Subsistemadeponto variável não-recursivo

cliente Base

Concreta1 Concreta2

ilmr 97

Page 49: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide97

Subsistemadeponto variável recursivo 1:1

cliente Base

Concreta1 Concreta2

1

Slide98

Subsistemade ponto variável recursivo 1:n

cliente Base

Concreta1 Concreta2

*

ilmr 99

Page 50: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide99

Relaçãoentre padrões,metapadrõesesubsistemasdeponto variável

Subsistema de pontovariável

Metapadrão Padrão deprojeto

nãorecusivo unificação, conexão 1:1,

conexão1:n

fábrica abstrata,métodofábrica,

protótipo,ponte,comando,itera-

dor, observador, estratégia,mé-

todogabarito,construtor, adapta-

dor, mediador, estado,visitante

recursivo 1:1 conexão recursiva 1:1,

unificaçãorecursiva 1:1

cadeiaderesponsabilidade,deco-

rador

recursivo 1:n conexão recursiva 1:n,

unificaçãorecursiva 1:n

composto,interpretador

Slide100

Usodo framework

� Quandoocorreo desenvolvimentodeaplicações

– Instanciaçãodo framework

� Sucessodependenteemgrandepartedaboadocumentaçãosobreo

framework

– Identificaçãodospontosdeadaptação

– Padrõesutilizados

– Exemplos

� Aprendera usarum framework requerinvestimentodetempoe

dinheiro

ilmr 101

Page 51: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide101

Manutençãode frameworks

� Desenvolvimentodeaplicaçõesaumentareusabilidadedo framework

– maiordisponibilidadedeclassesconcretas(reusocaixa-preta)

– identificaçãodedeficiênciasparafuturasextensões

� Revisõesem frameworkstendema serproblemáticas

– compatibilidadedeaplicaçõesjá desenvolvidascomo mesmoframework;

devemevoluir juntas

� Emalgunscasos,revisãodo domínio

– estabelecimentodenovasfronteiras

Slide102

Classificaçãode frameworkspeloescopodeuso

Infra-estrutura: framework simplificao desenvolvimentoda

infra-estruturadesistemasdeformaportátil eeficiente;tipicamentede

usono desenvolvimentointernoàsempresas

Integração middleware: framework permitea integraçãodecomponentes

e aplicaçõesdistribuídas;parteimportantedossistemasmodernos

Aplicaçãoempresarial: framework voltadoparaumaáreadeaplicação;

focodedesenvolvimentonasempresasdesenvolvendoaplicaçõespara

usuáriosfinais

ilmr 103

Page 52: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide103

Potenciaisproblemasna integraçãode frameworks

Focono desenvolvimentodosframeworksestánaextensãodas

funcionalidades,nãonaintegraçãocomoutrosframeworks

� Alguns frameworkspodemassumirquetêmcontrolecompletosobreo

fluxo deexecuçãodaaplicação

– Quandomaisdeum framework emuso.. .?

� Comointegrarsistemaslegadosa frameworks?

� O queacontecesedoisframeworkstêmcomponentescom

sobreposiçãodefuncionalidades?

Slide104

Causasdosproblemasde integraçãode frameworks

Coesãodo framework: quãoamarradaestáa conexãodeumaclassedo

framework àsdemais?

Cobertura do domínio: quãobemespecificadoe isoladoestáo domínio

deaplicaçãodo framework?

Objetivosdo projeto: osdesenvolvedoresdo framework devemexplicitar

seintegraçãofoi umapreocupaçãono projeto

Falta deacessoaocódigofonte: integraçãopoderequerermodificaçõese

adaptaçõesno código;é importanteterumaabordagemopensource

Falta depadrões: aindanãohápadrõesvoltadosparao desenvolvimento

deframeworks

ilmr 105

Page 53: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide105

Estratégiaspara integraçãode frameworks

� Usarthreadsdeexecuçãoindependentesparacadaframework

� UsarpadrãoAdaptadorparaestabelecerintegraçãocomcódigolegado

� Alterar códigodo framework

� No desenvolvimento:

– Tornarexplícitase bemdocumentadasasdecisõesrelativasà arquiteturado

framework

– Construiro framework em“blocosindependentes”

– Estabelecerno framework previsõesparaconfiguração,mediaçãoe

adaptação,atravésdousodepadrões

Slide106

Aplicando astécnicasde reusona programaçãoC++

Herança,composição,templates

ilmr 107

Page 54: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide107

O conceitoda herança

� PrincípiodasubstituiçãodeLiskov

– SeaclasseD é derivadadaclasseB, quandoum objetoB for necessárioé

possível usarumobjetoD

– D is-a B (masnãovice-versa)

� Definiçãode(boas)hierarquiasdeclasseséum dosconceitoschaves

por trásdaorientaçãoaobjetos

Slide108

Aspectosda implementaçãoda herançaemC++

� Mecanismosdederivação

– ImplementandohierarquiasIS-A

– Lidandocomexceçõesnashierarquias

� Herançadeinterfacesvs herançadeimplementações

– separaçãodeinterfacee implementação

– redefiniçõesdemétodos

ilmr 109

Page 55: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide109

C++ e hierarquias IS-A

� Atravésdaderivaçãopublic

class Pessoa { ... };

class Estudante : public Pessoa { ... };

� Todoestudanteéumapessoa

� Nemtodapessoaé umestudante

Slide110

void dance(const Pessoa& p);

void estude(const Estudante& e);

Pessoa p;

Estudante e;

dance(p);

dance(e);

estude(p); // oops

estude(e);

ilmr 111

Page 56: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide111

Herançapública vs. herançapri vada

� Derivaçãousandoprivate nãodefineumahierarquiado tipo IS-A

� comotodososmembrosdasuperclasse,públicosou protegidos,

tornam-seprivativosnanovaclasse,a interfacedasuperclassenãoé

herdada

� nãoháconversãoautomáticadeumobjetodo tipo derivadoparaum

objetodo tipo daclassebase

� falhao princípiodasubstituição

Slide112

class Pessoa { ... };

class Estudante : private Pessoa { ... };

void dance(const Pessoa& p);

void estude(const Estudante& e);

Pessoa p;

Estudante e;

dance(p);

dance(e); // oops

estude(p); // oops

estude(e);

ilmr 113

Page 57: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide113

Lidando compingüins voadores

� “Pássarospodemvoar, pingüinssãopássaros.. . ”

class Passaro {

public:

virtual void voe();

...

};

class Pinguim : public Passaro { ... };

� “. . .maspingüinsnãovoam!”

Slide114

Tratando o problemadurante a execução

void erro(const string& mens);

class Pinguim : public Passaro {

public:

virtual void voe() { erro(‘‘Pingüim não voa’’); }

...

};

� “Pingüinspodemtentarvoar, masfazê-loéum erro.”

� Abordagemtipicamenteadotadaemlinguagensinterpretadas,masnão

emC++

ilmr 115

Page 58: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide115

Revendoa hierarquia de classes

� Senãohouverum métodovoe definidoparapingüins,compilaçãojá

detectaráo erro

class Passaro { ... };

class PassaroVoador: public Passaro (

public: virtual void voe(); ...

};

class PassaroNaoVoador: public Passaro { ... };

class Pinguim: public PassaroNaoVoador { ... };

Slide116

Potenciaisproblemasna definiçãodehierarquias declassespor herança

� Usodeintuiçãoou “bom senso”podelevarahierarquiasfalhas

– Exemplocompingüinspodepareceróbvio, masé emblemáticode

situaçõesreaisdemodelagem

� Abusodeherança

– Nemsemprearelaçãoadequadaentreduasclassesé a deherança

– Herançadeve sempre serumaexpressãodarelaçãoIS-A

ilmr 117

Page 59: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide117

Interfacese implementações

Separaçãoentrea especificaçãodeumainterfacee suaimplementaçãoé

essencialnaboaprogramaçãoorientadaaobjetos

� Interfacestendema estabilizarrapidamente,implementaçõesnão

� Programarcombaseno conhecimentoapenasdainterfacefavorece

programaçãogenéricae reduzadependênciadecompilaçãoentre

módulosdosistema

Slide118

C++ favorecea mistura de interface e implementação

class Pessoa {

public:

Pessoa(string& nome, Data& aniv, Endereco& end, Pais& p);

virtual ~Pessoa();

string nome() const;

string dataNascimento() const;

string endereco() const;

string nacionalidade() const;

private:

string name_;

Data birthday_;

Endereco address_;

Pais nation_;

};

ilmr 119

Page 60: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide119

Destrutor virtual

� Porquê?

class Base { public: ~Base(); ... };

class Derivada: public Base { public: ~Derivada(); ... };

Base *p = new Derivada;

delete p; // comportamento indefinido

� Sedestrutornaclassebasefor declaradocomovirtual, ambosserão

invocados

– Deve estarpresenteemqualquerclassequesirva debaseparaoutras

– Mesmoquevirtual puro,deve ter implementação

Slide120

Dependênciaemrelaçãoa outras definições

� ClassePessoa usaoutrasclassesnadefiniçãodeseusatributos

– Tipicamente,no início domódulo:

#include <string>

#include "data.h"

#include "endereco.h"

#include "pais.h"

– Cria dependênciadestemódulo(e dosqueutilizema classePessoa ) em

relaçãoàqueles

ilmr 121

Page 61: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide121

Reduzindoa dependênciaentre classes

� Usardeclaraçõesaoinvésdedefinições

– Códigocomo

class Data;

Data hoje();

void ajustaData(Data d);

nãoprecisaconhecera definiçãodaclasseData paracompilar

� Damesmaforma,paradefinirponteirosoureferênciasbastaconhecera

declaração,nãoa definiçãodeum tipo

Slide122

Separandoosdetalhesde implementaçãoda interface

#include <string>

class Data; class Endereco; class Pais;

class PessoaImpl;

class Pessoa {

public:

Pessoa(string& nome, Data& aniv, Endereco& end, Pais& p);

virtual ~Pessoa();

string nome() const;

string dataNascimento() const;

string endereco() const;

string nacionalidade() const;

private:

PessoaImpl *parte_impl;

};

ilmr 123

Page 62: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide123

Repassandoo trabalho para a implementação

#include "Pessoa.h"

#include "PessoaImpl.h"

Pessoa::Pessoa(string& n, Data& d, Endereco& e, Pais& p) {

parte_impl = new PessoaImpl(n, d, e, p);

}

string Pessoa::nome() const {

return parte_impl -> getNome();

}

...

� Qualpadrãodeprojetoestápresentenestaabordagem?

Slide124

Definindo interfacespuras (Protocolos)

� Protocolossãoclassesabstratassemnenhumaimplementação

– semconstrutores

– sematributos

– todososmétodosabstratos(virtuaispuros)

� Classesqueusamosprotocolosoperamcomponteirosou referências

paraessasclasses

– nãoé possível instanciardiretamenteobjetosdeprotocolos

– objetosdeclassesderivadaspodemsercriados

ilmr 125

Page 63: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide125

Exemplode protocoloC++

class Pessoa {

public:

virtual ~Pessoa();

virtual string nome() const = 0;

virtual string dataNascimento() const = 0;

virtual string endereco() const = 0;

virtual string nacionalidade() const = 0;

};

Slide126

Construçãode objetosassociadosa protocolos

� Objetosserãodeclassesderivadasdo protocolo

class PessoaMesmo: public Pessoa {

public:

PessoaMesmo(string& n, Data& d, Endereco& e, Pais& p)

: name_(n), birthday_(d), address_(e), nation_(p) {}

string nome() const;

...

private:

string name_;

...

};

ilmr 127

Page 64: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide127

Construçãode objetosvia protocolos

� Emgeral,dá-seatravésdemétodoestáticoassociadoaopróprioprotocolo

class Pessoa {

public:

...

static Pessoa * fazPessoa(string& n, Data& d,

Endereco& e, Pais& p);

};

Pessoa * Pessoa::fazPessoa(string& n, Data& d,

Endereco& e, Pais& p) {

return new PessoaMesmo(n, d, e, p);

}

� Algum padrãoreconhecidoaqui?

Slide128

Herançade interface eherançade implementaçãodemétodos

� O quedeum métodosepretendepassardeumaclassebaseparauma

classederivada?

– Apenassuainterface(declaração);

– A interfacee a implementação,porémpermitindoqueclassederivada

definanova implementação(especializações);

– A interfacee a implementação,sempermitir quea classederivadadefina

nova implementação(aspectoinvariante).

ilmr 129

Page 65: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide129

Três tipos de métodos

� Paraa classeabstrataShape ,

class Shape {

public:

virtual void draw() = 0;

virtual void error(string & msg);

int objectID();

...

};

ostrêsmétodosestarãopresentesemsuasclassesderivadas

publicamente.

Slide130

Apenasherançade interface

� Obtidapelousodafunçãovirtual pura

– No exemplo,draw

– Nãoprecisa(masatépoderia)ter umaimplementação� SeRectangle eEllipse sãoderivadasdeShape ,

Shape *ps1 = new Rectangle; ps1->draw();

Shape *ps2 = new Ellipse; ps2->draw();

ps1->Shape::draw();

ilmr 131

Page 66: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide131

Herançade interface com implementaçãopadrão

� Obtidacommétodosvirtuais“normais”

� Classederivadapodeoptarentreusara implementaçãopadrão

oferecidapelasuperclasseou definir aprópriaimplementação,

especializada

� Potencialproblemademanutenção

– Seahierarquiacrescer(novasclassesderivadas)e o padrãonãomaisfor

aplicável

Slide132

“Não hádiferençaentrepilotarum Avião ModeloAou umAvião ModeloB;outrospoderiamserdiferentes:”

class Aviao {

public:

virtual void voePara(string& destino);

...

};

class ModeloA : public Aviao { ... };

class ModeloB : public Aviao ( ... };

ilmr 133

Page 67: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide133

“Já pilotar o novo AviãoModeloCédiferente.. . ”

class ModeloC : public Aviao { ... //oops};

Aviao eqp = new ModeloC;

eqp->voePara("JFK"); // desastre

� Problemanãoé ter umaimplementaçãopadrão,maspermitir quea

classederivadaa utilize semdizerexplicitamentequeirá fazê-lo

Slide134

Separandoa interface da implementaçãopadrão

� Usarmétodoprivativo, não-virtual:

class Aviao {

public:

virtual void voePara(string& dest) = 0;

...

private:

void vaiPorMim(string& dest);

};

void ModeloA::voePara(string& dest) {

vaiPorMim(dest);

}

ilmr 135

Page 68: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide135

Separandoa interface da implementaçãopadrão (2)

� Alternativamente,podeusardefiniçãoparafunçãovirtual pura:

class Aviao {

public:

virtual void voePara(string& dest) = 0;

...

};

void Aviao::voePara(string& dest) {

// procedimento padrão

}

void ModeloA::voePara(string& dest) {

Aviao::voePara(dest);

}

� Perdea“proteção”paraimplementaçãopadrão

Slide136

Métodosinvariantesna especialização

� Comportamentonãopodeseralteradoemclassesderivadas

� Situaçãoobtidacomusodasfunçõesnão-virtuais

– Defineinterfacee implementaçãomandatória

� Métodonão-virtualnuncadeveserredefinidoemclassesderivadas

ilmr 137

Page 69: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide137

Nuncaredefinir métodosnão-virtuais

class B { public: void mf(); ... };

class D: public B { ... };

D x;

B *pB = &x; pB->mf();

D *pD = &x; pD->mf();

� SeD redefinemf , asduasinvocaçõesdemf terãocomportamento

diferente

Slide138

Porquenão redefinir métodosnão-virtuais

� Métodosnãovirtuaissãoligadosemtempodecompilação

� Mesmoqueatravésdeponteiros,a implementaçãoutilizadaseráa do

tipo do ponteiroe nãoa do tipo doobjetonaexecução

� O mesmoocorreparavalorespadrãodefunçõesvirtuais

– valorespadrãosãoligadosestaticamente

– podeinvocarcorpodefinidonaclassederivadacomvalorespadrões

definidosnasuperclasse

– conclusão:nãodevemserredefinidos

ilmr 139

Page 70: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide139

Trabalhando comcomposição

� Paramodelarexpressõesdo tipo tem um (objetodeoutraclasse)ou éimplementadousando(outrotipo deobjeto)

class Pessoa {

...

private:

string nome; // Pessoa tem um nome

Endereco end; // e tem um endereco

...

};

Slide140

Composiçãoe “é implementadousando”

� Exemplo:implementarumacoleçãodo tipo conjuntousandouma

estruturadedadosdo tipo lista

� um conjuntonãoéumalista

– conjuntosnãopodemter elementosduplicados,listaspodem

– herançapúblicanãoé umaboaopção

� podedefinir atributousandolist daSTL

ilmr 141

Page 71: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide141

DefiniçãodaclasseSet :

template<class T>

class Set {

public:

bool member(const T& item) const;

void insert(const T& item);

void remove(const T& item);

int cardinality( ) const;

private:

list<T> rep;

};

Slide142

ExemplodemétodosdeSet :

template<class T>

bool Set<T>::member(const T& item) const {

return find(rep.begin(), rep.end(), item) != rep.end();

}

template<class T>

void Set<T>::insert(const T& item) {

if(!member(item)) rep.push_back(item);

}

template<class T>

void Set<T>::remove(const T& item) {

list<T>::iterator it = find(rep.begin(), rep.end(), item);

if (it != rep.end()) rep.erase(it);

}

template<class T>

int Set<T>::cardinality( ) const {

return rep.size();

}

ilmr 143

Page 72: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide143

Herança ou templates

� Nadefiniçãodeum conjuntodeclassescompequenasdiferençasentre

si, qualmecanismousar?

herança: fatorarpartecomumemsuperclasse(abstrata),derivaras

classesconcretaseemcadaumadefinir aespecializaçãodaclasse

template: definiro códigoparaaclassegenéricaemtermosdeum tipo

parametrizadoe instanciar, paracadatipo desejado,umaversãoda

definiçãodaclasseespecializada

� Usarherançaquandoo tipo doobjetomudao comportamentodos

métodos,usartemplatequandocomportamentoé invariantecomo tipo

parametrizado

Slide144

template<class T> class Stack {

public:

Stack();

~Stack();

void push(const T& obj);

T pop();

bool empty() const;

private:

struct StackNode {

T data;

StackNode *next;

StackNode(const T& newData, StackNode *nextNode)

: data(newData), next(nextNode) { }

};

StackNode *top;

Stack(const Stack& rhs);

Stack& operator=(const Stack& rhs);

};

ilmr 145

Page 73: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide145

[--- template<class T> ---]

Stack<T>::Stack() : top(0) {}

void Stack::push(const T& obj) {

top = new StackNode(obj, top); }

T Stack<T>::pop() {

StackNode *topOfStack = top;

top = top->next;

T data = topOfStack->data;

delete topOfStack;

return data; }

Stack<T>::~Stack() {

while(top) {

StackNode *toDie = top;

top = top->next;

delete toDie;

} }

bool Stack<T>::empty() const {

return top == 0; }

Slide146

Templatesvsponteirosgenéricos

� Ponteirosgenéricos(void* ) oferecemoutraalternativaquepermite

tero mesmocomportamentoparadiferentestiposdeobjetos

– semareplicaçãodecódigoquetemplatesgeram

� Dois passos

1. criar a classequemanipulaosponteirosgenéricos

2. criar classesqueenforçama conversãocorretadosponteiros

ilmr 147

Page 74: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide147

Classepilha genérica(opção1):

class GenericStack {

public:

GenericStack();

~GenericStack();

void push(void *obj);

void *pop();

bool empty() const;

private:

struct StackNode {

void *data;

StackNode *next;

StackNode(void *newData, StackNode *nextNode)

: data(newData), next(nextNode) { } };

StackNode *top;

GenericStack(const GenericStack& rhs);

GenericStack& operator=(const GenericStack& rhs); };

Slide148

Classeparaconversãodetipos(opção1):

class IntStack {

public:

void push(int *ip) {s.push(ip);}

int *pop() {return static_cast<int *>(s.pop());}

bool empty() const { return s.empty();}

private:

GenericStack s;

};

ilmr 149

Page 75: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide149

Comentáriossobreessaimplementação

� Nãohácustoadicionalno usodeIntStack

– todososmétodossãoinline

� Nadaimpedequeclienteusediretamenteobjetosdaclasse

GenericStack

– Alternativa: evitar manipulaçãodiretadeGenericStack

protegendosuacriaçãoe interface

Slide150

Classepilha genérica(opção2):

class GenericStack {

protected:

GenericStack();

~GenericStack();

void push(void *obj);

void *pop();

bool empty() const;

private:

struct StackNode {

void *data;

StackNode *next;

StackNode(void *newData, StackNode *nextNode)

: data(newData), next(nextNode) { } };

StackNode *top;

GenericStack(const GenericStack& rhs);

GenericStack& operator=(const GenericStack& rhs); };

ilmr 151

Page 76: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide151

Classeparaconversãodetipos(opção2):

class IntStack: private GenericStack {

public:

void push(int *ip) {GenericStack::push(ip);}

int *pop() {return static_cast<int *>(GenericStack::pop());}

bool empty() const { return GenericStack::empty();}

};

Slide152

Classeparaconversãodetipos(generalizandoostipospossíveisdeinterface):

template<class T>

class Stack: private GenericStack {

public:

void push(T *op) {GenericStack::push(op);}

T *pop() {return static_cast<T*>(GenericStack::pop());}

bool empty() const { return GenericStack::empty();}

};

ilmr 153

Page 77: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide153

Herançamúltipla

� Nãoháumaposiçãoclaranacomunidadedeorientaçãoaobjetossobre

osbenefíciosdaherançamúltipla

� Porquedeveserevitada(ou,pelomenos,usadacommuito

cuidado.. . )?

– Ambigüidadepotencial

– Múltiplasocorrênciasdabase

Slide154

Ambigüidade potencial

Base1

faz(): int

Base2

faz():void

Derivada

ilmr 155

Page 78: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide155

Ambigüidade potencial (C++)

class Base1 { class Base2 {

public: public:

int faz(); void faz();

}; };

class Derivada: public Base1, public Base2 {

... // sem faz()

};

Derivada d;

d.faz(); // erro de compilação

Slide156

Restringiracessonãoresolveo problema:

class Base1 { class Base2 {

public: private:

int faz(); void faz();

}; };

class Derivada: public Base1, public Base2 {

... // sem faz()

};

Derivada d;

int i = d.faz(); // continua erro de compilação

ilmr 157

Page 79: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide157

Porquecompiladornãolevaemcontaasespecificaçõesdeacesso?

� Porquemodificaçõesnavisibilidadedemembrosdasclassesnão

deveriamodificaro significadodeprogramas

� Seaabordagemanterior“resolvesse”o problema,apenasmodificação

navisibilidademudariao comportamentodo programa

– semmodificarinvocaçãoou corpodosmétodos

Slide158

Pararesolverambigüidade,apenasatravésdaqualificaçãodosmembros(referênciasexplícitasàclassebase):

d.Base1::faz();

d.Base2::faz();

� Semétodosfossemvirtuais,nãoteriacomoexplorarredefinições

– mesmoqueobjetofossedeumaclassederivadadabase,a

qualificaçãofazcomqueo métodoinvocadosejaexatamenteo

especificado.

ilmr 159

Page 80: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide159

E sedoismétodos,comosmesmostiposdeargumentos,fossemvirtuaisea

classederivadaquisesseredefinirosdois?

� nãohácomofazerdiretamente

– Apenasum métodopodeexistir numaclassecomum dadonomee

listadetiposdeargumentos

� possível atravésdacriaçãodeclassesauxiliares,semcorrespondência

comamodelagemdaaplicação

Slide160

class AuxBase1: public Base1 {

public:

virtual int faz1() = 0;

virtual int faz() { return faz1(); }

};

class AuxBase2: public Base2 {

public:

virtual void faz2() = 0;

virtual void faz() { faz2(); }

};

class Derivada: public Base1, public Base2 {

public:

virtual int faz1();

virtual void faz2();

};

Derivada *d = new Derivada;

Base1 *p1 = d; Base2 *p2 = d;

p1->faz(); // chama faz1

p2->faz(); // chama faz2

ilmr 161

Page 81: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide161

Múltiplas ocorrênciasda classebase

Base1 Base2

Derivada

Comum

Slide162

Tipicamente,classecomumé umaclassebasevirtual:

class Comum{ ... };

class Base1: virtual public Comum{ ... };

class Base2: virtual public Comum{ ... };

class Derivada: public Base1, public Base2 { ... };

� Classebasevirtual impõepenalidadesdeacesso(tipicamente,

implementaçãoporponteirosnaestruturainterna)

� MaseseComum,Base1eBase2existissemantese independentemente

deDerivada(porexemplo,emumabiblioteca)?

– bomprojetorequervisãoprofética.. .

ilmr 163

Page 82: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide163

Outr osproblemasna herançamúltipla

Passagemdeargumentosparaconstrutordeclassebasevirtual:

� Emherançasimples,sembasesvirtuais,construtoresdeclasseem

nível�

repassaminformaçãoparaconstrutoresdaclassenonível�����

� Naherançamúltipla, listadeinicializaçãodo construtorestánaclasse

queémaisderivadadabase

– podeestardistantenahierarquiadeclasses

– podevariaraposiçãocomevoluçãodahierarquia

Solução: classesbasesvirtuaissematributos(estilo interfacedeJava)

Slide164

Dominânciadasfunçõesvirtuais:

class Comum{ public: virtual void f(); ... };

class Base1: virtual public Comum{ ... };

class Base2: virtual public Comum{

public: virtual void f(); ... };

class Derivada: public Base1, public Base2 { ... };

� Háambigüidadenessecódigo?

Derivada *pd = new Derivada;

pd->f();

� SeComumnãofossebasevirtual deBase1ouBase2,haveria

� Comoé, f daBase2é utilizada(dominaa hierarquia)

ilmr 165

Page 83: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide165

Como usar herançamúltipla de forma segura?

� Evitar grafosdehierarquianaformadediamantes

– Evitaproblemasassociadosaclassesbasesvirtuais

� É segurocombinarherançapúblicadeinterfacecomherançaprivadade

implementação

� Reverhierarquia:herançamúltiplaé mesmoamelhorsolução?

Slide166UsandoC++ para expressarpadrõesdeprojeto

ilmr 167

Page 84: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide167

Ati vidades

AnalisarasimplementaçõesfornecidasemC++ comusosdospadrõesde

projetoAdaptador, Decorador, Mediador, Singletone TemplateMethod.

Paracadaum deles,descreva

1. Qualo problemaqueestásendoabordado;

2. Quealternativasdeimplementaçãosãoconsideradas;

3. QueconstruçõesdeC++ sãorelevantesparaa implementação;

4. Quaisospotenciaisproblemasou deficiênciasdaimplementação;

5. Seastécnicasindicadaspoderiamserúteisnaimplementaçãodeoutros

padrões.

Slide168 Conclusões

ilmr 169

Page 85: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide169

� OrigemdosmaioresproblemasnaprogramaçãoemC++

– Faltadecompreensãodoparadigmadeorientaçãoa objetos

– Vícios nodesenvolvimentodesoftware

– Problemasno projeto

– Mal usodosrecursosdalinguagem

� Parao último item,soluçãopassapor

– Reconheceras“mensagensimplícitas”associadasa cadarecurso

– Estaratentoàssituaçõesderisco

– Aplicar soluçõesreconhecidas

Slide170

Referênciasesugestõesde leitura

1. FrederickP. Brooks,Jr. No Silver Bullet: Essenceandaccidentsof software

engineering.IEEEComputer, pp.10–19,April 1987.Disponível em

http://www.virtualschool.edu/mon/Softwa reEngi neerin g/

BrooksNoSilverBullet.html .

2. Phillip G. Armour. TheFive Ordersof Ignorance.Communicationsof theACM

43(10),pp.17–20,October2000.

3. William H. Brown, RaphaelC. Malveau,HaysW. McCormickIII, andThomas

J Mowbray. Antipatterns:Refactoringsoftware, architectures,andprojectsin

crisis. JohnWiley & Sons,1998.

4. ErichGamma,RichardHelm,RalphJohnson,andJohnVlissides.Design

Patterns:Elementsof reusableobject-orientedsoftware. Addison-Wesley,

1995.

ilmr 171

Page 86: Programação orientada a objetos: Desenvolvimento avançado ...flash/programming/c++advnotes.pdf · ilmr 7. F ACUL D EE NG H RI ELÉ TRIC AED COMPU ÇÃO Slide 7 Evolução do desenvolvimento

FACULDADE DE ENGENHARIA

ELÉTRICA E DE COMPUTAÇÃO

Slide171

5. RalphE. Johnson.Frameworks=Components+Patterns.Communicationsof tha

ACM 40(10),pp.39–42,October1997.

6. W. Pree.Designpatternsfor object-orientedsoftware development.

Addison-Wesley, 1995.

7. H. A. Schmid.Framework Designby SystematicGeneralization.Building

ApplicationFrameworks: Object-OrientedFoundationsof FrameworkDesign,

MohamedE. Fayad,DouglasC. Schmidte RalphE. Johnson(Eds.).JohnWiley & Sons,1999,Cap.15,pp.353–378.

8. ScottMeyers.EffectiveC++: 50specificwaysto improveyour programsand

designs, 2ndedition.Addison-Wesley, 1998.� http://www.antipatterns.com/

� http://hillside.net/patterns/

� http://www.objenv.com/cetus/oo_patterns.html

� http://www.osdn.org/

� http://sourceforge.net/

ilmr 171