Você está na página 1de 14

22/04/13

Meus cursos

MEUS CURSOS

38

COMUNIDADE

Sabrina

Pontos

14640

Meus cursos // FJ-17


Revisitando a Orientao a Objetos Aula Atividades Dvidas?

Apagar as luzes

Acender as luzes

Explicao

O que voc entende por Orientao a Objetos?


Quantas vezes nos deparamos no dia a dia com aquele pedao de cdigo, aquele arquivo gigante, difcil de entender e, portanto, quase impossvel de modificar? ? 1 2 3 4 5 6 7 8 9
online.caelum.com.br/course/FJ-17/section/1 1/14

p u b l i cc l a s sC a d a s t r o{ 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 gc p f ; p r i v a t eS t r i n gc n p j ; p r i v a t eb o o l e a np e s s o a F i s i c a ; p u b l i cb o o l e a np r o c e s s a ( S t r i n ga c a o ,S t r i n gt i p o ,S t r i n gn o m e ,

22/04/13

Meus cursos

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 } } } b=0 ; c=1 1 ; } e l s e{ a [ 9 ]=1 1 x ; } i n tx = b % 1 1 ; i f ( x<2 ){ a [ 9 ]=0 ; } i f ( c p f! =n u l l ){ S t r i n ge r r o=" " ;

S t r i n gc p f ,S t r i n gc n p j ){

i f( c p f . l e n g t h ( )<1 1 ) e r r o+ =" S a on e c e s s a r i o s1 1d i g i t o sp a r av e r i f i c a c a od oC P F !\ n \ n " ; i f ( c p f . m a t c h e s ( " . * \ \ D . * " ) ) e r r o+ =" Av e r i f i c a c a od eC P Fs u p o r t aa p e n a sn u m e r o s !\ n \ n " ; i f ( c p f= =" 0 0 0 0 0 0 0 0 0 0 0 "| |c p f= =" 1 1 1 1 1 1 1 1 1 1 1 "| | c p f= =" 2 2 2 2 2 2 2 2 2 2 2 "| |c p f= =" 3 3 3 3 3 3 3 3 3 3 3 "| | c p f= =" 4 4 4 4 4 4 4 4 4 4 4 "| |c p f= =" 5 5 5 5 5 5 5 5 5 5 5 "| | c p f= =" 6 6 6 6 6 6 6 6 6 6 6 "| |c p f= =" 7 7 7 7 7 7 7 7 7 7 7 "| | c p f= =" 8 8 8 8 8 8 8 8 8 8 8 "| |c p f= =" 9 9 9 9 9 9 9 9 9 9 9 " ){ e r r o+ =" N u m e r od eC P Fi n v a l i d o ! " ; i n t [ ]a=n e wi n t [ 1 1 ] ; i n tb = 0 ; i n tc = 1 1 ; f o r ( i n ti = 0 ;i<1 1 ;i + + ){ a [ i ]=c p f . c h a r A t ( i )-' 0 ' ; i f ( i<9 )b+ =( a [ i ]*c ) ;

f o r ( i n ty = 0 ;y<1 0 ;y + + )b+ =( a [ y ]*c ) ; x=b%1 1 ; i f ( x<2 ){ a [ 1 0 ]=0 ; } e l s e{ a [ 1 0 ]=1 1 x ; } i f ( ( c p f . c h a r A t ( 9 )-' 0 '! =a [ 9 ] )| |( c p f . c h a r A t ( 1 0 )-' 0 '! =a [ 1 0 ] ) ){ e r r o+ = " D i g i t ov e r i f i c a d o rc o mp r o b l e m a ! " ; } i f ( e r r o . l e n g t h ( )>0 ){ r e t u r nf a l s e ;

online.caelum.com.br/course/FJ-17/section/1

2/14

22/04/13

Meus cursos

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

i f ( " c a d a s t r a " . e q u a l s ( a c a o ) ){ i f ( " p e s s o a _ f i s i c a " . e q u a l s ( t i p o ) ){ i f ( c n p j! =n u l l ){ r e t u r nf a l s e ; } e l s e{ t h i s . n o m e=n o m e ; t h i s . c p f=c p f ; t h i s . p e s s o a F i s i c a=t r u e ; } } e l s ei f( " p e s s o a _ j u r i d i c a " . e q u a l s ( t i p o ) ){ i f ( c p f! =n u l l ){ r e t u r nf a l s e ; } e l s e{ t h i s . n o m e=n o m e ; t h i s . c n p j=c n p j ; t h i s . p e s s o a F i s i c a=f a l s e ; } } } e l s ei f ( " a t u a l i z a " . e q u a l s ( a c a o ) ){ i f ( " p e s s o a _ f i s i c a " . e q u a l s ( t i p o ) ){ i f ( c n p j! =n u l l ){ r e t u r nf a l s e ; } e l s e{ t h i s . n o m e=n o m e ; t h i s . c p f=c p f ; t h i s . p e s s o a F i s i c a=t r u e ; } } e l s ei f( " p e s s o a _ j u r i d i c a " . e q u a l s ( t i p o ) ){ i f ( c p f! =n u l l ){ r e t u r nf a l s e ; } e l s e{ t h i s . n o m e=n o m e ; t h i s . c n p j=c n p j ; t h i s . p e s s o a F i s i c a=f a l s e ; } } }

online.caelum.com.br/course/FJ-17/section/1

3/14

22/04/13

Meus cursos

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 } } } } }

