Anda di halaman 1dari 17

13/3/2014

DevMedia - Verso para impresso

DevMedia - Verso para impresso

Polimorfismo em ao
Tcnicas e aplicao deste poderoso recurso da POO
De que se trata o artigo Este artigo abordar um dos mais poderosos recursos de programao, item essencial na bagagem tcnica de todo bom desenvolvedor: o polimorfismo. Abordaremos, ao longo do texto, os conceitos que caracterizam as quatro tcnicas existentes, dando ao leitor o conhecimento necessrio para entender como o recurso aplicado nas bibliotecas e plataformas que utiliza no seu dia-a-dia, bem como de aplicar nas suas prprias implementaes. Em que situao o tema til Este tema til para todo profissional que atue no desenvolvimento de solues computacionais, principalmente aquelas desenhadas sob a luz do paradigma da orientao a objetos, em que o recurso do polimorfismo pode ser utilizado em sua plenitude. Embora praticamente todos os exemplos do artigo tenham sido desenvolvidos em Java, os conceitos e tcnicas demonstrados podem ser aplicados em qualquer linguagem de programao orientada a objetos. Algumas tcnicas de polimorfismo que veremos, como a de sobrecarga, podem inclusive ser adotadas em linguagens que no seguem o paradigma da orientao a objetos. Resumo Devman Muito se fala sobre polimorfismo e sua importncia para sistemas construdos, principalmente, sobre o paradigma da orientao a objetos. Entretanto, o foco dado a este conceito to importante , geralmente, parcial, e nem todas as tcnicas so conhecidas na profundidade necessria por uma parcela significativa de desenvolvedores. Este artigo apresentar de forma um pouco mais ampla cada um dos quatro formatos em que este conceito se apresenta, com exemplos prticos que complementam toda a teoria. Polimorfismo um termo que se originou do grego e significa vrias formas. A semntica do mesmo preservada quando transportado para o universo da programao de computadores. Atravs de tcnicas que veremos ao longo do artigo, possvel que criemos estruturas suficientemente genricas ao ponto de serem utilizadas em vrios contextos, tornando o cdigo-fonte final mais enxuto, legvel e manutenvel. Embora possamos observar polimorfismo tambm em linguagens estruturadas, no paradigma orientado a objetos que o conceito realmente ganha fora e aplicado em sua plenitude. Inmeros padres de projeto se beneficiam desta tcnica, dentre os quais podemos
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 1/17

13/3/2014

DevMedia - Verso para impresso

destacar o Abstract DAO, Abstract Factory, Template Method, Strategy, Observer e Composite. Mecanismos de tratamento de excees e eventos em praticamente todo framework, bem como o desenvolvimento de plug-ins, so itens altamente beneficiados pelo emprego das tcnicas polimrficas. De Swing/AWT a GWT e JavaServer Faces, passando por JPA, Hibernate, Struts, Spring e tantos outros, encontramos polimorfismo por todos os lados. No raro encontrarmos, em fruns renomados da web, profissionais de Tecnologia da Informao buscando explicaes mais detalhadas a respeito do polimorfismo e recebendo respostas como a transcrita a seguir, retirada de um desses canais: polimorfismo polimorfismo, no existem tipos de polimorfismo; motivao suficiente para a escrita deste artigo, em que abordaremos todas as caractersticas e roupagens deste conceito fundamental. O polimorfismo classificado em duas categorias, sendo que cada uma se ramifica em duas tcnicas. Veremos, neste artigo, exemplos da aplicao de cada uma, seguida de uma discusso a seu respeito. Esperamos que o leitor tenha uma experincia construtiva durante a leitura deste material, reciclando conceitos e aprendendo outros, levando para o seu dia-a-dia todas as prticas aqui abordadas. Antes de iniciarmos, verifique a Tabela 1, que resume as quatro abordagens existentes, tratadas a seguir em maiores detalhes. Todo o cdigo ser apresentado em Java (salvo uma das vertentes da tcnica de polimorfismo por sobrecarga, que ser exibida em C++), embora possam ser facilmente aplicadas a outras linguagens orientadas a objetos, como Objective-C ou C#.
[abrir im age m e m jane la]

Tabela 1. Resumo das quatro principais tcnicas de polimorfismo.

O polimorfismo ad hoc
A traduo literal para o termo ad hoc, que tem sua origem no latim e to utilizado por profissionais de computao, para isto ou, ainda, para esta finalidade. Na prtica, o termo usado para tudo aquilo que foi projetado para atender a uma demanda pontual, no genrica. Em outras palavras, tcnicas ad hoc sero sempre aquelas para ataque a necessidades pontuais. Esta categoria abrange duas tcnicas, que so conhecidas como coero (tambm chamado de casting) e sobrecarga. Ao longo desta seo, exploraremos cada uma em maiores detalhes. Polimorfismo por coero O significado literal do termo coero, na lngua portuguesa, ato ou efeito de obrigar/forar. E exatamente isto que acontece quando empregamos esta tcnica no desenvolvimento de sistemas computacionais: foramos um objeto a vestir uma roupagem especfica. Isto muito comum em casos em que precisamos definir um modelo genrico que seja, depois, redefinido/
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 2/17

13/3/2014

DevMedia - Verso para impresso

