Professional Documents
Culture Documents
Centro de Tecnologia
Departamento de Engenharia de Teleinformtica
Curso de Graduao de Engenharia de Teleinformtica
Fortaleza Cear
Junho/2012
Projeto
Final
de
Curso
submetido
de
Teleinformtica
da
Fortaleza Cear
Junho/2012
Banca Examinadora
_________________________________________
Prof. Dr. Jos Marques Soares
Orientador
_________________________________________
Prof. Dr. Danielo Gonalves Gomes
Universidade Federal do Cear
_________________________________________
Prof. Dr. Antonio de Barros Serra
Instituto Federal de Educao, Cincia e Tecnologia do Cear
Dedico esta monografia aos meus pais, Tarcisio e Helena, pelo apoio
incondicional, aos meus irmos, Breno e Tassia, que apesar da
distncia sempre estiveram ao meu lado e minha namorada,
Fernanda, que nos momentos mais difceis me deu foras e inspirao
para continuar e jamais desistir dos meus objetivos.
AGRADECIMENTOS
Considerando este trabalho como o resultado de uma longa caminhada, o
agradecimento s pessoas que contriburam para a minha formao no uma tarefa fcil.
Para no correr o risco de cometer injustias agradeo de antemo todas as pessoas que
passaram pela minha vida e que direta ou indiretamente me ajudaram nessa longa caminhada
em busca do sucesso.
Gostaria de agradacer tambm em particular algumas pessoas que tiveram participao
fundamental para a construo desse trabalho:
Ao meu professor e orientador, Prof. Dr. Jos Marques, pelos conhecimentos
transmitidos em sala de aula e tambm fora dela e pela fora e dedicao na orientao deste
trabalho.
Ao GREat (Grupo de Redes de Computadores, Engenharia de Software e Sistemas),
em especial Prof. Dra. Rossana Andrade e ao Reinaldo Braga, pela oportunidade mpar que
tive ao ingressar no grupo e pelo total apoio e confiana depositada em mim durante todo o
tempo em que estive no grupo.
Aos amigos de faculdade pelos momentos de descontrao dentro e fora de sala de
aula, pelas noites em claro estudando para provas e trabalhos da faculdade e pela forte
amizade que construmos durante essa longa caminhada.
A todos os professores do Departamento de Engenharia de Teleinformtica pelo
aprendizado passado durante minha graduao.
Universidade Federal do Cear pela formao de nvel superior de excelente
qualidade.
Resumo
Os processos modernos de engenharia de software, em especial as metodologias geis,
tem como principal objetivo no s a produtividade na construo de softwares, mas tambm
a sua produo com requisitos de alta qualidade, o que inclui caractersticas de reusabilidade e
expansibilidade. Umas das tcnicas para se alcanar qualidade e produtividade o uso de
padres de projeto (ou design patterns). Em muitos programas acadmicos, os padres de
projeto s so estudados em disciplinas de Engenharia de Software, mais precisamente,
durante as fases associadas codificao. Defende-se a incluso de maneira objetiva do
estudo sobre padres de projeto j em disciplinas de programao orientada a objetos, visto
que eles podem ser vistos como tcnicas avanadas e consolidadas de construo de software
e representam um elemento de compreenso efetiva dos mecanismos de herana e
polimorfismo. Nesse sentido, este trabalho prope um arcabouo simples para dar suporte ao
aprendizado de padres de projeto em disciplinas de programao orientada a objetos. O
Arcabouo apresentado atravs do desenvolvimento inicial de um conjunto de padres de
projeto que so julgados importantes, podendo ser generalizado para futuras expanses. Para
cada um desses padres, so descritas as suas principais caractersticas, a situao que
comumente requer o seu uso, alm de sua implementao em Java um caso de exemplo.
Finalmente, proposto um exerccio para sedimentar o seu aprendizado, explorando-se, em
seguida, o reuso das classes e interfaces que fazem parte da estrutura do padro a fim de
mostrar a facilidade de evoluo da soluo e ressaltar as caractersticas de baixo acoplamento
de suas partes.
Palavras-Chaves: Padro de Projeto, Programao Orientada a Objetos, Engenharia
de Software, Qualidade de Software.
Abstract
Modern processes of software engineering, particularly agile methods, has its the main
goal not only the productivity in building software, but also its production with high quality
requirements, which includes characteristics of reusability and expandability. One of the
techniques to achieve quality and productivity is the use of design patterns. In many academic
programs, design patterns are only studied in the disciplines of Software Engineering, more
specifically during the phases associated with encoding. The text supports the inclusion of an
objective study on design patterns already in programming disciplines, especially in objectoriented programming, since they can be viewed as advanced and consolidated programming
techniques, besides it represents an element of effective understanding of the mechanisms of
inheritance and polymorphism. Thus, this study aims to build a framework to support the
learning of design patterns in disciplines of object-oriented programming. The framework is
presented by developing a set of design patterns that are deemed important and can be
generalized for future expansion. For each of these patterns, it's describes its main
characteristics, the situation that usually requires its use, and its implementation in Java an
example case. Finally, we propose an exercise to consolidate their learning, exploring,
whenever possible, the reuse of classes and implementing interfaces involved in the expansion
of pattern in order to emphasize the fundamentals of low coupling provided by it.
Keywords: Design Patterns, Object Oriented Programming, Software Engineering,
Software Quality.
SUMRIO
1.
2.
Introduo .................................................................................................................................... 12
1.1.
Motivao............................................................................................................................. 12
1.2.
Objetivos .............................................................................................................................. 13
1.3.
3.
4.
5.
Referncias Bibliogrficas............................................................................................................. 50
6.
Apndice ...................................................................................................................................... 52
6.1. Apndice A - Facade .................................................................................................................. 52
Apresentao ............................................................................................................................... 52
Descrio com Exemplo ............................................................................................................... 52
Codificao do Exemplo ............................................................................................................... 54
Proposio .................................................................................................................................... 55
Extenso ....................................................................................................................................... 56
6.2. Apndice B - Singleton............................................................................................................... 56
Apresentao ............................................................................................................................... 56
Descrio com Exemplo ............................................................................................................... 56
Codificao do Exemplo ............................................................................................................... 57
Proposio .................................................................................................................................... 59
Extenso ....................................................................................................................................... 59
6.2. Apndice C - Iterator ................................................................................................................. 59
Apresentao ............................................................................................................................... 59
Descrio com Exemplo ............................................................................................................... 60
Codificao do Exemplo ............................................................................................................... 61
Proposio .................................................................................................................................... 64
Extenso ....................................................................................................................................... 64
LISTA DE FIGURAS
Figura 1 Exemplo de Classe e Objetos (UML). .................................................................... 16
Figura 2 Exemplo de Herana. .............................................................................................. 18
Figura 3 Exemplo de Polimorfismo....................................................................................... 20
Figura 4 Arcabouo para o estudo de padres. ...................................................................... 22
Figura 5 Diagrama de Classes Inicial (UML) Strategy ......................................................... 23
Figura 6 Classes RubberDuck e WoodDuck ......................................................................... 24
Figura 7 Classes RubberDuck ............................................................................................... 25
Figura 8 Diagrama de Classes Final (UML) Strategy ........................................................... 26
Figura 9 Classes FlyBehavior.java, FlyWithWings.java e FlyNoWay.java ......................... 26
Figura 10 Classes QuackBehavior.java, Quack.java, MuteQuack.java e Squeak.java ......... 27
Figura 11 Classe Duck.java ................................................................................................... 28
Figura 12 Classes MallardDuck.java, ReadheadDuck.java, WoodDuck.java e
RubberDuck.java ...................................................................................................................... 29
Figura 13 Classe Application.java ......................................................................................... 29
Figura 14 (a) Classes Button e Menu (b) Classe Application.java ........................................ 31
Figura 15 (a) Classes WinButton e LinuxButton (b) Classe Application.java ...................... 31
Figura 16 Diagrama de Classes (UML) Abstract Factory ..................................................... 33
Figura 17 Classe GUIFactory.java I ...................................................................................... 34
Figura 18 Classes WinFactory.java e LinuxFactory.java ...................................................... 34
Figura 19 Classe Button.java ................................................................................................. 34
Figura 20 Classes WinButton.java e LinuxButton.java ........................................................ 35
Figura 21 Classes Application.java ....................................................................................... 36
Figura 22 Classe GUIFactory.java II ..................................................................................... 36
Figura 23 Diagrama de Classes (UML) Composite .............................................................. 39
Figura 24 Classe ComponenteGrafico.java ........................................................................... 39
Figura 25 Classes Linha.java e Texto.java ............................................................................ 40
Figura 26 Classe Imagem.java............................................................................................... 41
Figura 27 Enunciado da Atividade sobre Design Patterns .................................................... 44
Figura 28 Diagrama de Classes (UML) Facade .................................................................... 53
Figura 29 Classes Motor.java, Porta.java, Farol.java e Radio.java ....................................... 54
Figura 30 Classe CarroFacade.java ....................................................................................... 55
Figura 31 Exerccio Proposto Facade .................................................................................... 56
Figura 32 Diagrama de Classes (UML) Singleton ................................................................ 57
Figura 33 Classe Singleton.java ............................................................................................ 58
Figura 34 Classe Main.java ................................................................................................... 59
Figura 35 Diagrama de Classes (UML) Iterator .................................................................... 61
Figura 36 Classes Estrutura.java e Iterador.java ................................................................... 61
Figura 37 Classes Fila.java e Lista.java ................................................................................ 62
Figura 38 Classes IteradorLista.java e IteradorFila.java ....................................................... 63
Figura 39 Classe Aplicacao.java ........................................................................................... 64
LISTA DE TABELAS
Tabela 1 Avaliao mdia dos alunos da turma de graduao para a atividade sobre padres
de projeto na disciplina de Engenharia de Software (2012-1).................................................. 46
12
1. Introduo
1.1. Motivao
A definio de Engenharia de Software no nica. Apesar das distintas definies de
diversos autores, elas apresentam caractersticas de convergncia. O IEEE (Institute of
Eletrical and Eletronics Engineers) [1] define engenharia de software como o estudo e
aplicao
de
uma
abordagem
sistemtica,
disciplinada
quantificvel
para
13
1.2. Objetivos
Sabendo da importncia da utilizao de padres de projeto para a qualidade e
produtividade do desenvolvimento de software, este trabalho tem por objetivo propor um
arcabouo constitudo por recursos tcnicos de apoio ao ensino e aprendizagem para
introduo aos padres de projeto em disciplinas de programao orientada a objetos.
14
15
2. Padres de Projeto
2.1 Introduo
Gamma et al [7] definem que padres de projeto so descries de objetos e classes
comunicantes que precisam ser personalizadas para resolver um problema geral de projeto
num contexto particular. Eles surgiram como o resultado de experincias e solues para
problemas recorrentes no desenvolvimento de software. Eles podem ser definidos, tambm,
como arquiteturas testadas para construir softwares orientados a objetos flexveis e
sustentveis [8].
O grupo conhecido como Gang of Four, formado por Erich Gamma, Richard Helm,
Ralph Johnson e John Vlissides, no livro lanado em 1995, descreve 23 padres de projeto
agrupados em 3 categorias: criacionais, estruturais e comportamentais [7]. Ele ainda subdivide
cada categoria de padro em padres de classe ou de objeto.
Padres de projeto criacionais esto relacionados com o processo de criao e
instanciao de objetos. Eles ajudam a projetar um sistema independente de como os objetos
so criados, compostos e representados. O padro criacional de classe utiliza herana para
variar a forma como a classe instanciada, enquanto o padro criacional de objeto delega sua
instanciao para outro objeto.
Padres do tipo estrutural fazem referncia forma como classes e objetos so
compostos para formar estruturas maiores. No padro estrutural de classe, utiliza-se o
conceito de herana para compor implementaes ou interfaces. J nos padres estruturais de
objeto so descritas formas de compor objetos para adquirir novas funcionalidades em tempo
de execuo, o que no possvel atravs da composio esttica de classes.
Padres comportamentais descrevem a interao e atribuio de responsabilidades
entre objetos e classes. Eles no descrevem somente padres de objetos ou classes mas
tambm padres de comunicao entre eles. Esse tipo de padro caracteriza os fluxos
complexos de controle que difcil de acompanhar em tempo de execuo. Os padres
comportamentais
de
classe
utilizam
herana
para
distribuir
comportamentos,
16
17
estado inconsistente. Utilizando esse conceito obtemos vrios benefcios, entre eles proteger
dados e operaes, deixar o cdigo mais legvel e melhor estruturado, tornando a manuteno
menos custosa. Para dar suporte ao encapsulamento bem como definio da interface
pblica de um objeto (mtodos e atributos expostos para outros objetos), a mairoria das
linguagens OO, como o Java, fornece quatro tipos de modificadores de acesso ou visibilidade:
public, private, protected e default.
Os atributos e mtodos de um objeto ou classe so comumente chamados de membros
desse objeto ou classe. Desse modo, quando um membro de uma classe definido como
public, significa que todos os objetos tm acesso a esse membro. Quando, por outro lado, esse
membro definido como private, s quem tem acesso a esse membro a prpria classe. Os
modificadores protected e default so quase idnticos. Enquanto o membro default pode ser
acessado apenas pelas classes que pertencerem ao mesmo pacote, o membro protected pode
ser acessado tambm pelas suas subclasses, mesmo que suas subclasses no perteam ao
mesmo pacote [9].
Herana
O conceito de herana definido por [8] como uma forma de reutilizar o cdigo
quando uma nova classe criada, absorvendo membros de uma classe j existente,
economizando tempo durante o desenvolvimento do software.
Quando uma classe herda de uma outra classe existente, esta classe chamada de
superclasse e aquela de subclasse. A subclasse herda as propriedades da superclasse, ou seja,
ela tem acesso aos atributos e mtodos, dependendo dos modificadores de acesso, da
superclasse. Existem dois tipos de herana, simples e mltipla, na primeira uma classe s
pode herdar de somente uma superclasse diretamente, como o caso do Java, j na herana
mltipla uma classe pode herdar mais de uma superclasse diretamente, um exemplo a
linguagem C++.
Na Figura 2, mostrado um exemplo onde as classes Estudante e Engenheiro so
subclasses da classe Pessoa. Desse modo, as subclasses herdam todos os atributos, pois eles
possuem modificadores de acesso protected, e todos os mtodos da superclasse, pois possuem
modificadores de acesso public.
18
Polimorfismo
Polimorfismo, que vem do grego "muitas formas", permite que se utilizem objetos
pertencentes a classes relacionadas entre si pela relao de herana. Atravs de uma interface
nica, o objetivo o de tratar uma variedade de classes relacionadas de forma uniforme,
facilitando, por um lado, a especializao do comportamento e, por outro lado, simplificando
a adio de novas classes ao software sem requerer modificao nas classes pr-existentes, o
que imprime ao software caractersticas de baixo acoplamento.
O polimorfismo permite que o processamento de objetos que possuem a mesma
superclasse em uma hierarquia sejam tratados como se todas fossem objetos da superclasse
[8]. Utilizando o polimorfismo, pode-se projetar e implementar sistemas que so facilmente
extensveis, ou seja, a adio de novas classes pode ser feita com pouca ou nenhuma
modificao, contanto que essas novas classes faam parte da hierarquia de herana do
sistema. Nota-se que polimorfismo est intimamente ligado utilizao de herana.
Entretanto, para que esse requisito seja cumprido de maneira correta, necessrio que a
hierarquia de classes atenda ao princpio de substituio de Liskov [10], que define que, se um
objeto do tipo S pode ser substitudo em todos os locais onde um objeto do tipo T, esperado,
ento S um subtipo de T. Se, em algum caso, essa substituio no resultar em um
comportamento correto e esperado, o reuso promovido pela herana foi utilizado de maneira
incorreta, modificando a semntica da interface comum encontrada na hierarquia de classes, e
o princpio de Liskov foi quebrado.
19
20
21
teoria e a prtica na utilizao dos padres de projeto. O modelo proposto formado por trs
blocos principais: apresentao, desenvolvimento conceitual e desenvolvimento prtico,
descritos em seguida:
22
diferentes
do
exemplo
que
foi
apresentado
no
bloco
Desenvolvimento conceitual
Codificao do Exemplo
Desenvolvimento prtico
Proposio
Extenso
23
2.4 Strategy
Apresentao
O Padro Strategy define uma famlia de algoritmos que so encapsulados em objetos
independentes dos objetos para os quais os algoritmos foram efetivamente concebidos.
Encapsular comportamentos associados a objetos pertencentes a uma hierarquia de
classes permite que os algoritmos variem independentemente dos clientes que o utilizam [7].
Alm disso, a estrutura proposta pelo padro Strategy possibilita efetuar a modificao do
comportamento de um objeto em tempo de execuo.
24
Entretanto, percebe-se que nem todos os patos podem voar. Por exemplo, patos de
borracha no voam. Uma alternativa inicial sobrescrever o mtodo fly() na classe dos patos
de borracha, RubberDuck, para modificar o seu comportamento em relao ativao deste
mtodo, como mostrado na Figura 6. Analisando-se a extensibilidade da soluo, ao adicionar
outro tipo de pato, por exemplo, um pato de madeira, representado pela classe WoodDuck,
teremos que modificar novamente os mtodos quack() e fly(), como mostrado na Figura 6.
Pode-se observar que essa soluo possui vrias desvantagens: (i) cdigo duplicado entre
diferentes classes; (ii) alteraes no comportamento em tempo de execuo se tornam difceis;
(iii) difcil saber de antemo o comportamento de todos os patos.
Como generalizar o comportamento inserindo os mtodos fly() e quack() na
superclasse Duck traz os problemas citados, explora-se outra alternativa com a utilizao de
interfaces distintas para representar os dois comportamentos: Flyable e Quackable. Desse
modo, sugere-se que os patos que voam implementem a interface Flyable e,
consequentemente, o mtodo fly(). Da mesma maneira, os patos que grasnam devem
implementar a interface Quackable e, consequentemente, o mtodo quack(), como mostrado
no diagrama de classes da Figura 7. Embora, da perspectiva de um objeto, essa soluo trate o
encapsulamento de uma maneira mais limpa, ela compromete a reutilizao do cdigo que
define cada um desses comportamentos. Imaginando um cenrio em que diversos tipos de
pato apresentem o mesmo comportamento de voo, por exemplo, o mesmo cdigo precisaria
ser replicado para todos os patos que o implementam. Alm isso, uma alterao, mesmo que
pequena, no comportamento de vo exigiria uma atualizao em todas as classes que o
implementam, tornando a manuteno uma tarefa extremamente custosa e podendo gerar
inconsistncia no sistema.
25
26
Codificao do Exemplo
Na Figura 9 temos a implementao da interface FlyBehavior e das classes concretas
FlyNoWay e FlyWithWings que implementam essa interface. Na Figura 10, temos a
implementao da outra interface, QuackBehavior, e das classes concretas Quack, Squeak e
MuteQuack que implementam essa interface.
27
28
29
Na Figura 13, temos uma pequena aplicao, classe Application, onde mostramos o
funcionamento das classes discutidas anteriormente.
Proposio
Um Sistema de Controle de Produo Cientfica (SCPC), em desenvolvimento para
uma instituio de ensino, permite a organizao de diferentes tipos de documentos, tais como
monografias, artigos, relatrios e estatsticas. Possuindo os diferentes documentos um
conjunto de caractersticas em comum, para diversas funcionalidades do sistema, eles so
tratados de maneira indistinta. Entretanto, algumas operaes, embora comuns a todos os
tipos de documento, apresentam especificidades, como o caso da operao de codificao.
Relatrios e estatsticas so codificados em HTML, para serem apresentadas na interface de
30
navegadores Web, enquanto que artigos e monografias so codificados em PDF. Alm disso,
alterando-se o modo de operao do sistema, deve ser possvel codificar tambm em PDF os
documentos do tipo relatrio e estatstica.
A partir do problema apresentado, prospecte uma soluo reutilivel que leve em
considerao a possibilidade de diferentes formas de condificao para todos os tipos de
documento, sem deixar de considerar suas semelhanas. Com base no padro Strategy,
elabore um diagrama de classes capaz de abstrair todos os tipos de objetos envolvidos na
soluo. Em seguida, implemente a soluo modelada.
Lembre-se que a soluo deve tratar tanto a especificidade do comportamento de
codificao para os diferentes tipos de documento como a dinmica associada alterao no
modo de operao para os documentos do tipo relatrio e estatstica.
Extenso
Uma modificao foi solicitada para o SCPC. Ser preciso agora adicionar um outro
tipo de documento, o edital, e outro tipo de codificao, XML, visto que o sistema ser
integrado ao sistema da Pr-Reitoria de Ps-Graduao. Modifique o diagrama de classes e a
implementao desenvolvidos para contemplar essas novas caractersticas no sistema.
Verifique se foi necessrio modificar alguma das classes ou operaes do modelo
original. Caso isso tenha acontecido, possvel que voc no tenha desenvolvido o padro
Strategy corretamente.
31
entre outros, para uma aplicao que ser executada pelo sistema operacional Windows.
Inicialmente, a soluo modelada para este toolkit utiliza a classe Button para representar o
componente grfico boto, que possui o mtodo paint() que ir desenh-lo na tela, mostrada
na Figura 14(a). A partir dela so criados todos os botes da aplicao, que so utilizados,
nesse exemplo, pela classe Application.java mostrada na Figura 14 (b).
Supondo agora que essa aplicao dever ser executada tambm no sistema
operacional Linux, foi desenvolvido um novo diagrama de classes, mostrado na Figura 15(a).
Utilizando os conceitos de Orientao a Objetos a classe Button agora se tornou abstrata, e as
classes WinButton e LinuxButton estendem dela, onde cada uma dessas classes ir
implementar o mtodo paint() que ir desenhar o componente de acordo com seu sistema
operacional.
32
33
Codificao do Exemplo
Na Figura 17 temos a implementao da classe GUIFactory. Note que no mtodo
esttico getFactory() na linha 7 definido em qual sistema operacional a aplicao est
rodando em tempo de execuo e dependendo dele ser instanciado um objeto do tipo
WinFactory ou LinuxFactory. criado tambm, como dito anteriormente, o mtodo abstrato
createButton(), que ser implementado pelas suas subclasses para criar o componente grfico
boto.
34
A classe abstrata Button, Figura 19, criada com o mtodo abstrato paint(), que
dever ser implementada pelas suas subclasses concretas.
35
Note que na aplicao, aqui representada pela classe Application, mostrada na Figura
21, utiliza-se somente as classes GUIFactory e Button, que so as classes bases para a criao
dos componentes grficos. Na linha 7 obtm-se o objeto factory atravs do mtodo
GUIFactory.getFactory(), dessa forma v-se que, para a aplicao, transparente se esse
mtodo ir retornar um objeto do tipo WinFactory ou LinuxFactory. Na linha 8, o objeto
button recebe um objeto atravs da chamada mtodo factory.createButton() e posteriormente,
na linha 9, temos a chamada do mtodo button.paint(). Note, mais uma vez, que para a
aplicao o tipo de boto que ser criado indiferente, bem como a forma como esse boto
vai ser desenhado na tela. Desse modo a aplicao no precisa se preocupar em qual sistema
operacional ela ser executada, facilitando o seu desenvolvimento.
36
importante notar que ao surgir uma necessidade de expandir essa aplicao para
outro sistema operacional, por exemplo o Lion da Apple, no se faz necessrio grandes
mudanas. Primeiramente iremos criar a classes LionFactory e LionButton, herdando de
GUIFactory e Button, respectivamente. Por fim, modificaramos apenas o mtodo
getFactory() da classe GUIFactory, como mostrado na Figura 22, mudana essa que no
impacta em nenhuma das classes previamente implementadas, principalmente na aplicao.
37
Proposio
Uma montadora de veculos est desenvolvendo um sistema para auxiliar sua linha de
montagem. Esse sistema ser responsvel pelo controle completo da montagem dos veculos
dessa montadora, desde o controle de estoque das peas que sero utilizadas at a montagem
das peas no veculo.
Sabe-se que cada modelo de veculo tem sua prpria linha de montagem. Pois, apesar
de alguns modelos compartilharem algumas peas comuns, a montagem e grande parte das
peas so diferentes.
Inicialmente, a montadora quer que o sistema funcione para dois modelos de carro,
modelo X e modelo Y, a partir do qual sero feitos testes e ser decidido pelos scios se o
sistema ser implantado para outros modelos ou no. Desenvolva, a partir do problema
descrito, uma soluo para esse sistema, tendo como foco o baixo acoplamento e a
reusabilidade. Utilizando o padro Abstract Factory elabora o diagrama de classes e
implemente a soluo modelada.
Extenso
Aps inmeros testes a montadora aprovou o sistema de linha de montagem
desenvolvido, para os modelos de carro X e Y. Agora ela quer que a linha de montagem de
seu mais novo carro, modelo Z, tambm seja controlada por esse sistema. Modifique o
diagrama de classes e a implementao desenvolvidas para contemplar essa modificao.
Analise onde as modificaes foram realizadas, se foi preciso modificar alguma das
classes implementadas ou as operaes do sistema anterior, pois, em caso afirmativo,
possvel que o padro Abstract Factory no tenha sido desenvolvido corretamente.
2.6 Composite
Apresentao
O padro de projeto Composite consiste na criao de uma estrutura em rvore para
compor objetos utilizando componentes em estruturas hierrquicas. Cada um desses
componentes implementa uma mesma interface ou estende uma mesma superclasse. Esse
padro permite que o cliente utilize esses componentes e a composio desses componentes
de forma uniforme.
38
39
Codificao do Exemplo
Est implementado em Java o exemplo discutido acima de forma simplificada. A
classe ComponenteGrafico abstrata e possui 4 mtodos que devero ser implementados
pelas suas subclasses. Essa classe representa tanto os objetos primitivos quanto a composio
deles.
40
41
Proposio
Um engenheiro de software est criando uma nova linguagem de programao, para
isso ele ter que definir uma gramtica com os comandos que sero utilizados nessa nova
linguagem. Faa o diagrama de classes para representar os comandos dessa linguagem da
melhor forma possvel utilizando o padro discutido.
Dica: divida os comandos da gramtica em comandos simples e comandos compostos.
Extenso
Aps feito o diagrama de classes no exemplo proposto, deseja-se adicionar dois novos
comandos, um simple e um composto. Modifique o diagrama de classes para contemplar os
novos comandos a serem implementados.
42
43
44
45
46
estudo para o sistema sobre o qual se desenvolviam as atividades da disciplina. Esse tipo de
dificuldade pode comprometer o tempo do aluno e retirar o foco de seu aprendizado da
programao Orientada a Objetos. Assim, tendo em vista a sua aplicao em disciplinas de
programao, e no em disciplinas de engenharia de software, estabeleceu-se que o arcabouo
deve enunciar diretamente uma situao problema apropriada ao uso do padro.
Ao final da atividade, foi solicitado aos alunos do curso de graduao que
preenchessem um formulrio de avaliao. As questes eram avaliadas pelos alunos usando
uma escala de representao variando de A (nota mxima) a E (nota mnima), ou X (no se
aplica). Dentre outros aspectos menos relevantes para este trabalho, as quatro perguntas
abaixo foram colocadas:
1) Como voc avalia os seus CONHECIMENTOS SOBRE ORIENTAO A
OBJETOS ANTES DO DESENVOLMENTO DESTA atividade?
2) Como voc avalia os seus CONHECIMENTOS SOBRE ORIENTAO A
OBJETOS DEPOIS DO DESENVOLMENTO DESTA atividade?
3) Aps a realizao do trabalho, como voc avalia a sua ABSORO DO
CONTEDO DESIGN PATTERNS?
4) Caso voc venha a trabalhar ou trabalhe com desenvolvimento de software,
como voc avalia a contribuio dessa atividade NA SUA VIDA
PROFISSIONAL?
A fim de computar as mdias das respostas, os conceitos associados atribudos pelos
alunos foram substitudos por valores numricos da seguinte maneira: A-10, B-8, C-6, D-4, E2 e X-0.
A Tabela 1 resume as mdias das avaliaes realizadas pelos onze alunos da turma de
graduao:
Tabela 1 Avaliao mdia dos alunos da turma de graduao para a atividade sobre padres de projeto
na disciplina de Engenharia de Software (2012-1)
Questo
Mdia
6,6
8,6
7,8
8,8
47
48
4. Consideraes finais
Dada a importncia da utilizao de padres de projeto na qualidade do software a ser
produzido, foi desenvolvido neste trabalho um arcabouo para servir de apoio ao aprendizado
em disciplinas de programao orientada a objetos. Esse arcabouo constitudo por cinco
elementos que descrevem o comportamento de cada padro de projeto: apresentao,
descrio com exemplo, codificao do exemplo, proposio e extenso.
Esse trabalho selecionou um conjunto de padres que so julgados importantes e para
cada um deles descreve o que tem de mais importante na literatura [5], [7], [8], [11], [17],
sempre com foco na didtica de ensino. Para cada padro de projeto mostra-se em quais
aplicaes ele utilizado e destaca-se um problema em especfico, tomando-o como exemplo,
que seja mais conveniente para facilitar o entendimento da soluo que o padro fornece. A
partir desse exemplo criado o diagrama de classes da soluo. O exemplo tambm
implementado em Java para demonstrar o comportamento do padro. Por fim, apresentado
um exerccio proposto e uma extenso do mesmo com o objetivo de fixar o entendimento do
padro de projeto em questo.
O arcabouo possui duas sees principais no aprendizado de padres de projeto,
Proposio e Extenso. Nessas sees so colocados problemas com o objetivo de prover
um melhor entendimento, na prtica, do padro de projeto, mostrando sua utilidade e sua
versatilidade na evoluo e modificao da aplicao. Contudo, a elaborao de problemas
que sejam didticos e que abordem o padro na melhor forma possvel no uma tarefa fcil,
visto que necessrio que haja experincia em sala de aula notando as dificuldades e
deficincias dos alunos. Dessa forma, necessrio que haja uma utilizao na prtica do
arcabouo, tendo como propsito sua evoluo de acordo com as dificuldades que forem
surgindo.
Apesar de o arcabouo proposto ainda no ter sido utilizado na prtica em uma
disciplina de programao orientada a objetos, atravs de um estudo terico e da anlise de
uma atividade sobre padres de projeto em duas disciplinas no Departamento de Engenharia
de Teleinformtica da UFC, sendo uma na graduao e outra na ps-graduao, pode-se
inferir que as dificuldades conceituais em Orientao a Objetos, em especial no uso de
interfaces e de polimorfismo para soluo de problemas, comprometeu substancialmente o
processo de aprendizagem. Percebeu-se que seria praticamente intil trabalhar Padres de
49
Projeto sem o devido amadurecimento de conceitos de OO. Desse modo, justifica-se incluir,
de maneira objetiva, o estudo sobre padres de projeto j em disciplinas de programao
orientada a objetos, visto que eles podem ser vistos como tcnicas avanadas e consolidadas
de programao.
A utilizao deste trabalho em disciplinas de programao orientada a objetos torna o
aprendizado de padres de projeto mais eficaz, j que a teoria vista de forma mais prxima
da prtica, por ter exerccios para a melhor compreenso do padro, e mais objetiva, pois,
diferente de alguns livros, onde h, por vezes, exausto de informaes desnecessrias, neste
trabalho o padro visto tendo como foco a soluo para o problema apresentado.
50
5. Referncias Bibliogrficas
[1]
IEEE.
Institute
of
Eletrical
and
Eletronics
Engineers.
Disponvel
em
[3]
[4]
[5]
[6]
[7]
[8]
[9]
Sierra, K; Bates, B. SCJP Sun Certified Programmer for Java 6 Study Guide (Exam
310-065). McGraw-Hill, 2008.
[10] Liskov, B.H; Wing J.M. Behavioral Subtyping Using Invariants and Constraints.
Formal Methods for Distributed Processing, an Object Oriented Approach, Howard
Bowman and John Derrick, editors, Cambridge University Press, 2001, pp. 254-280.
[11] Freeman, E; Freeman, E; Sierra, K; Bates, B. Head First: Design Patterns. 1st Ed.
O'Reilly Media, 2004.
[12] ECLIPSE FOUNDATION. Eclipse Helios. Disponvel em <http://www.eclipse.org>.
ltimo acesso em 30 de maio de 2012.
[13] KOSCIANKI, A; SOARES, M. S. Qualidade de software. 2 Edio. So
Paulo:Novatec, 2007. 395 p.
[14] SERSON, R. R. A Bblia: Certificao JAVA 6. Rio de Janeiro: Brasport, 2009.
51
52
6. Apndice
6.1. Apndice A - Facade
Apresentao
O padro de projeto Facade, fachada em francs, um padro do tipo estrutural e tem
por objetivo fornecer uma interface unificada que simplifique o entendimento e a utilizao de
um subsistema mais complexo.
53
54
Codificao do Exemplo
55
A classe CarroFacade, Figura 30, nossa classe fachada, faria o papel de simplificador
dos processos relacionados ao subsistema, nesse caso ligar e desligar o carro. Desse modo,
como dito anteriormente, a aplicao no precisaria se preocupar com cada um dos processos
internos, e sim com os processos que realmente so relevantes para ela: ligar e desligar o
carro.
Proposio
O sistema de uma loja virtual recebe dados de um cliente atravs de um formulrio
que contm informaes de usurio e do carto de crdito. Aps receber os dados, as entradas
so validadas e gravadas em um lugar apropriado. Utilize o padro Facade para diminuir o
acoplamento entre os componentes, reduzindo as dependncias entre eles. Na Figura 31
mostra-se o diagrama de classes do exemplo em questo.
56
Extenso
No sistema do exerccio acima, necessrio que seja adicionado ao formulrio o
endereo do cliente, modifique o diagrama de classes e a implementao, explicitando onde se
dariam as modificaes.
57
Codificao do Exemplo
O padro de projeto Singleton, como dito acima, garante que um sistema instancie no
mximo um e somente um objeto de uma classe. No exemplo abaixo, demonstra-se como
feita a implementao desse padro em Java.
Na linha 3 temos a declarao da classe Singleton com o modificador final,
objetivando a no criao de subclasses o que poderia fornecer outras instncias de objetos da
mesma hierarquia, ferindo o objetivo principal do padro. Na linha 8 declaramos o construtor
da classe Singleton como private. Esse construtor caracteriza o padro de projeto Singleton,
pois, a partir dele, mostramos que somente a classe Singleton pode instanciar um objeto
Singleton. Juntamente com o construtor privado criada uma referncia private, encapsulando
a referncia ao objeto nico, e static, que garante a existncia de uma nica referncia ao
objeto Singleton, declarado como singleObject, na linha 5. Na linha 13 declarado o mtodo
getInstance() que retornar aos clientes a instncia nica da classe. Nesse mtodo
instanciado o objeto singleObject de Singleton, caso ele ainda no exista. Nele tambm
utilizado o modificador synchronized para impedir a execuo simultnea deste mtodo em
eventuais requisies.
58
59
Proposio
Precisa-se desenvolver um simulador de um processador, que possui apenas um ncleo
de processamento, que ser utilizado para testar algoritmos de escalonamento. Nesse projeto
ser utilizado um nico objeto para representar esse nico ncleo de processamento, onde as
aplicaes iro utiliz-lo para executar suas tarefas. Implemente a classe CPU de forma a
garantir a integridade da execuo de dados, utilizando o padro Singleton.
Extenso
A partir do exerccio anterior, implemente duas classes que representem duas
aplicaes distintas que iro utilizar o microprocessador em questo.
60
61
Codificao do Exemplo
Na Figura 36 temos a implementao em Java do exemplo discutido. Temos as classes
abstratas Estrutura, que representa as diferentes estruturas de dados, e Iterador, que
representa a classe responsvel por percorrer os objetos da estrutura de dados.
62
63
64
Proposio
Faa um programa em Java utilizando o padro acima discutido utilizando pilha e
array como estruturas de dados a serem percorridas pelo iterador de forma transparente.
Extenso
Agora, adicione ao programa desenvolvido uma nova estrutura de dados, hash map.