r e t u r nf a l s e ;

p u b l i cS t r i n gg e t N o m e ( ){ r e t u r nn o m e ;

p u b l i cv o i ds e t N o m e ( S t r i n gn o m e ){ t h i s . n o m e=n o m e ;

p u b l i cS t r i n gg e t C p f ( ){ r e t u r nc p f ; } p u b l i cv o i ds e t C p f ( S t r i n gc p f ){ t h i s . c p f=c p f ; } p u b l i cS t r i n gg e t C n p j ( ){ r e t u r nc n p j ; } p u b l i cv o i ds e t C n p j ( S t r i n gc n p j ){ t h i s . c n p j=c n p j ;

p u b l i cb o o l e a ni s P e s s o a F i s i c a ( ){ r e t u r np e s s o a F i s i c a ;

p u b l i cv o i ds e t P e s s o a F i s i c a ( b o o l e a np e s s o a F i s i c a ){ t h i s . p e s s o a F i s i c a=p e s s o a F i s i c a ; } }

No precisamos ir muito longe para encontrarmos mais de um desses arquivos em um mesmo projeto. Ele o motivo de piada nas nossas conversas durante os almoos e eventos, mas por que eles continuam aparecendo no nosso dia a dia? Boas prticas de OO servem para diminuir os efeitos negativos de um cdigo mal estruturado. Facilitam sua manuteno e adaptao medida que precisamos adicionar funcionalidades ou alterar o comportamento do sistema. Tomemos como exemplo um sistema de controle financeiro de uma empresa. Nesse sistema, teremos uma classe
online.caelum.com.br/course/FJ-17/section/1 4/14

22/04/13

Meus cursos

para representar uma dvida. Nossa classe D i v i d adeve armazenar o credor (para quem a empresa est devendo), o CNPJ desse credor, o valor total da dvida e o seu valor j pago. Como todo tutorial de Orientao a Objetos, a prtica comum criar a classe com seus getters e setters: ? 1 p u b l i cc l a s sD i v i d a{ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 } } } p u b l i cv o i ds e t C n p j C r e d o r ( S t r i n gc n p j C r e d o r ){ t h i s . c n p j C r e d o r=c n p j C r e d o r ; } p u b l i cS t r i n gg e t C n p j C r e d o r ( ){ r e t u r nt h i s . c n p j C r e d o r ; } p u b l i cv o i ds e t C r e d o r ( S t r i n gc r e d o r ){ t h i s . c r e d o r=c r e d o r ; } p u b l i cv o i ds e t T o t a l ( d o u b l et o t a l ){ t h i s . t o t a l=t o t a l ; } p u b l i cd o u b l eg e t V a l o r P a g o ( ){ r e t u r nt h i s . v a l o r P a g o ; } p u b l i cv o i ds e t V a l o r P a g o ( d o u b l ev a l o r P a g o ){ t h i s . v a l o r P a g o=v a l o r P a g o ; } p u b l i cS t r i n gg e t C r e d o r ( ){ r e t u r nt h i s . c r e d o r ; p u b l i cd o u b l eg e t T o t a l ( ){ r e t u r nt h i s . t o t a l ; p r i v a t ed o u b l et o t a l ; p r i v a t ed o u b l ev a l o r P a g o ; p r i v a t eS t r i n gc r e d o r ; p r i v a t eS t r i n gc n p j C r e d o r ;

Essa classe utilizada pelo B a l a n c o E m p r e s apara registrar e atualizar dvidas. O mtodo que registra dvidas cria uma instncia de D i v i d a , preenche o valor, os dados do credor e guarda essa dvida num mapa em que a chave o CNPJ do credor. ? 1 p u b l i cc l a s sB a l a n c o E m p r e s a{ 2 p r i v a t eH a s h M a p < S t r i n g ,D i v i d a >d i v i d a s=n e wH a s h M a p < S t r i n g ,D i v i d a > ( ) ;
5/14

online.caelum.com.br/course/FJ-17/section/1

22/04/13

Meus cursos

3 4 5 6 7 8 9 10 11} } p u b l i cv o i dr e g i s t r a D i v i d a ( S t r i n gc r e d o r ,S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ){ D i v i d ad i v i d a=n e wD i v i d a ( ) ; d i v i d a . s e t T o t a l ( v a l o r ) ; d i v i d a . s e t C r e d o r ( c r e d o r ) ; d i v i d a . s e t C n p j C r e d o r ( c n p j C r e d o r ) ; d i v i d a s . p u t ( c n p j C r e d o r ,d i v i d a ) ;

Temos tambm um mtodo que paga parte de uma dvida. Ele recebe o CNPJ de um credor e o valor que foi pago, busca a D i v i d acorrespondente no banco usando o CNPJ do credor e a atualiza. ? 1p u b l i cv o i dp a g a D i v i d a ( S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ){ 2 3 4 5 6} } D i v i d ad i v i d a=d i v i d a s . g e t ( c n p j C r e d o r ) ; i f( d i v i d a! =n u l l ){ d i v i d a . s e t V a l o r P a g o ( d i v i d a . g e t V a l o r P a g o ( )+v a l o r ) ;

Imagine que a empresa tem um outro sistema s para gerenciar as dvidas. Ele possui a classe G e r e n c i a d o r D e D i v i d a s , que tem um mtodo que tambm permite pagar uma dvida: ? 1p u b l i cc l a s sG e r e n c i a d o r D e D i v i d a s{ 2 3 4 5 6 7} / /o u t r o sm t o d o s } p u b l i cv o i de f e t u a P a g a m e n t o ( D i v i d ad i v i d a ,d o u b l ev a l o r ){ d i v i d a . s e t V a l o r P a g o ( d i v i d a . g e t V a l o r P a g o ( )+v a l o r ) ;

Agora alteramos o valor pago de uma dvida em dois lugares. Ser que isso ruim? Suponha que precisamos descontar uma taxa de R$ 8 dos pagamentos de dvida maiores que R$ 100. Ou seja, se o pagamento de R$ 200 o pagamento real de R$ 192. Se o pagamento de R$ 40 o pagamento real tambm de R$ 40. Em quantos lugares precisaremos mexer? Dois: ? 1 p u b l i cc l a s sB a l a n c o E m p r e s a{ 2 3 4 p u b l i cv o i dp a g a D i v i d a ( S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ){ D i v i d ad i v i d a=d i v i d a s . g e t ( c n p j C r e d o r ) ; i f( d i v i d a! =n u l l ){
6/14

online.caelum.com.br/course/FJ-17/section/1

22/04/13

Meus cursos

5 6 7 8 9 10 11} } }

i f( v a l o r>1 0 0 ){ v a l o r=v a l o r-8 ; } d i v i d a . s e t V a l o r P a g o ( d i v i d a . g e t V a l o r P a g o ( )+v a l o r ) ;

? 1p u b l i cc l a s sG e r e n c i a d o r D e D i v i d a s{ 2 3 4 5 6 7 8} } } d i v i d a . s e t V a l o r P a g o ( d i v i d a . g e t V a l o r P a g o ( )+v a l o r ) ; p u b l i cv o i de f e t u a P a g a m e n t o ( D i v i d ad i v i d a ,d o u b l ev a l o r ){ i f( v a l o r>1 0 0 ){ v a l o r=v a l o r-8 ;

No nosso caso j so dois pontos de utilizao, e poderiam ser muito mais! Como ter certeza que no h outros pontos do cdigo que tambm usavam a varivel diretamente? Ou em projetos de terceiros que usam o nosso como biblioteca? O problema que temos dados (valor pago da dvida) separados de comportamento (pagamento da dvida). Vemos que a classe D i v i d a burra: ela no faz nada, somente armazena valores; ela uma estrutura de dados. Para juntarmos os dados e o comportamento, vamos criar o mtodo p a g a ( d o u b l ev a l o r )na classe D i v i d a . ? 1p u b l i cc l a s sD i v i d a{ 2 3 4 5 6 7 8 9} } / /g e t t e r ses e t t e r s } t h i s . v a l o r P a g o+ =v a l o r ; p u b l i cv o i dp a g a ( d o u b l ev a l o r ){ i f( v a l o r>1 0 0 ){ v a l o r=v a l o r-8 ;

Podemos agora simplesmente chamar o novo mtodo quando quisermos pagar uma parte de uma dvida. O mtodo p a g a D i v i d ada nossa classe B a l a n c o E m p r e s afica assim: ? 1p u b l i cv o i dp a g a D i v i d a ( S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ){
online.caelum.com.br/course/FJ-17/section/1 7/14

22/04/13

Meus cursos

2 3 4 5 6}

D i v i d ad i v i d a=d i v i d a s . g e t ( c n p j C r e d o r ) ; i f( d i v i d a! =n u l l ){ d i v i d a . p a g a ( v a l o r ) ; }

Enquanto isso, na classe G e r e n c i a d o r D e D i v i d a s , mudamos o cdigo do mtodo e f e t u a P a g a m e n t opara: ? 1p u b l i cv o i de f e t u a P a g a m e n t o ( D i v i d ad i v i d a ,d o u b l ev a l o r ){ 2 3} d i v i d a . p a g a ( v a l o r ) ;

Agora, se precisarmos acrescentar alguma verificao no valor a ser pago, s precisamos alterar o mtodo p a g ada classe D i v i d a . Por exemplo, podemos querer verificar que o valor a ser pago positivo. Afinal, no faz sentido pagar um valor negativo! ? 1 p u b l i cc l a s sD i v i d a{ 2 3 4 5 6 7 8 9 10 11 12 } } / /g e t t e r ses e t t e r s } t h i s . v a l o r P a g o+ =v a l o r ; } i f( v a l o r>1 0 0 ){ v a l o r=v a l o r-8 ; p u b l i cv o i dp a g a ( d o u b l ev a l o r ){ i f( v a l o r<0 ){ t h r o wn e wI l l e g a l A r g u m e n t E x c e p t i o n ( " V a l o ri n v a l i d op a r ap a g a m e n t o " ) ;

Nosso problema foi resolvido, mas ainda possvel adicionar um valor da maneira antiga (usando o getter e setter). Nada impede que algum utilize esse cdigo dessa forma. Pior ainda, uma vez que essas variveis esto expostas, mais facil para um desenvolvedor quebrar o padro de utilizao do p a g ae utilizar o setter, cometendo um erro, uma vez que o getter e setter so nomes padronizados: sem pensar o desenvolvedor acaba introduzindo um novo bug no sistema. Queremos forar o programador a utilizar o mtodo p a g aquando for pagar uma parte da dvida. Consideremos ento o mtodo s e t V a l o r P a g o . Ele permite que mudemos o valor j pago da dvida a qualquer momento. No queremos isso! Qual a nica forma de mudar o valor pago de uma dvida? Acrescentando um pagamento. E s! O mtodo
online.caelum.com.br/course/FJ-17/section/1 8/14

22/04/13

Meus cursos

s e t V a l o r P a g ono faz sentido nesse caso! Podemos ento remov-lo. ? 1 p u b l i cc l a s sD i v i d a{ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 } } } t h i s . v a l o r P a g o+ =v a l o r ; } i f( v a l o r>1 0 0 ){ v a l o r=v a l o r-8 ; } p u b l i cv o i dp a g a ( d o u b l ev a l o r ){ i f( v a l o r<0 ){ t h r o wn e wI l l e g a l A r g u m e n t E x c e p t i o n ( " V a l o ri n v a l i d op a r ap a g a m e n t o " ) ; } p u b l i cv o i ds e t C n p j C r e d o r ( S t r i n gc n p j C r e d o r ){ t h i s . c n p j C r e d o r=c n p j C r e d o r ; } p u b l i cS t r i n gg e t C n p j C r e d o r ( ){ r e t u r nt h i s . c n p j C r e d o r ; } p u b l i cv o i ds e t T o t a l ( d o u b l et o t a l ){ t h i s . t o t a l=t o t a l ; } p u b l i cd o u b l eg e t V a l o r P a g o ( ){ r e t u r nt h i s . v a l o r P a g o ; } p u b l i cS t r i n gg e t C r e d o r ( ){ r e t u r nt h i s . c r e d o r ; } p u b l i cv o i ds e t C r e d o r ( S t r i n gc r e d o r ){ t h i s . c r e d o r=c r e d o r ; p u b l i cd o u b l eg e t T o t a l ( ){ r e t u r nt h i s . t o t a l ; p r i v a t ed o u b l et o t a l ; p r i v a t ed o u b l ev a l o r P a g o ; p r i v a t eS t r i n gc r e d o r ; p r i v a t eS t r i n gc n p j C r e d o r ;

Quando estamos desenvolvendo um sistema orientado a objetos comum criarmos classes para isolar os dados em conjuntos que faam mais sentido estarem juntos, o que em muitos casos uma boa ideia. Um problema clssico acontece quando a lgica associada a esses dados continua espalhada pelo cdigo,
online.caelum.com.br/course/FJ-17/section/1 9/14

22/04/13

Meus cursos

quebrando o controle que aquele objeto tinha sobre seus dados. A manuteno era dificil, custosa e frgil, uma vez que diversos pontos tinham que ser alterados a cada nova modificao. Cuidando com ateno de seus membros, o controle no perdido e a mudana em um ponto nico. Observe que, no exemplo utilizado, o simples fato de unir dados e comportamento facilitou a adio de novas funcionalidades e facilitou a mudana das funcionalidades existentes. No nosso exemplo, o B a l a n c o E m p r e s asabe o que a classe D i v i d afaz, ou seja, controla seu prprio valor pago. Mas a classe B a l a n c o E m p r e s ano sabe como a D i v i d afaz esse controle. Ou seja, o modo como a classe D i v i d aaltera seu prprio valor pago est escondido das outras classes, est encapsulado. graas a esse encapsulamento que conseguimos alterar esse comportamento facilmente. Em um bom design orientado a objetos, dado uma mudana, voc sabe onde alterar, j que esses pontos so razoavelmente explcitos. Encapsulamento um dos caminhos. Vamos incrementar um pouco nosso modelo. Agora, alm de guardar o valor j pago, a classe D i v i d avai guardar informaes de cada pagamento realizado. Para isso, vamos criar uma nova classe para representar um pagamento. Essa classe vai guardar o nome e o CNPJ de quem o fez, bem como o valor pago. ? 1 p u b l i cc l a s sP a g a m e n t o{ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 } } } p u b l i cv o i ds e t V a l o r ( d o u b l ev a l o r ){ t h i s . v a l o r=v a l o r ; } p u b l i cv o i ds e t P a g a d o r ( S t r i n gp a g a d o r ){ t h i s . p a g a d o r=p a g a d o r ; } p u b l i cS t r i n gg e t C n p j P a g a d o r ( ){ r e t u r nt h i s . c n p j P a g a d o r ; } p u b l i cv o i ds e t C n p j P a g a d o r ( S t r i n gc n p j P a g a d o r ){ t h i s . c n p j P a g a d o r=c n p j P a g a d o r ; } p u b l i cd o u b l eg e t V a l o r ( ){ r e t u r nt h i s . v a l o r ; p u b l i cS t r i n gg e t P a g a d o r ( ){ r e t u r nt h i s . p a g a d o r ; p r i v a t eS t r i n gp a g a d o r ; p r i v a t eS t r i n gc n p j P a g a d o r ; p r i v a t ed o u b l ev a l o r ;

online.caelum.com.br/course/FJ-17/section/1

10/14

22/04/13

Meus cursos

AD i v i d afoi incrementada e agora guarda uma lista de itens do tipo P a g a m e n t oe, como esperado, criamos tambm seu getter e setter: ? 1 p u b l i cc l a s sD i v i d a{ 2 3 4 5 6 7 8 9 10 11 12 13 } } p u b l i cv o i ds e t P a g a m e n t o s ( A r r a y L i s t < P a g a m e n t o >p a g a m e n t o s ){ t h i s . p a g a m e n t o s=p a g a m e n t o s ; } / /o u t r o sm t o d o s p u b l i cA r r a y L i s t < P a g a m e n t o >g e t P a g a m e n t o s ( ){ r e t u r nt h i s . p a g a m e n t o s ; p r i v a t eA r r a y L i s t < P a g a m e n t o >p a g a m e n t o s=n e wA r r a y L i s t < P a g a m e n t o > ( ) ; / /o u t r o sa t r i b u t o s

Mas ser que queremos o setter? Assim como o valor pago no pode ser mudado para um nmero arbitrrio, no queremos que qualquer um possa simplesmente trocar a nossa lista de pagamentos a qualquer momento. possvel, inclusive, fazer o seguinte uso indesejado: ? 1D i v i d ad i v i d a=n e wD i v i d a ( ) ; 2d i v i d a . s e t P a g a m e n t o s ( n u l l ) ;

Estamos novamente abrindo a implementao da nossa classe. A D i v i d aperde o controle desse atributo. Mais uma vez permitimos que outras classes alterem nossos atributos da forma que quiserem, quebramos o encapsulamento. No queremos o mtodo s e t P a g a m e n t o s ! Podemos ento remov-lo. Vejamos como est a classe B a l a n c o E m p r e s a . ? 1 p u b l i cc l a s sB a l a n c o E m p r e s a{ 2 3 4 5 6 7 8 9 10 11 12
online.caelum.com.br/course/FJ-17/section/1 11/14

p r i v a t eH a s h M a p < S t r i n g ,D i v i d a >d i v i d a s=n e wH a s h M a p < S t r i n g ,D i v i d a > ( ) ; p u b l i cv o i dr e g i s t r a D i v i d a ( S t r i n gc r e d o r ,S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ){ D i v i d ad i v i d a=n e wD i v i d a ( ) ; d i v i d a . s e t T o t a l ( v a l o r ) ; d i v i d a . s e t C r e d o r ( c r e d o r ) ; d i v i d a . s e t C n p j C r e d o r ( c n p j C r e d o r ) ; d i v i d a s . p u t ( c n p j C r e d o r ,d i v i d a ) ; }

22/04/13

Meus cursos

13 15 16 17 18 19 20 21 22 23

p u b l i cv o i dp a g a D i v i d a ( S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ,S t r i n gn o m e P a g a d o r , D i v i d ad i v i d a=d i v i d a s . g e t ( c n p j C r e d o r ) ; i f( d i v i d a! =n u l l ){ P a g a m e n t op a g a m e n t o=n e wP a g a m e n t o ( ) ; p a g a m e n t o . s e t C n p j P a g a d o r ( c n p j P a g a d o r ) ; p a g a m e n t o . s e t P a g a d o r ( n o m e P a g a d o r ) ; p a g a m e n t o . s e t V a l o r ( v a l o r ) ; d i v i d a . p a g a ( v a l o r ) ; d i v i d a . g e t P a g a m e n t o s ( ) . a d d ( p a g a m e n t o ) ; } } }

14S t r i n gc n p j P a g a d o r ){

Note que o mtodo p a g a D i v i d a responsvel por adicionar um novo pagamento e atualizar o valor pago da dvida. Para manter a consistncia, a classe G e r e n c i a d o r D e D i v i d a stambm deve adicionar o novo pagamento na dvida, alm de continuar atualizando o valor pago. O cdigo exatamente o mesmo da classe B a l a n c o E m p r e s a , logo podemos resolver o problema facilmente copiando e colando o cdigo de uma classe para a outra: ? 1 p u b l i cc l a s sG e r e n c i a d o r D e D i v i d a s{ 2 p u b l i cv o i de f e t u a P a g a m e n t o ( D i v i d ad i v i d a ,S t r i n gn o m e P a g a d o r ,S t r i n g 3 c n p j P a g a d o r ,d o u b l ev a l o r ){ 4 P a g a m e n t op a g a m e n t o=n e wP a g a m e n t o ( ) ; 5 6 7 8 9 10 } } p a g a m e n t o . s e t C n p j P a g a d o r ( c n p j P a g a d o r ) ; p a g a m e n t o . s e t P a g a d o r ( n o m e P a g a d o r ) ; p a g a m e n t o . s e t V a l o r ( v a l o r ) ; d i v i d a . p a g a ( v a l o r ) ; d i v i d a . g e t P a g a m e n t o s ( ) . a d d ( p a g a m e n t o ) ;

O que aconteceria se precisssemos adicionar um pagamento na dvida em outro ponto no nosso cdigo? No seria improvvel termos um cdigo assim: ? 1p u b l i cv o i da d i c i o n a P a g a m e n t o N a D i v i d a ( S t r i n gp a g a d o r ,S t r i n gc n p j ,d o u b l ev a l o r ){ 2 3 4 5 6 P a g a m e n t op a g a m e n t o=n e wP a g a m e n t o ( ) ; p a g a m e n t o . s e t C n p j P a g a d o r ( c n p j ) ; p a g a m e n t o . s e t P a g a d o r ( p a g a d o r ) ; p a g a m e n t o . s e t V a l o r ( v a l o r ) ; d i v i d a . g e t P a g a m e n t o s ( ) . a d d ( p a g a m e n t o ) ;
12/14

online.caelum.com.br/course/FJ-17/section/1

22/04/13

Meus cursos

7}

Qual o problema nesse cdigo? O cdigo em si est correto, mas esquecemos de adicionar o valor do pagamento na dvida (mtodo p a g a ). A ao de registrar um novo pagamento em uma dvida consiste em inserir o pagamento na lista e adicionar o valor do pagamento no total pago. Note que essa ao est relacionada dvida. Por que no criar um mtodo r e g i s t r a na D i v i d aque recebe um P a g a m e n t oe realiza as atividades necessrias? ? 1 p u b l i cc l a s sD i v i d a{ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } } / /o u t r o sm t o d o s } p u b l i cv o i dr e g i s t r a ( P a g a m e n t op a g a m e n t o ){ t h i s . p a g a m e n t o s . a d d ( p a g a m e n t o ) ; t h i s . p a g a ( p a g a m e n t o . g e t V a l o r ( ) ) ; } t h i s . v a l o r P a g o+ =v a l o r ; p u b l i cv o i dp a g a ( d o u b l ev a l o r ){ i f( v a l o r>1 0 0 ){ v a l o r=v a l o r-8 ; p r i v a t eA r r a y L i s t < P a g a m e n t o >p a g a m e n t o s=n e wA r r a y L i s t < P a g a m e n t o > ( ) ; p r i v a t ed o u b l ev a l o r P a g o ; / /o u t r o sa t r i b u t o s

Agora, basta chamarmos esse novo mtodo onde necessrio registrar um pagamento de uma dvida: ? 1 p u b l i cc l a s sB a l a n c o E m p r e s a{ 2 p u b l i cv o i dp a g a D i v i d a ( S t r i n gc n p j C r e d o r ,d o u b l ev a l o r ,S t r i n gn o m e P a g a d o r , 3 S t r i n gc n p j P a g a d o r ){ 4 D i v i d ad i v i d a=d i v i d a s . g e t ( c n p j C r e d o r ) ; 5 6 7 8 9 10 11 12 }
online.caelum.com.br/course/FJ-17/section/1 13/14

i f( d i v i d a! =n u l l ){ P a g a m e n t op a g a m e n t o=n e wP a g a m e n t o ( ) ; p a g a m e n t o . s e t C n p j P a g a d o r ( c n p j P a g a d o r ) ; p a g a m e n t o . s e t P a g a d o r ( n o m e P a g a d o r ) ; p a g a m e n t o . s e t V a l o r ( v a l o r ) ; d i v i d a . r e g i s t r a ( p a g a m e n t o ) ; } }

22/04/13

Meus cursos

Dessa forma, a responsabilidade de registrar um pagamento de uma dvida, que antes estava espalhada em vrias classes, agora est centralizada em um nico ponto. Se alguma regra relacionada a essa ao mudar, sabemos exatamente onde devemos mexer. Note que no faz mais sentido deixamos qualquer um chamar o mtodo p a g ana classe D i v i d a . Podemos deix-lo privado. As mudanas que fizemos vo de acordo com um princpio muito importante de orientao a objetos. Encapsulando o comportamento da classe D i v i d a , paramos de pedir os seus dados para fazer o que queramos e passamos a dizer a ela o que queramos que fosse feito. O princpio, conhecido como Tell, Don't Ask, diz exatamente isso: quando voc est interagindo com outro objeto (B a l a n c o E m p r e s aregistrando pagamentos na D i v i d apor exemplo), voc deve dizer o que quer que esse outro objeto faa (chamada do mtodo r e g i s t r a ( ) ) e no perguntar sobre o seu estado para tomar decises (implementao anterior que usava o g e t P a g a m e n t o s ( ) ). Veja como partimos de uma classe D i v i d aque no fazia nada, apenas guardava valores. Ela era o que conhecido como modelo anmico: uma classe de modelo sem comportamento algum. Seguindo o princpio de unir comportamento e dados, escondemos os dados e a forma como interagimos com eles, encapsulamos esse comportamento. A classe D i v i d adeixou de ser anmica.

Comear os exerccios

Caelum | Ensino e Inovao


Os cursos de desenvolvimento de software mais reconhecidos no mercado.

Termos e Poltica de privacidade

Contato

online.caelum.com.br/course/FJ-17/section/1

14/14