Вы находитесь на странице: 1из 7

RobsonCastilho

Desenvolvendosoftwarecomqualidade

ConhecendoDesignPatternseopadroStrategy
Publicadoem25/06/2011porRobsonCastilho
Fala,galera
Nestpostfalareiumpoucosobredesignpatterns,algoqueexistehdcadas,muitasuniversidades
ignorameconsequentementepoucosdesenvolvedoressabemoquesoousabemutilizarnaprtica.
Eumesmocomeceiaestudarsobreoassuntohuns2anose,aospoucos,fuicomeandoaentenderea
aplicaralgunsdospadresmaisconhecidos.
Brevehistrico
Nofinaldosanos70,padrodeprojetoeraumconceitodaArquitetura,descritonolivroAPattern
Language(http://www.amazon.com/PatternLanguageBuildingsConstruction
Environmental/dp/0195019199%3FSubscriptionId%3D0G81C5DAZ03ZR9WH9X82%26tag%3Dzemanta
20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0195019199),
dofamosoarquitetoamericanoaustracoChristopherAlexander
(http://en.wikipedia.org/wiki/Christopher_Alexander).Jnosanos80,KentBeckeWardCunningham
comearamaaplicaraideiadepadresnareadeprogramao.
Porm,somenteem1995,ospadresdeprojeto(oudesignpatterns)ganharampopularidade,quando
ErichGamma,RichardHelm,RalphJohnsoneJohnVlissidespublicaramolivroDesignPatterns
ElementsofReusableObjectOrientedSoftware(http://www.amazon.com/DesignPatternsElements
ReusableObject
Oriented/dp/0201633612%3FSubscriptionId%3D0G81C5DAZ03ZR9WH9X82%26tag%3Dzemanta
20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0201633612),
catalogando23designpatterns.Esses4autoresficaramentoconhecidoscomoGangofFour(GoF),
quetambmumtermousadoparasereferiraospadresdolivro(GoFDesignPatterns).(Quem
souberdeondesurgiuonomeGangofFourmeavise!)
OsGoFDesignPatternsso,atualmente,consideradosabaseparavriosoutrospadreseolivro
acimasetornouumclssico,sendocitadoeminmerosartigos,palestraseoutroslivros.
Definio
Masafinal,oqueumdesignpattern?
Umdesignpatterndescreveumasoluogeralparaumproblemadedesignqueocorrecom
frequncianareadedesenvolvimentodesoftware.Sendoassim,designpatternnocdigopronto
parareaproveitaremsuaaplicaoesimummodelopararesolverumproblema.
Exemplo(PadroStrategy)

Exemplo(PadroStrategy)
Aindaperdido?VoutentarclarearmelhorcomumexemploprticodopadroStrategy.Estepadro,
almdemuitopopular,bemsimplesdeserentendido.
OpadroStrategyserveparadefinirumafamliadealgoritmos,encapsularcadaumadelasetornlas
intercambiveis.Strategypermitequeoalgoritmovarieindependentementedosclientesqueo
utilizam(comodefinidonolivrodoGoF).
Emoutraspalavras,Strategynospermiteconfigurarumaclassecomumdevrioscomportamentos,
utilizandooconceitodeOOchamadodecomposio.
Aestruturadestepadropodeservisualizadapeloseguintediagramadeclasses:

(figuraobtidadeDoFactory.com(http://www.dofactory.com/Patterns/PatternStrategy.aspx#_self1))
Imagineque,emumaaplicaodevendas,umPedidopossuaduasformasdiferentes(estratgias)dese
calcularataxadeentregadomesmo:PadroeExpresso.
Nestecaso,oPedido(Context)seriaconfiguradoporumcliente(classequeoutiliza)comaestratgia
desejada.AimplementaodaclassePedidopoderiaseralgocomo(porsimplicidadeincluiapenasa
estratgia):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

publicclassPedido
{
//utilizandocomposio:opedidomantmumareferncia(passadaemseucons
//paraaStrategybase,normalmenteumainterfaceouclasseabstrata

privateICalculadorDeFrete_calculadorDeFrete;
publicPedido(ICalculadorDeFretecalculadorDeFrete)
{
_calculadorDeFrete=calculadorDeFrete;
}

publicdecimalCalcularFrete()
{
//delegandooclculodofreteparaoobjetoStrategyconfigurado
return_calculadorDeFrete.CalcularFretePara(this);
}
}

AbaixoescrevemosaStrategybaseICalculadorDeFrete:
1
2
3
4

publicinterfaceICalculadorDeFrete
{
decimalCalcularFretePara(Pedidopedido);
}

Implementamos,ento,asestratgiasconcretas:

Implementamos,ento,asestratgiasconcretas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

//frete"Padro"
publicclassCalculadorDeFretePadrao:ICalculadorDeFrete
{
publicdecimalCalcularFretePara(Pedidopedido)
{
//aquivaioalgoritmodeclculodefrete"padro"
}
}

//frete"Expresso"
publicclassCalculadorDeFreteExpresso:ICalculadorDeFrete
{
publicdecimalCalcularFretePara(Pedidopedido)
{
//aquivaioalgoritmodeclculodefrete"expresso"
}
}

Temos,assim,todaaestruturaimplementada:ocontexto(Pedido),aStrategybase
(ICalculadorDeFrete)easStrategiesconcretas(CalculadorDeFretePadraoe
CalculadorDeFreteExpresso).
Dessaforma,oclientequeforutilizaroPedido,poderconfigurlocomocalculadordesejado:
1
2
3
4
5
6
7
8
9
10

//algumaclassequeutilizeoPedido
//pedidocriadocomoclculodefretepadro
varpedido1=newPedido(newCalculadorDeFretePadrao());
varfretePadrao=pedido1.CalcularFrete();

//pedidocriadocomoclculodefreteexpresso
varpedido2=newPedido(newCalculadorDeFreteExpresso());
varfreteExpresso=pedido2.CalcularFrete();
.....
.....

Simplesno?Comissoganhamosemflexibidade,obedecendoalgunsprincpiosbsicosdaOO:
1.Programeparaabstraes:notemquenossoPedidonodependediretamentedenenhumcalculador
concretoesimdainterfaceICalculadorDeFrete.
2.Openclosedprinciple:nossoPedidonoternenhumimpactocasoonmerodeclassesderivadas
aumente(precisamosdeumnovoclculodefrete)enemseprecisarmosalteraroalgoritmodealgum
calculador.
Valelembrarquecadapadropodetervariaesdeumasoluoparaoutra.Noexemplodado,a
estratgiaadotadapassadaviaconstrutordoPedido,maspoderiaserdiretamentenomtodoquea
utilizaouainda,Pedidopoderiaimplementarummtodoespecficoparasetaraestratgiade
clculo.
Outrasituao:omtodoCalcularFretePararecebeoprpriocontexto(Pedido),oqueapenasuma
alternativa.OPedidopoderiapassarparaomtodosomenteoscamposnecessriosparaoclculodo
frete.
Oqueeuganhocomeles?
Agoraquevocjsabedeondevieram,oquesoejviuumdelesnaprtica,vocpodeestarse
perguntando:oqueeuganhoaoutilizardesignpatterns?Comoeuseiemquesituaoaplicar
determinado(s)padro(es)?
Vamosaalgumasvantagens:

Vamosaalgumasvantagens:
Vocabulriocomumentredesenvolvedores:devsqueconhecempadrespodemconversardando
nomeaosbois,ouseja,aoinvsdeexplicarasoluocontandoumahistria(muitasvezesconfusa),
podesedizerutilizeiopadroX.
FacilitamnaaplicaodetcnicaseprincpiosdeOO,comoherana,composio,polimorfismoe
SOLID.
Umpadropodeserutilizadopararefatoraodeumcdigoruim,altamenteacopladoedebaixa
coeso.
Todosessestenscolaboramparamelhorfacilidadedeextensoemanutenodosoftware.
Parasaberquandoapliclos,vocdeveprimeiramenteconhecloseentendlosbem(cadadesign
patternpossuiumaintenoexplcita,explicandoqualsuafinalidadecomoacitadaacimanopadro
Strategy).Feitoisso,nosepreocupe,aexperinciavaiteguiarevocvainaturalmenteenxergar
ondecabedeterminadopadro.
Mascuidado!
ConheclosbemesaberondecoloclosnosignificaqueelesDEVAMseraplicadosportodoo
software.DesignPatternsmuitolegal,eporissonosempolgamosemquererutilizlosaqualquer
custo,oquepodeserperigoso!
Noseesqueaquedevemossemprepensarsimples(KISS
(http://en.wikipedia.org/wiki/KISS_principle))enosairacrescentandocdigoquenoiremosprecisar
(pelomenos,emumprimeiromomento)(YAGNI
(http://en.wikipedia.org/wiki/You_ain%27t_gonna_need_it)).
Porondecomear?
Interessou?SugirocomearpelotimoHeadFirst:DesignPatterns(http://www.amazon.com/First
DesignPatternsElisabethFreeman/dp/0596007124/ref=sr_1_2?ie=UTF8&qid=1308972875&sr=82),que
umlivromuitodidtico.SeusexemplosestoemJava,mascomosetratabasicamentedeconceitosde
OO,praticamenteidnticoaoC#.(Senomeengano,nositedaeditorapodeserfeitoodownloaddos
exemplosemC#.).
OlivrodoGoF(http://www.amazon.com/DesignPatternsElementsReusableObject
Oriented/dp/0201633612/ref=sr_1_1?ie=UTF8&qid=1308972875&sr=81),mencionadonoincio,um
clssico,massualeituramaiscomplicada.Porsetratardeumlivromaisantigo,seusexemplosesto
emC++ehvriascitaesaaplicativosdaquelapocaeaoSmallTalk(incluindoalgunscdigos).
Portanto,norecomendocomoprimeiraleitura.
Umsitemuitoconhecidosobreoassuntoowww.dofactory.com(http://www.dofactory.com),voltado
parao.Net,quepossuiexemplosdecdigoemC#paratodosos23padresdoGoF.Valeapena
conferir!
Concluso
DesignPatternsestoporahmuitotempoemerecemserobservadoscomcarinho.Sabendoutiliz
los,podemosmelhorarmuitoodesigndenossasaplicaes.Contudo,devemostercuidadoparano
utilizlosindiscriminadamente,complicandooquepoderiasermaissimplesesaindodoverdadeiro
focoqueentregarsoftware.

Esperoterconseguidopelomenosatiaracuriosidadedevocsparaestudaremsobreoassunto.Vale

Esperoterconseguidopelomenosatiaracuriosidadedevocsparaestudaremsobreoassunto.Vale
muitoapena!
Acompanhemaissobredesignpatternspelatagdesignpatterns
(http://robsoncastilho.com.br/tag/designpatterns/).
[]seataprxima!
Essepostfoipublicadoempatternsemarcadoboaspraticas,designpatterns,OCP,orientacaoaobjetos,
SOLID,strategy.Guardarlinkpermanente.

16comentriossobreConhecendoDesignPatternseo
padroStrategy
outedgdisse:
em25/06/2011s19:08
realmenteumpenaqueafaculdadesacreditemqensinarumpoucodelgicaedeanlise
estarocolocandoprofissionaiscapacitadosnomercado.Oupior,essesrecmformadosque
leramalgosobrePatternseachamqueestodominandooassunto,eacabamcriandoproblemas
aindamaioresdemanuteno.
Masissoa,parabnsTiozopelopost,queestocadavezmaisaltonvel!!
Responder
Annimodisse:
em02/03/2013s21:38
Parabnspelopost.Ficouexcelente.Nota1000.vlw
Responder
RobsonCastilhodisse:
em02/03/2013s21:48
Obrigado.
[]sevoltesempre!
Responder
RicardoFerreiradisse:
em18/05/2013s08:56
MuitobomRobson,parabns,excelentepost.
Responder
RobsonCastilhodisse:
em18/05/2013s11:41
Obrigado,Ricardo.
[]s
Responder
CarlosLimadisse:
em23/09/2013s14:07
Euqueriasaberqualdesignerutilizarparaessasituao.Tenhoqueimportararquivos,um
posicionaleooutrodelimitador,umamesmaaosdecomportamentosdiferentes.
Responder

Responder
RobsonCastilhodisse:
em23/09/2013s17:27
Ol,Carlos
Existemvriassoluesparaummesmoproblema.Eassim,semsaberseucontexto,ficadifcil
sermuitopreciso.
Aoqueparece,vocsvariaapartedaextraodalinhadoarquivo.Sendoassim,essaextrao
poderiaserabstradaeimplementarummtododeextraoporposioeoutropordelimitador.
Casodeumstrategymesmo.
oqueeuconseguipensarassimdebatepronto .
Lembrandoquevocnodevedeixarcomplexodemaisseucdigosejestsimplesobastante
comoest.
[]s
Responder
JonatanMachado(@jonatanmachado)disse:
em15/12/2013s08:36
Seuspostssoexcelentes.
ComeceilendoosprincpiosSOLIDeestouaproveitandotodoorestantetambm.
ParabnsRobson!
Responder
RobsonCastilhodisse:
em15/12/2013s16:51
Opa,Jonatan.
Muitoobrigadopelofeedback.Esperocontinuarouataumentaronveldosposts.
[]s
Responder
DiegoGarciadisse:
em15/04/2014s20:29
Opaamigo,excelentepost.
Sobreasuaperguntanoiniciodopost,acreditoquegangoffoursejaumajogadaporser4autores
mesmo.
Abraoeparabns!
Responder
RobsonCastilhodisse:
em15/04/2014s22:12
Ol,Diego.
EraonomedeumbandaetambmonomedeumgrupopolticodaChina.Enfim
Obrigadopelavisita!
[]s
Responder
Charlesdisse:
em22/05/2014s11:01
ParabnsRobson!!
Encontreioqueamuitotempotinhadvidas.
Valeu!!
Responder
RobsonCastilhodisse:

RobsonCastilhodisse:
em22/05/2014s12:09
Quebom,cara.
Obrigadoevoltesempre
[]s
Responder
JhonathanMaiadisse:
em24/07/2014s13:42
Carlos,bomtutorial.
Poremaindasimesteexemplonomeabriuamenteparaestepattern.Teriaapossibilidadedevoc
criarumexemploutilizandooseguintecenario:Pessoa,PessoaFisica,PessoaJuridica.
Abrao.
Responder
JhonathanMaiadisse:
em24/07/2014s13:43
Ops:Robsonrsrsrsrsrsrsrs
Responder
RobsonCastilhodisse:
em24/07/2014s21:57
Tranquilo,Jhonathan.
OpadroStrategyutilizasedoconceitodecomposio.Aclassecontexto(nomeuexemplo,
oPedido)USAastrategyparavariarocomportamento(aoinvsdeusarherana:Pedido,
PedidoComFretePadraoePedidoComFreteExpresso).Assimtenhoumcdigomenos
acopladoemaisflexvel.
Peloexemploquedeu(nofoiumcenrio!:)),vocquerfazerumaheranacerto?Quala
finalidade?Herdardados?SemumcontextonotemcomaprofundarOStrategynos
permitevariarCOMPORTAMENTO(umaoperaaoqueseuobjetodelegaparaoutro)de
formaextensivel,semtermosqueficaralterandoaclassecontextoquandosurgirumanova
estratgia.
Qquercoisa,respondeaqueagentetentaaprofundarmais.
[]s

BlognoWordPress.com. / OtemaTrulyMinimal.

Вам также может понравиться