especializado por outras classes de objetos. Para que isso seja possvel, o template/padro construdo utilizando apenas tipos suficientemente abstratos (a partir de interfaces ou ainda classes abstratas), do qual se derivam/especializam diversos tipos de objetos de acordo com a necessidade. Como tudo o que est relacionado a desenvolvimento de software, tudo ficar muito mais claro analisando um exemplo. As Listagens 1, 2 e 3 apresentam um primeiro caso de estudo da tcnica de polimorfismo por coero, e sobre ele que discutiremos nestes prximos pargrafos. Uma classe intitulada Produto utilizada para manipular, em tempo de execuo, dados referentes a produtos. A persistncia e recuperao de registros referentes a produtos junto ao banco de dados local do dispositivo mvel (este cdigo de uma aplicao mvel para a plataforma Android) esto definidas em uma classe de nome DaoProduto. Entretanto, este aplicativo no trata apenas de produtos, mas de outros tipos de elementos (como clientes, vendas, dentre outros). Isto exige a criao de outros tipos de objetos de acesso a dados para trabalhar exclusivamente com essas outras entidades, e o comportamento esperado para cada um desses novos objetos o mesmo que verificamos na classe DaoProduto. Nesses casos, necessria uma padronizao de comportamento, obtida atravs da criao de um contrato por meio da classe abstrata a que demos o nome de GenericDAO. Nesta classe so implementados todos os comportamentos comuns a qualquer DAO, e apenas declarados os comportamentos que variaro de um DAO para outro. Como o tipo de elemento que cada DAO manipular diferente, o contrato precisa definir parmetros genricos o suficiente para funcionar para todos os tipos de entidades do universo a ser atingido. A classe GenericDAO utiliza o tipo genrico java.lang.Object para representar todos os tipos de registros processados por classes de objetos de acesso a dados. Como esta a classe mais genrica da API do Java, qualquer classe de objetos criado em nossa aplicao uma extenso dela. At aqui tratamos apenas da generalizao, pois estamos discutindo a definio do contrato a ser seguido por todos os DAO especialistas. Mas como ficaria o tratamento do objeto em cada classe especialista? Para isso, ser necessria uma verificao para garantir que o objeto passado realmente o tipo tratado por aquele objeto. A verificao do tipo da instncia realizada, no cdigo da Listagem 3, por meio do qualificador instanceof, que retorna um valor booleano. Caso o tipo do objeto seja realmente aquele tratado pelo DAO, o prximo passo utilizar o recurso de coero, em que o objeto volta a ser tratado por seu tipo original. Resumindo, utilizamos generalizao para definirmos o padro comportamental para objetos de acesso a dados, e para isso trabalhamos com o tipo mais genrico possvel para definir a instncia que representa o registro a ser manipulado. Empregamos, depois, especializao para implementar cada um dos DAO, e o tipo genrico deu espao, por meio da tcnica de coero, ao tipo de registro manipulado pelo DAO em questo. Um exemplo de aplicao de polimorfismo por coero observado na prpria API do Android pode ser observada na recuperao de instncias de servios da plataforma. A Listagem 4 mostra como recuperar referncias para servios de carregamento dinmico de leiautes (android.view.LayoutInflater) e localizao (android.location.LocationManager). A implementao deste mtodo retorna as instncias dos servios respectivos em uma roupagem genrica (java.lang.Object), o que nos obriga a forar a tipagem do objeto retornado para o servio desejado. Polimorfismo por sobrecarga
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 3/17

13/3/2014

DevMedia - Verso para impresso

Vamos, agora, falar do segundo tipo de polimorfismo ad hoc: a sobrecarga. E, para entendermos na prtica esta tcnica, vamos utilizar uma das funes disponveis na API da classe android.content.Context. Toda tela em uma aplicao Android representada por uma atividade (android.app.Activity), e a definio do contedo visual dessas telas pode ser realizada de duas maneiras: 1. Atribumos atividade um identificador que representa um leiaute declarado em um arquivo XML, que posteriormente interpretado e convertido em objetos (widgets) associados entre si; ou seja: a estrutura declarada no arquivo XML ser utilizada para se criar o contedo grfico da atividade, em tempo de execuo; 2. Criamos programaticamente e atribumos atividade uma instncia da classe android.widget.View. visvel que estamos falando de duas maneiras distintas de se definir o contedo visual de uma atividade. Entretanto, o nome do mtodo exatamente o mesmo para os dois cenrios: setContentView(). E o que muda? Muda o tipo do parmetro passado. No primeiro caso, passado um valor numrico e inteiro, gerado e mantido em uma classe de nome R (de resources); j no segundo caso, o parmetro do tipo android.widget.View, que representa genericamente qualquer elemento grfico, seja este um container ou um widget. Veja, abaixo, a assinatura dos dois mtodos comentados at agora: android.content.Context - setContentView(int resId); android.content.Context - setContentView(View view). Esta a tcnica da sobrecarga de mtodos na prtica: mantemos o nome de um determinado mtodo e definimos, para ele, dois formatos distintos de utilizao, representados pelos parmetros exigidos em cada assinatura. A Listagem 5 apresenta um exemplo da utilizao de sobrecarga de mtodo mencionada acima. Trata-se da primeira implementao mencionada na lista acima, em que um componente do tipo android.view.View representado por um valor numrico e inteiro. Ainda na Listagem 5, no segundo exemplo, o mesmo mtodo sobrecarregado para receber como parmetro de entrada um objeto do tipo android.view.View diretamente. O resultado final o mesmo: carrega-se, para a atividade (android.app.Activity) em questo, a interface grfica que ela se encarregar de renderizar na tela do dispositivo mvel. H tambm um segundo modelo de sobrecarga, que o de operadores. Em Java, esta opo est disponvel apenas para uso, o que significa que no possvel sobrecarregarmos operadores para necessidades especiais que, eventualmente, verificarmos, sendo possvel somente o uso das sobrecargas j definidas na plataforma. Um exemplo tpico e muito comum de sobrecarga de operadores em Java o recurso de concatenao de texto, fazendo com a que soma de dois objetos do tipo java.lang.String resulte em um novo objeto de texto cujo valor o texto do primeiro objeto emendado ao texto do segundo. O motivo de sobrecarregarmos operadores usar o mesmo conjunto de operadores j conhecidos e oferecidos pela linguagem de programao em questo (com os quais o desenvolvedor j est familiarizado, portanto) para desempenhar funes diferenciadas em contextos que no sejam aqueles estabelecidos como padro. Existe um material bastante denso a respeito de sobrecarga de operadores em livros renomados no universo da computao. A Listagem 6 apresenta um exemplo de utilizao da sobrecarga do operador de soma para objetos do tipo java.lang.String. Na sequncia, na Listagem 7, podemos observar um exemplo de sobrecarga de operadores em C++.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 4/17

