<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AgileZ &#187; grasp</title>
	<atom:link href="http://www.brasiltech.net/agilez/tag/grasp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brasiltech.net/agilez</link>
	<description>Metodologias e técnicas aplicadas a desenvolvimento e gerenciamento</description>
	<lastBuildDate>Wed, 29 Dec 2010 23:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>GRASP &#8211; como atribuir responsabilidades com efici&#234;ncia, uma introdu&#231;&#227;o</title>
		<link>http://www.brasiltech.net/agilez/2009/09/13/grasp-como-atribuir-responsabilidades-com-eficiencia-introducao-padroes-para-atribuicao-de-resposabilidade/</link>
		<comments>http://www.brasiltech.net/agilez/2009/09/13/grasp-como-atribuir-responsabilidades-com-eficiencia-introducao-padroes-para-atribuicao-de-resposabilidade/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 17:45:22 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[grasp]]></category>
		<category><![CDATA[padrões]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/09/13/grasp-como-atribuir-responsabilidades-com-eficiencia-introducao-padroes-para-atribuicao-de-resposabilidade/</guid>
		<description><![CDATA[A programação orientada a objetos é, de longe, o paradigma mais utilizado em programação. Com várias décadas de existência, (apesar de muita gente não saber, a OO surgiu com as linguagens SIMULA I (1962-65) e Simula 67 (1967)) evoluiu bastante, porém, é muito comum encontrar projetos com problemas de arquitetura dos mais diversos tipos, entre [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="dilber" border="0" alt="dilber" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/dilber.gif" width="586" height="208" /> </p>
<p>A programação orientada a objetos é, de longe, o paradigma mais utilizado em programação. Com várias décadas de existência, (apesar de muita gente não saber, a OO surgiu com as linguagens <a href="http://www.ime.usp.br/~kon/MAC5714/aulas/Aula2.html" rel="nofollow" target="_blank">SIMULA I (1962-65) e Simula 67 (1967)</a>) evoluiu bastante, porém, é muito comum encontrar projetos com problemas de arquitetura dos mais diversos tipos, entre eles, problemas de coesão, acoplamento desnecessários, generalizações inconsistentes e outras. </p>
<p>O intenção deste artigo é introduzir o conceito de GRASP (General Responsibility Assignment Software Patterns), que, conforme o nome já diz, tem o objetivo de tornar a distribuição de responsabilidade entre as classes uma tarefa mais criteriosa e eficiente, melhorando de forma significativa a qualidade de seu projeto e reduzindo os problemas de arquitetura mais comuns.</p>
<p> <span id="more-70"></span>
<p>&#160;</p>
<p>A maioria dos programadores aprendeu que em POO devemos mapear objetos reais para objetos em seu modelo de classes. Isto muitas vezes é seguido a risca, mas nem sempre é a melhor maneira de modelar suas classes, pois muitos detalhes cruciais só são visíveis ao se considerar o contexto geral, ou seja, a forma como esses objetos vão interagir e como eles vão colaborar uns com os outros. Os padrões GRASP surgiram exatamente para auxiliar nesta questão.</p>
<p>O GRASP descreve ao todo nove padrões ou princípios, a saber:</p>
<ol>
<li>Especialista de informação (<strong>Expert</strong>) </li>
<li>Criador (<strong>Creator</strong>) </li>
<li>Alta coesão (<strong>High coesion</strong>) </li>
<li>Baixo acoplamento (<strong>Low coupling</strong>) </li>
<li>Controlador (<strong>Controller</strong>) </li>
<li>Polimorfismo (<strong>Polymorphism</strong>) </li>
<li>Invenção pura (<strong>Pure Fabrication</strong>) </li>
<li>Indireção (<strong>Indirection</strong>) </li>
<li>Variação protegida (<strong>Protected Variations</strong>) </li>
</ol>
<p>Cada um destes padrões trata de um problema específico, e sugere uma solução de arquitetura para superá-lo. A solução pode utilizar alguns dos consagrados padrões GoF (que poderá ser assunto aqui no AgileZ), portanto é recomendável que o programador ou analista conheça bem soluções como <em>Observer pattern</em>, <em>Proxy</em>, <em>Iterator</em>, <em>Adapter</em>, <em>Strategy</em>, <em>Singleton</em> entre outros.</p>
<p>Antes de começar a descrever cada um dos nove padrões, convém conceituar o que é <strong>responsabilidade</strong>. Uma responsabilidade pode ser descrita como uma obrigação, seja obrigação de <strong>fazer </strong>ou<strong> conhecer</strong> alguma coisa.     </p>
<p>Fazer algo:</p>
<ul>
<li>a si mesmo </li>
<li>começar ações em outros objetos </li>
<li>controlar ações em outros objetos </li>
</ul>
<p>Conhecer algo:</p>
<ul>
<li>informações encapsuladas </li>
<li>objetos relacionados </li>
<li>informações que pode calcular </li>
</ul>
<p>Exemplo: uma classe <strong>Memo</strong> pode ter obrigação de gerar linhas (<strong>faz algo a si mesma</strong>), ou pode utilizar uma classe <strong>Linha </strong>para isso (<strong>inicia uma ação em outro objeto</strong>) e controlar essas ações mantendo um contador de linhas (<strong>informações encapsuladas</strong>). Para isso, o <strong>Memo</strong> deve conhecer a classe <strong>Linha </strong>(<strong>objetos relacionados</strong>). </p>
<p>Não devemos, entretanto, confundir métodos/operações com responsabilidades. Um ou vários métodos devem ser utilizados para implementar uma determinada responsabilidade.</p>
<p>I. O padrão <strong>Expert (Especialista de informação)</strong></p>
<p>O primeiro padrão que deve ser considerado para resolver o problema de atribuição de responsabilidade é o <strong>Expert</strong>, que diz que o primeiro candidato a receber a responsabilidade é aquele que possui a informação necessária para executar a tarefa.</p>
<p>O exemplo mais comum é o da venda. Nosso sistema precisa calcular o total de uma venda. Qual classe deve ser responsável por fazer este cálculo?</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="vendas" border="0" alt="vendas" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/vendas.jpg" width="457" height="333" /> </p>
<p>Sabemos que, para calcular o total de uma venda, precisamos somar os totais de cada item, além do desconto e juros, se houver. Olhando o diagrama, fica fácil observar que a classe <strong>Venda</strong> é a classe que mantém a lista de itens (dona da informação), portanto ela é a primeira candidata a calcular o total.</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="venda 2" border="0" alt="venda 2" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/venda2.jpg" width="431" height="333" /> </p>
<p>Utilizando o padrão <strong>Expert</strong>, atribuímos à classe Venda a responsabilidade por calcular o total da venda. Como será feito o cálculo internamente? A classe <strong>Venda</strong> deve iterar pelos itens, somando os valores de cada um e depois subtrair os descontos e somar os acréscimos. Mas, e o valor do item, quem deve calcula-lo? Aplicando novamente o padrão Expert, podemos observar que é o <strong>Item</strong> quem possui a informação necessária para essa tarefa (quantidade), e o produto é quem possui o preço, logo, as responsabilidades, seguindo o padrão <strong>Expert</strong>, ficariam assim:</p>
<p><a href="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/venda3.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="venda 3" border="0" alt="venda 3" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/venda3_thumb.jpg" width="418" height="303" /></a> </p>
<p>É lógico que este foi um exemplo bem simples, e provavelmente nenhum analista precisaria conhecer o GRASP para chegar ao modelo proposto, mas, ao tratar de relacionamentos e projetos mais complexos, fica bem mais difícil manter um modelo consistente, altamente escalável e flexível, sem conhecer bem esses padrões. </p>
<p>Vamos continuar com os demais padrões GRASP em nossos próximos artigos. Fiquem a vontade para dar sugestões e críticas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/09/13/grasp-como-atribuir-responsabilidades-com-eficiencia-introducao-padroes-para-atribuicao-de-resposabilidade/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

