princpios (ue tambm embasaram o projeto de 'inguagens procedurais)
*or e+emp'o, todas visam decompor um prob'ema
maior em prob'emas menores, a programao top,do-n. /anto a programao orientada a objetos (uanto a programao estruturada do import0ncia a se estruturar dados de acordo com a 1rea de ap'icao, ou domnio do prob'ema. 2/23 Orientao a Objetos
3uitos dos critrios para se ava'iar a (ua'idade de
uma sub,rotina ou bib'ioteca, (ue seja reuti'i41ve' e #1ci' de se manter, tambm servem como critrios para se ava'iar uma boa c'asse, por e+emp'o5
ocultamento de informaes: (uem c6ama
uma sub,rotina "ou um objeto% no precisa saber dos deta'6es sobre o seu #uncionamento interno)
coeso: uma boa sub,rotina tem um prop&sito
7nico e bem de!nido, no uma rotina genrica (ue atende a v1rias necessidades de uso muito di#erentes entre si) 8/23 Orientao a Objetos
baixo acoplamento: uma boa sub,rotina
independente de outras sub,rotinas, ou seja, 7ti' por si s&, e no e+ige (ue outras sub,rotinas sejam c6amadas em uma ordem espec!ca, antes ou depois de'a, para preparar um ambiente apropriado. 9/23 Relacionamentos entre Objetos
Uso5 um objeto c6ama outro, depende de'e para
#a4er seu traba'6o
Areao / Composio5 um objeto guarda
outros objetos, um objeto composto
!eleao5 um objeto passa a bo'a para outro,
e comunica o resu'tado para (uem c6amou
"erana / #speciali$ao5 (uando uma
subc'asse "ou c'asse !'6a% 6erda estado e comportamento de uma superc'asse "ou c'asse me% :/23 Uso
#ntreador usa %roduto
#ntreador recebe %roduto como argumento
em seus mtodos
#ntreador usa a re#er;ncia recebida como
argumento para c6amar mtodos de %roduto
EntregadorV2 "do-n'oad 4ip no <a=%
>/23 #ntreador usa %roduto 1. public class Entregador { 2. ... 3. public boolean isEntregavel(Produto produto) { 4. if (produto.getPeso() > PESO!"#$!O %. ... ?/23 Areao & Composio
outro objeto, (ue (uem rea'mente tem a inte'ig;ncia
Cma de'egao s& pode e+istir se tambm e+istir
um uso ou uma agregao entre o objeto (ue de'ega e o objeto de'egado 13/23 #ntreador delea para Cateoria#ntrea
*or (ue no co'ocar Aategoria<ntrega decidindo
se um produto se en(uadra ne'a ou noG
<sta mudana seria um bom e+emp'o de
refatorao
O <c'ipse ajuda5 se'ecione o mtodo
is#ntreavelCateoria em #ntreador "ou co'o(ue o cursor sobre o seu nome% e se'ecione no menu Recriar > Mover 12/23 Recriar ( )over 18/23 #ntreador delea para Cateoria#ntrea 1. public class Entregador { 2. private 3ategoriaEntrega78 categorias( 3. 4. public Entregador(3ategoriaEntrega78 categorias) { %. t5is.categorias 9 categorias( +. 0 ,. public boolean isEntregavel(Produto produto) { -. CategoriaEntrega maxima = 9. categorias[categorias.length !]( 1/. return maxima.isEntregavel(produto)( 11. 0 12.... 19/23 "erana ou #speciali$ao
A'asse !'6a 6erda atributos e mtodos da c'asse
me
Cma boa 6erana uma re'ao um
Auidado para no #a4er 6erana de
conveni;ncia, s& para 6erdar c&digo de outra c'asse
Cma 6ierar(uia de sub/super c'asses #orma tipos
compatveis de dados para re#er;ncias 1:/23 #xemplo com "erana
EntregadorV4 no <a=
#ntreador agora usa "de'ega% para
)etodo#ntrea
<ntregador contm "agrega% um arraD de
)etodo#ntrea
As categorias A, @ e A do EntegadorV2 agora
esto em #ntrea*an (ue especializa )etodo#ntrea
#ntrea)ensaeiro de!ne regras a'ternativas
de aceite da entrega e va'or do #rete 1>/23 )etodo#ntrea 1. public class !etodoEntrega { 2. 3. public boolean isEntregavel(Produto prod){ 4. return false( %. 0 +. ,. public )ig*eci&al get:alor;rete(Produto prod){ -. return null( .. 0 1/. 11. 0 1?/23 #ntrea*an especiali$a )etodo#ntea 1. public class Entrega:an extends "etodoEntrega { 2. 3. <Override 4. public )ig*eci&al get:alor;rete(Produto prod) { %. if (prod.getPeso() =9 PESO" +. >> prod.get3o&pri&ento() =9 3O!P?$!E@1O" ,. >> prod.getAargura() =9 A"?B4?"" -. >> prod.get"ltura() =9 "A14?"") .. return P?E3O"( 1/. else if (prod.getPeso() =9 PESO) 11.... 2E/23 "erana e %olimor+smo
A 6erana "ou especia'i4ao% s& interessante
mesmo graas H capacidade de se #a4erem c,amadas polim-r+cas
Cma re#er;ncia dec'arada com o tipo da
superc'asse pode apontar para inst0ncias de (uais(uer subc'asses
Ie esta re#er;ncia #or usada para c6amar
mtodos "ou consu'tar atributos% ser1 usada a de!nio da c'asse da inst0ncia, e no da c'asse da dec'arao "da vari1ve'% 21/23 #ntreador c,ama polimor+camente )etodo#ntrea
<nto, se entregador c6ama is#ntreavel em
uma vari1ve' dec'arada como re#er;ncia a )etodo#ntrea, mas esta re#er;ncia aponta para uma inst0ncia de #ntrea*an, ser1 usada a verso de is#ntre.vel #ornecida por #ntrea*an
Ou ento, se a vari1ve' apontar para uma
inst0ncia de #ntrea)ensaeiro, seria usada a verso de is#ntreavel em #ntrea)ensaeiro
Ou seja, dependendo da inst0ncia apontada em
tempo de execuo, ser1 e+ecutado c&digo di#erenteB 22/23 #ntreador delea /polimor+camente0 para )etodo#ntrea 1. public class Entregador { 2. private !etodoEntrega78 &etodosEntrega( 3. public Entregador(!etodoEntrega78 &etodosEntrega){ 4. t5is.&etodosEntrega 9 &etodosEntrega( %. 0 +. public )ig*eci&al get:alor;rete(Produto produto) { ,. for (!etodoEntrega &etodoEntregaC &etodosEntrega){ -. if (metodoEntrega.isEntregavel(produto) 99 true) .. return metodoEntrega.get#alor$rete(produto)( 1/. 0 11. return null( 12. 0 23/23 Assustado1 230