13/3/2014

DevMedia - Verso para impresso

Alguns operadores, mesmo quando aplicados a tipos primitivos, possuem tratamentos especiais dependendo do tipo de dado manipulado. Em C++, por exemplo, embora aparea de forma transparente para o desenvolvedor, o operador de soma opera de maneiras distintas para elementos dos tipos int, double e float. Interessante e desconhecido por boa parte dos desenvolvedores mais novos, uma sobrecarga normalmente ignorada, pois, de maneira geral, o operador funciona muito bem para todos os tipos mencionados. A sobrecarga de operadores na linguagem C++ realizada escrevendo-se, inicialmente, uma definio de funo (contendo cabealho e corpo, normalmente). A regra para o nome da funo o primeiro detalhe: deve ser prefixada com a palavra operator, seguida do operador que ser sobrecarregado. Portanto, o nome da funo definida para sobrecarregar o operador de soma seria operator+. Analisando o cdigo da Listagem 7, verificamos que se trata de uma sobrecarga do operador de extrao de contedo de uma stream de entrada de dados (istream). Ou seja: estamos alterando o comportamento do operador >>, transformando o contedo lido na stream de entrada em um padro arbitrrio. Logo no cabealho, possvel percebermos que definida a assinatura da funo de sobrecarga. Esta funo recebe dois parmetros, sendo um do tipo istream e o segundo do tipo PhoneNumber. Este ltimo representa um contato telefnico. Ele ser lido e ter o seu contedo transformado para, ento, ser apresentado no console de sada. A implementao da funo, mais abaixo no cdigo da Listagem 7, apresenta exatamente a impresso dos dados de um contato telefnico, e na funo main() podemos observar a utilizao deste operador em sua verso modificada (sobrecarregada).
Listagem 1. Classe que representa os produtos.
p a c k a g eb r . c o m . a i n o s o f t . j m . d o m a i n ;

/ * * *E s t ac l a s s ed eo b j e t o sr e p r e s e n t au mp r o d u t o . * *@ a u t h o rp e d r o b r i g a t t o * / p u b l i cc l a s sP r o d u t o{

p r i v a t el o n gi d ; p r i v a t eS t r i n gn o m e ; p r i v a t eS t r i n gd e s c r i c a o ; p r i v a t eS t r i n gq r C o d e ; p r i v a t eS t r i n gb a r C o d e ; p r i v a t ef l o a tv a l o r U n i t a r i o ;

p u b l i cP r o d u t o ( l o n gi d ,S t r i n gn o m e ,S t r i n gd e s c r i c a o ,S t r i n gq r C o d e , S t r i n gb a r C o d e ,f l o a tv a l o r U n i t a r i o ){ s u p e r ( ) ; t h i s . i d=i d ; t h i s . n o m e=n o m e ; t h i s . d e s c r i c a o=d e s c r i c a o ; t h i s . q r C o d e=q r C o d e ; t h i s . b a r C o d e=b a r C o d e ; t h i s . v a l o r U n i t a r i o=v a l o r U n i t a r i o ; }

/ /m t o d o sp b l i c o sd ea c e s s o . . .

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

5/17

13/3/2014
}

DevMedia - Verso para impresso

Listagem 2. Definio do modelo genrico de acesso a dados.


p a c k a g eb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o ;

i m p o r tj a v a . u t i l . L i s t ;

i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r ta n d r o i d . d a t a b a s e . s q l i t e . S Q L i t e D a t a b a s e ; i m p o r tb r . c o m . a i n o s o f t . j m . s e r v i c e s . u t i l s . C o n s t a n t s ;

/ * * *E s t ac l a s s ed e f i n eoc o m p o r t a m e n t op a d r oq u et o d oo b j e t od ea c e s s oad a d o s *d e v et e r .P a r at a n t o ,u t i l i z a s ed eu m at c n i c ad ep o l i m o r f i s m od e n o m i n a d a *c o e r oo uc a s t i n g . * *@ a u t h o rp e d r o b r i g a t t o * / p u b l i ca b s t r a c tc l a s sG e n e r i c D A O{

p r o t e c t e dC o n t e x tc o n t e x t ; p r o t e c t e dS Q L i t e D a t a b a s ed b ; p r o t e c t e dD b H e l p e rd b H e l p e r ;

p u b l i cG e n e r i c D A O( C o n t e x tc o n t e x t ){ t h i s . c o n t e x t=c o n t e x t ; t h i s . d b H e l p e r=n e wD b H e l p e r ( c o n t e x t ,C o n s t a n t s . D A T A B A S E , n u l l , C o n s t a n t s . D A T A B A S E _ V E R S I O N ) ; t h i s . d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; }

/ /P a d r oc o m p o r t a m e n t a lp a r at o d oo b j e t od ea c e s s oad a d o s

p u b l i ca b s t r a c tb o o l e a ns a l v a r( O b j e c tr e g i s t r o ) ; p u b l i ca b s t r a c tb o o l e a na t u a l i z a r( O b j e c tr e g i s t r o ) ; p u b l i ca b s t r a c tb o o l e a ne x c l u i r( O b j e c tr e g i s t r o ) ; p u b l i ca b s t r a c tL i s t < O b j e c t >l i s t a r( S t r i n g. . .c r i t e r i o s ) ; p u b l i ca b s t r a c tL i s t < O b j e c t >l i s t a r T o d o s ( ) ; }

Listagem 3. Implementao do modelo de acesso a dados de produtos.


p a c k a g eb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o ;

i m p o r tj a v a . u t i l . L i s t ;

i m p o r ta n d r o i d . c o n t e n t . C o n t e n t V a l u e s ; i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r tb r . c o m . a i n o s o f t . j m . d o m a i n . P r o d u t o ;

/ * * *E s t ac l a s s ed eo b j e t o sc o n t mai m p l e m e n t a od oa c e s s ot a b e l ad e *p r o d u t o sn ob a n c od ed a d o sl o c a ld od i s p o s i t i v o .P a r at a n t o ,e s t e n d e *u mp a d r oc o m p o r t a m e n t a ld e f i n i d oe mu m ac l a s s ea b s t r a t a ,d a n d oc o r p o *at o d a sa sa t i v i d a d e se s t i p u l a d a sn om e s m o . *

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

6/17

13/3/2014
*@ a u t h o rp e d r o b r i g a t t o * /

DevMedia - Verso para impresso

p u b l i cc l a s sD a o P r o d u t oe x t e n d sG e n e r i c D A O{

p u b l i cs t a t i cf i n a lS t r i n gT A B E L A _ P R O D U T O S=" p r o d u t o s " ;

p u b l i cD a o P r o d u t o ( C o n t e x tc o n t e x t ){ s u p e r ( c o n t e x t ) ; }

@ O v e r r i d e p u b l i cb o o l e a ns a l v a r ( O b j e c tr e g i s t r o ){

i f( r e g i s t r oi n s t a n c e o fP r o d u t o ){

P r o d u t op r o d u t o=( P r o d u t o )r e g i s t r o ;

C o n t e n t V a l u e sv a l u e s=n e wC o n t e n t V a l u e s ( ) ; v a l u e s . p u t ( " i d " ,p r o d u t o . g e t I d ( ) ) ; v a l u e s . p u t ( " n o m e " ,p r o d u t o . g e t N o m e ( ) ) ; v a l u e s . p u t ( " d e s c r i c a o " ,p r o d u t o . g e t D e s c r i c a o ( ) ) ; v a l u e s . p u t ( " b a r c o d e " ,p r o d u t o . g e t B a r C o d e ( ) ) ; v a l u e s . p u t ( " q r c o d e " ,p r o d u t o . g e t Q r C o d e ( ) ) ; v a l u e s . p u t ( " v a l o r " ,p r o d u t o . g e t V a l o r U n i t a r i o ( ) ) ;

i f( d b . i n s e r t ( T A B E L A _ P R O D U T O S ,n u l l ,v a l u e s )>0 ){ r e t u r nt r u e ; } } r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cb o o l e a na t u a l i z a r ( O b j e c tr e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cb o o l e a ne x c l u i r ( O b j e c tr e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cL i s t < O b j e c t >l i s t a r ( S t r i n g . . .c r i t e r i o s ){ r e t u r nn u l l ; }

@ O v e r r i d e p u b l i cL i s t < O b j e c t >l i s t a r T o d o s ( ){ r e t u r nn u l l ; } }

Listagem 4. Exemplo de polimorfismo por coero na API do Android.


p a c k a g eb r . c o m . a i n o s o f t . j m ;

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

7/17

13/3/2014
i m p o r ta n d r o i d . a p p . A c t i v i t y ;

DevMedia - Verso para impresso

i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r ta n d r o i d . o s . B u n d l e ; i m p o r ta n d r o i d . v i e w . L a y o u t I n f l a t e r ; i m p o r ta n d r o i d . v i e w . V i e w ;

/ / E x e m p l od ar e c u p e r a od eu m av i e wap a r t i rd os e r v i oL a y o u t I n f l a t e r p u b l i cc l a s sJ a v a M a g a z i n e P o l i m o r f i s m o A c t i v i t ye x t e n d sA c t i v i t y{ / * *C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .* / @ O v e r r i d e p u b l i cv o i do n C r e a t e ( B u n d l es a v e d I n s t a n c e S t a t e ){ s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;

L a y o u t I n f l a t e ri n f l a t e r=( L a y o u t I n f l a t e r ) g e t S y s t e m S e r v i c e ( C o n t e x t . L A Y O U T _ I N F L A T E R _ S E R V I C E ) ;

V i e wm a i n V i e w=i n f l a t e r . i n f l a t e ( R . l a y o u t . m a i n ,n u l l ) ; s e t C o n t e n t V i e w ( m a i n V i e w ) ; } }

Listagem 5. Exemplo de sobrecarga de mtodos na API do Android.


p a c k a g eb r . c o m . a i n o s o f t . j m ;

i m p o r ta n d r o i d . a p p . A c t i v i t y ; i m p o r ta n d r o i d . o s . B u n d l e ;

/ / P r i m e i r oe x e m p l od es o b r e c a r g a :p a r m e t r of o r n e c i d ou mi n t e i r o p u b l i cc l a s sJ a v a M a g a z i n e P o l i m o r f i s m o A c t i v i t ye x t e n d sA c t i v i t y{

/ * *C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .* / @ O v e r r i d e p u b l i cv o i do n C r e a t e ( B u n d l es a v e d I n s t a n c e S t a t e ){ s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . m a i n ) ; } }

/ / p a c k a g eb r . c o m . a i n o s o f t . j m ;

i m p o r ta n d r o i d . a p p . A c t i v i t y ; i m p o r ta n d r o i d . o s . B u n d l e ; i m p o r ta n d r o i d . v i e w . V i e w ;

/ / S e g u n d oe x e m p l od es o b r e c a r g a :p a r m e t r of o r n e c i d ou mo b j e t oV i e w p u b l i cc l a s sJ a v a M a g a z i n e P o l i m o r f i s m o A c t i v i t ye x t e n d sA c t i v i t y{

/ * *C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .* / @ O v e r r i d e p u b l i cv o i do n C r e a t e ( B u n d l es a v e d I n s t a n c e S t a t e ){ s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;

V i e wc o n t e n t=n e wV i e w ( t h i s ) ; / /M o n t a s eoo b j e t oV i e wq u ed e v es e rc a r r e g a d on aa t i v i d a d e . s e t C o n t e n t V i e w ( c o n t e n t ) ;

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

8/17

13/3/2014
} }

DevMedia - Verso para impresso

Listagem 6. Exemplo de sobrecarga de operadores (uso).


p a c k a g eb r . c o m . a i n o s o f t . j m ;

i m p o r ta n d r o i d . a p p . A c t i v i t y ; i m p o r ta n d r o i d . o s . B u n d l e ; i m p o r ta n d r o i d . u t i l . L o g ;

p u b l i cc l a s sJ a v a M a g a z i n e P o l i m o r f i s m o A c t i v i t ye x t e n d sA c t i v i t y{

/ * *C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .* / @ O v e r r i d e p u b l i cv o i do n C r e a t e ( B u n d l es a v e d I n s t a n c e S t a t e ){ s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . m a i n ) ;

L o g . i ( " [ J a v a M a g a z i n e ] " ," E s t eu me x e m p l od e "+ " s o b r e c a r g ad oo p e r a d o rd es o m am u i t o "+ " u t i l i z a d oe mJ a v a " ) ; } }

Listagem 7. Exemplo de sobrecarga de operadores - C++ (criao).


# i n c l u d e< i o s t r e a m >

u s i n gs t d : : c o u t ; u s i n gs t d : : c i n ; u s i n gs t d : e n d l ; u s i n gs t d : : o s t r e a m ; u s i n gs t d : i s t r e a m ;

# i n c l u d e< i o m a n i p >

u s i n gs t d : : s e t w ;

c l a s sP h o n e N u m b e r{

/ /C a b e a l h od af u n od es o b r e c a r g ad oo p e r a d o rd ei n s e r oe m / /u m as t r e a md es a d a( f u n on om e m b r o ) f r i e n do s t r e a m& o p e r a t o r < <( o s t r e a m & ,c o n s tP h o n e N u m b e r& ) ;

/ /C a m p o sq u ed e f i n e m ,r e s p e c t i v a m e n t e : / / 1 .c d i g od e r e a / / 2 .n m e r od ac e n t r a l / / 3 .n m e r od al i n h a p r i v a t e: c h a ra r e a C o d e[ 4 ] ; c h a re x c h a n g e[ 4 ] ; c h a rl i n e[ 5 ] ; }

o s t r e a m& o p e r a t o r < <( o s t r e a m& o u t p u t ,c o n s tP h o n e N u m b e r& n u m ){

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

9/17

13/3/2014

DevMedia - Verso para impresso


o u t p u t< <" ( "< <n u m . a r e a C o d e< <" )"< <n u m . e x c h a n g e< <" "< <n u m . l i n e ; r e t u r no u t p u t ; }

i n tm a i n( ){

P h o n e N u m b e rp h o n e ;

/ /A q u iu t i l i z a m o sas o b r e c a r g ap a r at r a b a l h a rc o md a d o sd e / /c o n t a t o st e l e f n i c o s c o u t< <" On m e r od ot e l e f o n ed i g i t a d of o i"< <p h o n e< <e n d l ; r e t u r n0 ; } }

O polimorfismo universal
At aqui, falamos apenas sobre as abordagens ad hoc de polimorfismo. Vamos, a partir de agora, estudar os dois modelos classificados como universais, que so a parametrizao e a incluso. Polimorfismo por parametrizao O polimorfismo por parametrizao baseia-se, como o prprio nome sugere, em parmetros genricos para a definio de templates que sero, depois, redefinidos em implementaes especficas, em que os parmetros estabelecidos daro espao a tipos concretos. Para exemplificar, observe as Listagens 8 e 9. Desde a verso 5, conhecida sob o apelido de Tiger, a API do Java traz um recurso extremamente til conhecido como Generics. Este importante recurso utiliza massivamente a tcnica de polimorfismo por parametrizao, e uma das formas mais simples de enxergar sua utilizao na API atravs do Java Collections Framework. A Listagem 8 traz um exemplo de uso da interface java.util.List, que no modelo genrico de acesso a dados declarada de forma a trabalhar com elementos do tipo T. J na implementao do acesso a dados de produtos (especializao), que pode ser observada na Listagem 9, este parmetro T d lugar ao tipo Produto. Existe, ainda nestas duas listagens, um exemplo claro do segundo tipo de polimorfismo por incluso, em que inicialmente define-se uma coleo por uma interface e, posteriormente, em tempo de instanciao, substitui-se o tipo genrico (java.util.List) por uma de suas implementaes (java.util.ArrayList). Falaremos sobre incluso em breve.
Listagem 8. Definio do modelo de acesso a dados usando parametrizao
p a c k a g eb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o ;

i m p o r tj a v a . u t i l . L i s t ;

i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r ta n d r o i d . d a t a b a s e . s q l i t e . S Q L i t e D a t a b a s e ; i m p o r tb r . c o m . a i n o s o f t . j m . s e r v i c e s . u t i l s . C o n s t a n t s ;

/ * * *C l a s s ed eo b j e t o sq u em a n i p u l a mi n f o r m a e se mb a n c od ed a d o s . *E s t ac l a s s ee m p r e g aat c n i c ad e n o m i n a d ap a r a m e t r i z a o ,q u ee mJ a v as e *m a n i f e s t ad ef o r m ab e md i r e t an oc o n c e i t oc o n h e c i d oc o m oG e n e r i c s .

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

10/17

13/3/2014
* *@ a u t h o rp e d r o b r i g a t t o * /

DevMedia - Verso para impresso

p u b l i ca b s t r a c tc l a s sG e n e r i c D a o P a r a m< T >{

p r o t e c t e dC o n t e x tc o n t e x t ; p r o t e c t e dS Q L i t e D a t a b a s ed b ; p r o t e c t e dD b H e l p e rd b H e l p e r ;

p u b l i cG e n e r i c D a o P a r a m( C o n t e x tc o n t e x t ){ t h i s . c o n t e x t=c o n t e x t ; t h i s . d b H e l p e r=n e wD b H e l p e r ( c o n t e x t ,C o n s t a n t s . D A T A B A S E , n u l l ,C o n s t a n t s . D A T A B A S E _ V E R S I O N ) ; t h i s . d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; }

/ /C o n t r a t oq u ed e v es e rs e g u i d op o ro b j e t o sd ea c e s s oad a d o s p u b l i ca b s t r a c tb o o l e a ns a l v a r( Tr e g i s t r o ) ; p u b l i ca b s t r a c tb o o l e a na t u a l i z a r( Tr e g i s t r o ) ; p u b l i ca b s t r a c tb o o l e a ne x c l u i r( Tr e g i s t r o ) ; p u b l i ca b s t r a c tL i s t < T >l i s t a r( S t r i n g. . .c r i t e r i o s ) ; p u b l i ca b s t r a c tL i s t < T >l i s t a r T o d o s ( ) ; }

Listagem 9. Implementao do acesso a dados de produtos por parametrizao.


p a c k a g eb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o ;

i m p o r tj a v a . u t i l . L i s t ;

i m p o r ta n d r o i d . c o n t e n t . C o n t e n t V a l u e s ; i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r tb r . c o m . a i n o s o f t . j m . d o m a i n . P r o d u t o ;

p u b l i cc l a s sD a o P r o d u t o P a r a me x t e n d sG e n e r i c D a o P a r a m{

p u b l i cs t a t i cf i n a lS t r i n gT A B E L A _ P R O D U T O S=" p r o d u t o s " ;

p u b l i cD a o P r o d u t o P a r a m ( C o n t e x tc o n t e x t ){ s u p e r ( c o n t e x t ) ; }

@ O v e r r i d e p u b l i cb o o l e a ns a l v a r ( P r o d u t or e g i s t r o ){

C o n t e n t V a l u e sv a l u e s=n e wC o n t e n t V a l u e s ( ) ; v a l u e s . p u t ( " i d " ,r e g i s t r o . g e t I d ( ) ) ; v a l u e s . p u t ( " n o m e " ,r e g i s t r o . g e t N o m e ( ) ) ; v a l u e s . p u t ( " d e s c r i c a o " ,r e g i s t r o . g e t D e s c r i c a o ( ) ) ; v a l u e s . p u t ( " b a r c o d e " ,r e g i s t r o . g e t B a r C o d e ( ) ) ; v a l u e s . p u t ( " q r c o d e " ,r e g i s t r o . g e t Q r C o d e ( ) ) ; v a l u e s . p u t ( " v a l o r " ,r e g i s t r o . g e t V a l o r U n i t a r i o ( ) ) ;

i f( d b . i n s e r t ( T A B E L A _ P R O D U T O S ,n u l l ,v a l u e s )>0 ){ r e t u r nt r u e ; } r e t u r nf a l s e ;

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

11/17

13/3/2014
}

DevMedia - Verso para impresso

@ O v e r r i d e p u b l i cb o o l e a na t u a l i z a r ( P r o d u t or e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cb o o l e a ne x c l u i r ( P r o d u t or e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cL i s tl i s t a r ( S t r i n g . . .c r i t e r i o s ){ r e t u r nn u l l ; }

@ O v e r r i d e p u b l i cL i s tl i s t a r T o d o s ( ){ r e t u r nn u l l ; } }

Pelo cdigo possvel perceber que utilizamos um parmetro genrico, de nome T. Toda a definio do padro comportamental da classe GenericDaoParam ter sua base em funo deste tipo. E por que T? Na documentao do recurso de Generics em Java, apresentada uma conveno para definio dos tipos de parmetros. A Tabela 2 mostra um resumo dos tipos utilizados, com uma breve descrio a respeito deles.

[abrir im age m e m jane la]

Tabela 2. Conveno para tipos de parmetros.

J na implementao do contrato definido na classe GenericDaoParam para a manipulao de produtos, atravs da classe intitulada DaoProdutoParam, o tipo genrico T substitudo pelo tipo concreto Produto, o mesmo utilizado no exemplo de polimorfismo por coero. Quando isso feito, todos os mtodos que foram definidos a partir deste tipo genrico so automaticamente redefinidos para trabalhar com o tipo concreto utilizado. Ou seja: em um primeiro momento, na definio de um contrato genrico, trabalhamos com um parmetro igualmente genrico, que substitudo por um tipo concreto quando o contrato implementado. Polimorfismo por incluso Vamos ltima tcnica de polimorfismo, a segunda das tcnicas consideradas universais. O
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 12/17

13/3/2014

DevMedia - Verso para impresso

nome desta tcnica Incluso, e comearemos da mesma maneira que vimos todas as outras: um exemplo prtico de uso. Analise a Listagem 10, que nos traz um exemplo de implementao usando o recurso de incluso. J a Listagem 11 traz um exemplo de uso de incluso dentro da prpria API do Android. Mas voltemos, neste instante, Listagem 10. Pelo cdigo da atividade intitulada JavaMagazinePolimorfismoActivity, podemos perceber a declarao de um atributo chamado dao, de um tipo genrico GenericDAO. Esta uma classe que j analisamos neste artigo, que se utiliza da tcnica de polimorfismo por coero para representar genericamente objetos de acesso a dados em bancos de dados. Entretanto, sabemos que no podemos criar instncias de tipos abstratos, sejam estes classes abstratas ou interfaces. Portanto, em tempo de execuo, tudo o que temos so sempre objetos. Ainda na classe JavaMagazinePolimorfismoActivity, verificamos que o objeto criado do tipo DaoProduto, e a varivel dao quem fica responsvel por guardar a referncia para o objeto. Permite-se, na hierarquia estabelecida entre as classes GenericDAO e DaoProduto, que um objeto de acesso a dados de produtos seja tratado como um objeto de acesso a dados genrico, pelo conceito de generalizao/especializao do paradigma orientado a objetos. Isto quer dizer, em outras palavras, que esto includos na definio de um objeto genrico de acesso a dados (representados pela classe GenericDAO) qualquer tipo especialista desta classe, que o caso de DaoProduto. E disso que o polimorfismo por incluso trata. Esta tcnica de polimorfismo usada intensamente em inmeros frameworks conhecidos no mercado. Praticamente toda biblioteca baseia-se em interfaces, que expem padres de comportamento e constantes conhecidas por ela e que devem ser seguidos por implementaes que desejem utilizar seus recursos e suas funcionalidades. o que podemos chamar de protocolos de comunicao para estabelecer contato entre camadas, mdulos e sistemas. Tomando novamente por exemplo a prpria API do Android, vamos analisar um de seus elementos centrais: android.content.Context. Em diferentes nveis, os componentes mais importantes de sua arquitetura estendem esta classe. A Tabela 3 descreve algumas delas, e seu papel central.

[abrir im age m e m jane la]

Tabela 3. Componentes que herdam o padro de android.content.Context.

Portanto, pelo princpio da incluso, poderamos guardar, em uma varivel do tipo android.content.Context, uma referncia para objetos de qualquer um desses tipos apresentados na Tabela 3. Desta forma, reduzimos a quantidade de memria a ser alocada para cada instncia da classe que estamos desenvolvendo, uma vez que estamos trabalhando, atravs de uma varivel nica, com instncias de tipos diferentes em pontos diferentes do cdigo. Muitas vezes podemos observar - e incluir em nossas implementaes - a utilizao conjunta das tcnicas de incluso e parametrizao. Verifique, nas Listagens 12 e 13, uma situao em
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 13/17

13/3/2014

DevMedia - Verso para impresso

que isto se aplica. Pelo cdigo, podemos observar a definio de um template para todo objeto de acesso a dados, j exibido na Listagem 8 deste artigo, que utiliza parmetros genricos (do tipo T) para acomodar qualquer tipo de objeto desejado. J na especializao deste template para o caso particular de produtos, verificamos a criao de uma instncia que representa a lista de produtos a ser alimentada e, em seguida, retornada.
Listagem 10. Exemplo de polimorfismo por incluso.
p a c k a g eb r . c o m . a i n o s o f t . j m ;

i m p o r ta n d r o i d . a p p . A c t i v i t y ; i m p o r ta n d r o i d . o s . B u n d l e ; i m p o r tb r . c o m . a i n o s o f t . j m . d o m a i n . P r o d u t o ; i m p o r tb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o . D a o P r o d u t o ; i m p o r tb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o . G e n e r i c D A O ;

p u b l i cc l a s sJ a v a M a g a z i n e P o l i m o r f i s m o A c t i v i t ye x t e n d sA c t i v i t y{

p r i v a t eG e n e r i c D A Od a o ;

/ * *C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .* / @ O v e r r i d e p u b l i cv o i do n C r e a t e ( B u n d l es a v e d I n s t a n c e S t a t e ){ s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . m a i n ) ;

P r o d u t op r o d u t o=n e wP r o d u t o ( " P r o d u t oA B C " ) ; p r o d u t o . s e t Q r C o d e ( " E C L 1 0 9 2 1 2 " ) ; p r o d u t o . s e t D e s c r i c a o ( " P r o d u t of i c t c i o " ) ; p r o d u t o . s e t V a l o r U n i t a r i o ( 1 0 . 5 3 f ) ;

d a o=n e wD a o P r o d u t o ( t h i s ) ; d a o . s a l v a r ( p r o d u t o ) ; } }

Listagem 11. Exemplo de polimorfismo por incluso na biblioteca do Android.


p a c k a g eb r . c o m . a i n o s o f t . j m ;

i m p o r ta n d r o i d . a p p . A c t i v i t y ; i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r ta n d r o i d . o s . B u n d l e ; i m p o r ta n d r o i d . u t i l . L o g ; i m p o r tb r . c o m . a i n o s o f t . j m . s e r v i c e s . J M S e r v i c e ;

p u b l i cc l a s sJ a v a M a g a z i n e P o l i m o r f i s m o A c t i v i t ye x t e n d sA c t i v i t y{

p r i v a t eC o n t e x tc o n t e x t ;

/ * *C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .* / @ O v e r r i d e p u b l i cv o i do n C r e a t e ( B u n d l es a v e d I n s t a n c e S t a t e ){ s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

14/17

13/3/2014
s e t C o n t e n t V i e w ( R . l a y o u t . m a i n ) ;

DevMedia - Verso para impresso

L o g . i ( " [ J a v a M a g a z i n e ] " ," E s t eu me x e m p l od e "+ " s o b r e c a r g ad oo p e r a d o rd es o m am u i t o "+ " u t i l i z a d oe mJ a v a " ) ;

/ /V e r i f i q u eq u ee s t a m o su s a n d ou m av a r i v e lt i p a d ac o m o / /a n d r o i d . c o n t e n t . C o n t e x tp a r ag u a r d a ru m ar e f e r n c i ap a r au m a / /i n s t n c i ad aa p l i c a o( a n d r o i d . a p p . A p p l i c a t i o n ) c o n t e x t=g e t A p p l i c a t i o n ( ) ;

/ /V e r i f i q u e ,a g o r a ,q u ee s t a m o su s a n d oam e s m av a r i v e lt i p a d a / /c o m oa n d r o i d . c o n t e n t . C o n t e x tp a r ag u a r d a ru m ar e f e r n c i ap a r a / /u m ai n s t n c i ad eu ms e r v i o( a n d r o i d . a p p . S e r v i c e ) c o n t e x t=n e wJ M S e r v i c e ( ) ;

} }

Listagem 12. Exemplo mesclando as tcnicas de incluso e parametrizao.


p a c k a g eb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o ;

i m p o r tj a v a . u t i l . L i s t ;

i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r ta n d r o i d . d a t a b a s e . s q l i t e . S Q L i t e D a t a b a s e ; i m p o r tb r . c o m . a i n o s o f t . j m . s e r v i c e s . u t i l s . C o n s t a n t s ;

/ * * *C l a s s ed eo b j e t o sq u em a n i p u l a mi n f o r m a e se mb a n c od ed a d o s . *E s t ac l a s s ee m p r e g aat c n i c ad e n o m i n a d ap a r a m e t r i z a o ,q u ee mJ a v as e *m a n i f e s t ad ef o r m ab e md i r e t an oc o n c e i t oc o n h e c i d oc o m oG e n e r i c s . * *@ a u t h o rp e d r o b r i g a t t o * / p u b l i ca b s t r a c tc l a s sG e n e r i c D a o P a r a m< T >{

p r o t e c t e dC o n t e x tc o n t e x t ; p r o t e c t e dS Q L i t e D a t a b a s ed b ; p r o t e c t e dD b H e l p e rd b H e l p e r ;

p u b l i cG e n e r i c D a o P a r a m( C o n t e x tc o n t e x t ){ t h i s . c o n t e x t=c o n t e x t ; t h i s . d b H e l p e r=n e wD b H e l p e r ( c o n t e x t , C o n s t a n t s . D A T A B A S E , n u l l , C o n s t a n t s . D A T A B A S E _ V E R S I O N ) ; t h i s . d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; }

p u b l i ca b s t r a c tb o o l e a ns a l v a r( Tr e g i s t r o ) ; p u b l i ca b s t r a c tb o o l e a na t u a l i z a r( Tr e g i s t r o ) ; p u b l i ca b s t r a c tb o o l e a ne x c l u i r( Tr e g i s t r o ) ; p u b l i ca b s t r a c tL i s t < T >l i s t a r( S t r i n g. . .c r i t e r i o s ) ; p u b l i ca b s t r a c tL i s t < T >l i s t a r T o d o s ( ) ; }

Listagem 13. Exemplo mesclando as tcnicas de incluso e parametrizao.


http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 15/17

13/3/2014

DevMedia - Verso para impresso


p a c k a g eb r . c o m . a i n o s o f t . j m . s e r v i c e s . d a o ;

i m p o r tj a v a . u t i l . A r r a y L i s t ; i m p o r tj a v a . u t i l . L i s t ;

i m p o r ta n d r o i d . c o n t e n t . C o n t e x t ; i m p o r tb r . c o m . a i n o s o f t . j m . d o m a i n . P r o d u t o ;

p u b l i cc l a s sD a o P r o d u t o P a r a me x t e n d sG e n e r i c D a o P a r a m < P r o d u t o >{

p u b l i cs t a t i cf i n a lS t r i n gT A B E L A _ P R O D U T O S=" p r o d u t o s " ;

p u b l i cD a o P r o d u t o P a r a m ( C o n t e x tc o n t e x t ){ s u p e r ( c o n t e x t ) ; }

@ O v e r r i d e p u b l i cb o o l e a ns a l v a r ( P r o d u t or e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cb o o l e a na t u a l i z a r ( P r o d u t or e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cb o o l e a ne x c l u i r ( P r o d u t or e g i s t r o ){ r e t u r nf a l s e ; }

@ O v e r r i d e p u b l i cL i s t < P r o d u t o >l i s t a r ( S t r i n g . . .c r i t e r i o s ){ r e t u r nn u l l ; }

@ O v e r r i d e p u b l i cL i s t < P r o d u t o >l i s t a r T o d o s ( ){

L i s t < P r o d u t o >p r o d u t o s=n e wA r r a y L i s t < P r o d u t o > ( ) ;

/ /r e c u p e r a s eo sp r o d u t o sd ob a n c od ed a d o s

r e t u r np r o d u t o s ; } }

Pelo cdigo, podemos observar o uso alternado dos tipos genrico e especialista, bem como o uso de parametrizao e posterior substituio do parmetro pelo tipo especfico (Produto). Isto permite uma flexibilidade muito grande dentro de projetos orientados a objetos, uma legibilidade visivelmente maior e, consequentemente, uma manutenibilidade extremamente facilitada.

Concluses
Chegamos ao final deste artigo. Ao longo de todo o texto, pudemos verificar todos os tipos
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781 16/17

13/3/2014

DevMedia - Verso para impresso

existentes de polimorfismo, bem como exemplos de aplicao de cada um deles. imprescindvel, para todo bom desenvolvedor de software, ter este conceito muito bem compreendido (bem como todos os outros relacionados ao paradigma de desenvolvimento orientado a objetos), pois isto permitir uma absoro muito mais rpida de muitos frameworks existentes no mercado, que aplicam fortemente tcnicas como coero, parametrizao e incluso. Um sistema que utiliza corretamente tcnicas polimrficas ser sempre um sistema mais legvel, padronizado, escalvel e flexvel, tornando sua manuteno e evoluo facilitadas.

Pedro E. Cunha Brigatto


Engenheiro da Computao graduado pela Universidade Federal de So Carlos, desenvolvedor certificado SAP Netweaver (Java Stack) e possui a certificao SCJP. Especialista em Engenharia de Software graduado pela Unimep e ps-graduado em Administrao pela Fundao BI-FGV, atua com desenvolvimento de software desde 2005. Atualmente desempenha o papel de arquiteto de software na Ci&T apoiando projetos plataformas como SUP, Afaria, Android e BlackBerry, sendo tambm proprietrio da empresa ainosoft e professor universitrio nas Faculdades Integradas Einstein, na cidade de Limeira.

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=6&artigo=4781&revista=impressao_106#a-4781

17/17

Anda mungkin juga menyukai