<?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; Programação</title>
	<atom:link href="http://www.brasiltech.net/agilez/category/programacao/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>Sun, 25 Jul 2010 19:38:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Voc&#234; &#233; um bom programador?</title>
		<link>http://www.brasiltech.net/agilez/2010/03/21/dicas-para-ser-um-bom-programador/</link>
		<comments>http://www.brasiltech.net/agilez/2010/03/21/dicas-para-ser-um-bom-programador/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 22:45:30 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[programador]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2010/03/21/dicas-para-ser-um-bom-programador/</guid>
		<description><![CDATA[Seguindo a tendência do artigo anterior (Sua equipe de desenvolvimento está no caminho certo?) vou falar um pouco sobre algumas questões que nem sempre são observadas pelos programadores, mas competem para a sua imagem como bom profissional. É muito comum, principalmente entre programadores mais novos, o ideal do código perfeito. Muitas vezes o programador novato [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right-width: 0px; margin: 0px 0px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="programador" border="0" alt="programador" align="right" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/03/programador.jpg" width="240" height="240" /> Seguindo a tendência do artigo anterior (<a href="http://www.brasiltech.net/agilez/2010/03/14/sua-equipe-de-desenvolvimento-esta-no-caminho-certo-checklist/" target="_blank">Sua equipe de desenvolvimento está no caminho certo?</a><b></b>) vou falar um pouco sobre algumas questões que nem sempre são observadas pelos programadores, mas competem para a sua imagem como bom profissional.     <br />É muito comum, principalmente entre programadores mais novos, o ideal do código perfeito. Muitas vezes o programador novato trabalha suas habilidades com a meta de se tornar um melhor codificador a cada dia. Essa fase é plenamente justificável, e faz parte do desenvolvimento do profissional, entretanto, conforme o programador for ganhando maturidade e experiência, é necessário que ele trabalhe outras habilidades não relacionadas à codificação, que podemos chamar de habilidades não técnicas.</p>
<p>Desenvolvi uma lista com algumas questões que devem ser observadas por todo programador. (lista baseada no artigo de <a href="http://www.makinggoodsoftware.com/2009/07/07/5-top-non-technical-mistakes-made-by-programmers/" rel="nofollow" target="_blank">Alberto Gutierrez</a> ).</p>
<p><b>1. </b><b>Seja disciplinado:      <br /></b>No nosso dia-a-dia nos deparamos com diversas interrupções e tarefas paralelas. Telefone tocando, email, mensagem instantânea, colega chamando e diversas outras. Ser disciplinado significa estabelecer uma metodologia para que essas interrupções prejudiquem o menos possível o seu desempenho e produtividade. Utilização de técnicas como a <a href="http://www.brasiltech.net/agilez/2010/01/15/agile-focus-aplicativo-para-controle-de-foco-tecnica-pomodoro/" target="_blank">técnica do pomodoro</a>, por exemplo, é uma excelente metodologia para manter o foco em uma tarefa por vez. </p>
<p> <span id="more-137"></span>
<p><b></b></p>
<p><b>2. </b><b>Seu ego não é tudo:      <br /></b>Ser autoconfiante e ter uma boa auto-estima é diferente de ter um grande ego. Programadores precisam ter segurança e domínio do que fazem para serem colaborativos expressando sua opinião, mas, não exagere. Escute o que os seus colegas têm a dizer. Mantenha a mente aberta e analise as opções de todos antes de se apegar a sua solução como se fosse a melhor de todas. Se estiver errado sobre algo, não se envergonhe de dizer “você tem razão” ou “eu estava errado”.<b></b></p>
<p><b>3. </b><b>Seja um bom comunicador:      <br /></b>Facilidade em falar e desinibição são apenas algumas das habilidades requeridas para uma boa comunicação. Seja conciso ao falar. Evite fugir do assunto e usar termos prolixos sem necessidade. Em uma discussão, procure ouvir e entender a outra parte antes de responder. Ser educado também faz parte de uma boa comunicação. Evite gírias fora de contexto.<b></b></p>
<p><b>4. </b><b>De novo&#8230;o cliente:      <br /></b>Não faça de uma tarefa de codificação a sua diversão acima de tudo. Acredito que muitos programadores devem adorar ficar experimentando e especulando arquiteturas e algoritmos, mas não exagere. A entrega para o cliente nunca deve ser penalizada. Se houve um comprometimento de prazo com o cliente é melhor abrir mão de “seu código-arte” e focar na melhor estratégia que de retorno imediato para o cliente. Resolva o problema primeiro.<b></b></p>
<p><b>5. </b><b>Não esqueça o que é prioridade:      <br /></b>Sempre existem funcionalidades que são mais importantes que outras, e essa priorização deve ficar clara e ser respeitada. Esse item é um complemento ao anterior. A procura por novas tecnologias, componentes e arquiteturas devem ser feitas com cautela de forma a não prejudicar o que foi priorizado.<b></b></p>
<p><b>6. </b><b>Existe um mundo além do código:      <br /></b>Codificar é apenas umas das competências que um programador deve ter. Existe um mundo lá fora. Autogerenciamento, atenção aos prazos e metas, colaboração com a equipe, atenção aos horários, manutenção de um bom ambiente de trabalho evitando que o mau humor e o pessimismo contaminem os demais membros da equipe são apenas algumas das coisas que o programador deve ter em mente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2010/03/21/dicas-para-ser-um-bom-programador/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A import&#226;ncia do desenvolvimento orientado a teste ou TDD</title>
		<link>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/</link>
		<comments>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:47:23 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/</guid>
		<description><![CDATA[Se você e sua equipe são adeptos do scrum ou outra metodologia ágil provavelmente devem conhecer ou utilizar testes unitários, mas não necessariamente o desenvolvimento orientado a testes (TDD). O teste unitário consiste basicamente em validar dados válidos e inválidos via entrada e saída, já o TDD utiliza teste unitário como parte de sua metodologia [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Grafo" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/11/Grafo.png" border="0" alt="Grafo" width="240" height="204" align="left" /></p>
<p>Se você e sua equipe são adeptos do scrum ou outra metodologia ágil provavelmente devem conhecer ou utilizar testes unitários, mas não necessariamente o desenvolvimento orientado a testes (TDD). O teste unitário consiste basicamente em validar dados válidos e inválidos via entrada e saída, já o TDD utiliza teste unitário como parte de sua metodologia cujo principal objetivo não é testar as unidades (é um dos objetivos, mas não o único).</p>
<p>Em um cenário de desenvolvimento ágil, sem uso de TDD, o programador geralmente não conta com um modelo de classes em forma de diagramas &#8211; como outras metodologias pesadas. Por isso é comum a modelagem ser feita apenas mentalmente, em algum outro formato (rascunho em papel de pão?) ou até mesmo diretamente no código. As classes, operações e atributos vão surgindo conforme a necessidade, e são constantemente alterados e implementados até a conclusão da tarefa associada. Eventualmente, alguns testes de unidade são implementados baseando-se nas classes já prontas.<span id="more-100"></span></p>
<p>Este tipo de abordagem implica em alguns problemas, entre eles:</p>
<ul>
<li>o programador não tem segurança em saber quando uma implementação acabou;</li>
<li>o programador não precisa implementar a classe de forma que ela fique desacoplada das demais;</li>
<li>o programador tende a não desenvolver para a interface e sim para a implementação;</li>
<li>métodos não coesos (fazem mais ou menos do que deveriam fazer);</li>
<li>nomes de atributos e operações não representam adequadamente a funcionalidade.</li>
</ul>
<p>O TDD pretende resolver todas as deficiências citadas acima e várias outras. Mas, o que é o TDD? TDD ou Test Driven Development pode ser considerada uma metodologia de design de software, onde escrevemos primeiro um teste e depois o código necessário para o teste passar. A idéia é que o desenho das classes seja guiado pelos testes. O TDD força o desenvolvedor a pensar primeiro em o que ele precisa, e em como fazer, via teste unitário, para testar se a implementação a ser feita fará o que deve, nada mais e nada menos. Com isso, se ganha em vários aspectos:</p>
<ul>
<li>as classes devem ser desacopladas, senão o teste não pode ser executado;</li>
<li>os métodos são bem coesos, ou seja, fazem somente o necessário para o teste passar;</li>
<li>o programador sabe exatamente quando concluiu uma implementação, pois o teste passou;</li>
<li>o programador consegue validar rapidamente uma alteração que pode ter causado um impacto em outras unidades, apenas rodando um conjunto de testes;</li>
<li>operações e atributos possuem nomes claros e representam exatamente o que fazem.</li>
</ul>
<p>O workflow do TDD pode ser descrito basicamente em cinco passos básicos:</p>
<ol>
<li>Crie a classe de teste e o primeiro teste
<ol>
<li>Nesse ponto o programador deve pensar em como será a assinatura do método testado. O fato de ter que escrever um teste para o método, faz com que, tanto o nome quanto os parâmetros de entrada e saída sejam bem claros e coesos.</li>
</ol>
</li>
<li>Compile o teste
<ol>
<li>O teste não vai compilar. Neste momento, crie a classe e a declaração do método. Recompile e rode o teste. O teste deve falhar, pois o método testado ainda não está implementado.</li>
</ol>
</li>
<li>Implemente o código testado de modo que o teste falhe
<ol>
<li>O objetivo do teste é detectar defeitos, e essa fase é importante para averiguar se o teste está cumprindo seu papel. Geralmente codificar para que o método testado retorne um valor errado é o suficiente. Rode o teste e veja o teste falhar.</li>
</ol>
</li>
<li>Agora corrija o código, de forma que o teste passe
<ol>
<li>Implemente o suficiente para o teste passar. Você deve garantir que o teste exija o suficiente. Se precisar implementar mais do que o necessário para o teste passar, provavelmente seu teste não está bom o suficiente, ou seu método não está coeso. Neste caso, refaça o teste ou corrija a implementação do código testado.</li>
</ol>
</li>
<li>Faça alguma refatoração necessária e reexecute os testes
<ol>
<li>Na fase anterior nos preocupamos apenas em fazer o teste passar. Nessa etapa, faça uma revisão no código e veja se precisa de alguma refatoração. Em seguida rode todos os testes construídos até agora para certificar-se de que a refatoração não quebrou algum outro código.</li>
</ol>
</li>
<p>Antes que me perguntem: TDD não é burocrático e demorado?.  Não. Usar TDD não implica em aumentar o tempo de desenvolvimento. Desconsiderando o tempo de adaptação de sua equipe, a tendência é que o desenvolvimento com TDD aumente consideravelmente a produtividade, e, consequentemente, a segurança e qualidade dos produtos desenvolvidos. Essa é a experiência de quase toda equipe de aderiu ao TDD, e provavelmente sua equipe só vai se sentir confortável com a idéia quando efetivamente aplicar os conceitos da metodologia.</ol>
<p>Neste artigo não abordei as ferramentas de teste unitário, pois não é o foco do TDD, porém praticamente todos os ambientes de desenvolvimento moderno possuem algum framework de testes unitários. Posso citar alguns: NUnit (C#), DUnit (Delphi) e JUnit (Java). Escolha o que melhor se adequar a sua realidade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A import&#226;ncia da interface com o usu&#225;rio</title>
		<link>http://www.brasiltech.net/agilez/2009/09/27/como-desenhar-boas-interfaces-graficas-iu-com-eficiencia/</link>
		<comments>http://www.brasiltech.net/agilez/2009/09/27/como-desenhar-boas-interfaces-graficas-iu-com-eficiencia/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 20:15:56 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[iu]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/09/27/como-desenhar-boas-interfaces-graficas-iu-com-eficiencia/</guid>
		<description><![CDATA[Programar muitas vezes é considerado como sinônimo de codificar, ou seja, escrever código para ser compilado. A importância de um bom algoritmo na qualidade final de um software é indiscutível e não pretendo levantar discussões a este respeito por aqui, mas colocar em pauta outro aspecto – que também é programação – porém nem sempre [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/dilbert3.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="dilbert3" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/09/dilbert3_thumb.jpg" border="0" alt="dilbert3" width="375" height="383" /></a></p>
<p>Programar muitas vezes é considerado como sinônimo de codificar, ou seja, escrever código para ser compilado. A importância de um bom algoritmo na qualidade final de um software é indiscutível e não pretendo levantar discussões a este respeito por aqui, mas colocar em pauta outro aspecto – que também é programação – porém nem sempre tem a atenção merecida: a interface gráfica, ou, mais precisamente, a interface de usuário (IU).</p>
<p>Assim como a parte que fica por debaixo dos panos (o código) a interface gráfica tem uma importância fundamental para o sucesso de seu sistema. Padrões de projeto (Design Patterns), Grasp, POO, POA e etc. São inúmeras as técnicas existentes para auxiliar a construção de excelentes softwares. Mas, quantos de vocês conhecem alguma para desenhos de interfaces gráficas? O que deve ter em mente o programador ou projetista de interface para construir uma boa IU?</p>
<p><span id="more-81"></span></p>
<p>Imagine a seguinte situação: você acabou de liberar uma nova versão de seu sistema com um novo e badalado recurso de cálculo de preço, baseado em uma intricada fórmula de previsão de custos, cujo código você morre de orgulho de dizer que foi de sua autoria. A janela que implementa este recurso possui alguns campos para digitação dos materiais aos quais o usuário pretende calcular o preço, e, eventualmente atualizar seu cadastro de produtos com os valores obtidos. O que parecia ter tudo pra ser um sucesso não repercutiu como o esperado, e você logo se pergunta: o que pode ter saído errado? O código está perfeito, fiz testes unitários e utilizeis todos os padrões GoF aplicáveis, entretanto, um recurso que teria tudo pra ser um sucesso não está sendo utilizado como o esperado.</p>
<p>Voltando a atenção à interface do usuário, constatamos que ela possui uma grave falha: o sistema possui um cadastro de produtos extenso, e a nova tela não permite que o usuário faça uma seleção para importar os produtos pelo grupo, por intervalo de código, por classificação ABC ou por algum outro critério. O usuário, frustrado por não conseguir digitar os produtos com facilidade, acaba evitando utilizar o novo recurso. Se uma análise de usabilidade fosse feita ANTES de o recurso ser liberado ao mundo externo, o resultado seria diferente.</p>
<p>A palavra chave, quando falamos em IU, é USABILIDADE. Interfaces gráficas foram feitas para – além de serem bonitinhas – facilitarem o trabalho de quem as utiliza. Beleza sem usabilidade é a mesma coisa que uma Ferrari sem volante. É linda, porém não vai servir para o propósito ao qual foi feita.</p>
<p>A tarefa do projetista de IU não é fácil. Cometemos vários equívocos ao desenhar uma nova janela ou página apenas porque não pensamos como um usuário. E não é pra menos: nós não somos usuários. Se colocar no lugar do usuário é uma tarefa difícil e é o segredo para o sucesso de qualquer IU. Com qual freqüência o recurso será utilizado? É crítico? Velocidade faz diferença? É acessível via teclado ou exige o uso do mouse?</p>
<p>Chega de perguntas. O objetivo é apenas um:</p>
<blockquote><p>Uma boa IU é aquela que se comporta da forma como o usuário espera que ela se comporte.</p></blockquote>
<p>Simples, direto, claro. Se você coloca um botão lindo com ícones em 3D, mas não deixa claro para o que ele serve, não está construindo uma interface boa para o usuário. Coloque legendas claras e, se possível, <em>hints </em>explicativos e teclas de atalho <strong>explicitas</strong>, pois nem todo mundo gosta ou pode ficar utilizando mouse (cansa mais que teclado, principalmente em tarefas repetitivas). Se o padrão do sistema operacional é que em caixas de mensagens o botão <strong>OK</strong> venha antes do <strong>Cancelar</strong>, siga desta forma. Se tem um recurso não implementado, não coloque o botão na janela apenas para que o usuário tenha que clicar e ver que nada acontece. Recursos incompletos são piores que a ausência total deles.</p>
<p>Outra característica interessante relacionada ao usuário: eles não gostam de ler. Não adianta fazer um manual explicando como utilizar a nova janela, pois eles não o lerão de forma alguma. Da mesma forma, não adianta escrever caixas de diálogos com textos explicativos muito grandes. Eles não lerão e sequer pensarão em clicar em <strong>OK</strong> ou <strong>Cancelar </strong>antes de apertar a tecla <strong>ENTER </strong>do teclado. Textos curtos e claros são ideais. Ao invés de dizer: ‘Você apertou a tecla X, tem certeza que quer executar o procedimento X?’ utilize &#8216;Executar X?&#8217;.</p>
<p>Muitos usuários também são inseguros, portanto, evite questionar as ações dele a menos que seja necessário. Mensagens do tipo: ‘Tem certeza que deseja fazer isto?’ ou ‘Isto vai finalizar o sistema, tem certeza que quer finalizar o sistema?’ tem efeito negativo, pois sugere ao usuário que ele fez algo que não devia. É mais adequado usar: ‘Sair agora?’ ou ‘Fazer X?’.</p>
<p>Usuários gostam de pensar que recursos parecidos devem se comportar da mesma forma. Então, se vai construir uma janela nova, pergunte-se se não existe um padrão a ser seguido. Não inove sem critério, um aplicativo cujas IUs tem aspectos funcionais diferentes umas das outras são difíceis de usar. Se o botão para sair da janela se chama &#8216;Sair&#8217;, utilize sempre assim e não &#8216;Fechar&#8217;, &#8216;Encerrar&#8217;. Se a tecla ESC fecha a tela, procure disponibilizar o mesmo atalho para todas as janelas. A janela de Contas a pagar pode ser redimensionada, então a janela de Contas a receber também o deve.</p>
<p>Tem dúvida sobre qual melhor abordagem para um recurso? Não invente, pergunte ao usuário, faça um teste de interface com ele, observe como ele interage com os botões, menus e mensagens. É a melhor forma de descobrir.</p>
<p>p.s. Acabei de digitar o texto aqui no Word, e tentei selecionar tudo usando a combinação de teclas CTRL+A, que é padrão na maioria dos editores de texto. Não preciso falar que não funcionou, lembrei que no Word é CTRL+T.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/09/27/como-desenhar-boas-interfaces-graficas-iu-com-eficiencia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>
		<item>
		<title>Coment&#225;rios no c&#243;digo. At&#233; aonde ir?</title>
		<link>http://www.brasiltech.net/agilez/2009/08/15/como-comentar-seu-codigo-fonte-de-forma-eficaz/</link>
		<comments>http://www.brasiltech.net/agilez/2009/08/15/como-comentar-seu-codigo-fonte-de-forma-eficaz/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 11:59:32 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[comentários]]></category>
		<category><![CDATA[legibilidade]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/08/15/como-comentar-seu-codigo-fonte-de-forma-eficaz/</guid>
		<description><![CDATA[Existe uma cultura entre os programadores na qual a máxima &#8216;use comentários sempre que puder e deixe seu código bem explicado&#8217; é praticamente uma lei fundamental da programação. Pouca gente discute isso, afinal, nada como um código bem documentado para torná-lo legível, certo? Nem sempre. E é sobre esta questão que eu vou falar neste [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brasiltech.net/agilez/wp-content/uploads/2009/08/codigo.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="codigo" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/08/codigo_thumb.png" border="0" alt="codigo" width="547" height="62" /></a></p>
<p>Existe uma cultura entre os programadores na qual a máxima &#8216;use comentários sempre que puder e deixe seu código bem explicado&#8217; é praticamente uma lei fundamental da programação. Pouca gente discute isso, afinal, nada como um código bem documentado para torná-lo legível, certo? Nem sempre. E é sobre esta questão que eu vou falar neste artigo. Quando devemos usar comentários? Até que ponto comentar é uma boa prática? Existem outros artifícios que podemos usar para substituir um comentário?</p>
<p>Para começar, vamos voltar um pouco pela história. Há muito tempo, os compiladores tinham uma limitação de memória, onde existia um limite de caracteres por arquivo compilável. Em consequência disso, os programadores eram obrigados a serem muito seletivos e econômicos ao codificar, usando o menor número de caracteres para nomes de operações, variáveis e etc. Imagine um complexo código de ordenação onde todas as variáveis tivessem apenas <strong>um </strong>caractere. A primeira variável seria a variável &#8216;a&#8217;, a segunda &#8216;b&#8217;, a terceira &#8216;c&#8217;. Qual seria sua reação, ao &#8216;tentar&#8217; ler esse código? Um pouco confuso, provavelmente. Nessa hora qualquer um rezaria por encontrar um código bem comentado.<span id="more-27"></span></p>
<pre class="c-sharp">Integer a = 0; //armazena o maior valor encontrado</pre>
<p>Nota-se que a origem dos comentários teve motivações bem legítimas, e eram praticamente indispensáveis.</p>
<p>Desde então, os compiladores evoluíram, o hardware mudou muito, e hoje, finalmente, não temos problema algum relacionado a limite de memória (pelo menos não significativamente) que nos limite na hora de codificar. Porém, muito da antiga cultura ainda permaneceu. Programadores mais antigos não abriram mão de suas variáveis de um caractere e continuam usando comentários para explicá-las, influenciando muitos os novos programadores, e nem todos conseguem chegar a um nível de maturidade suficiente para superar esse limite auto imposto.</p>
<p>Veja como, na linha abaixo, o comentário torna-se desnecessário, ao contrário do código anterior.</p>
<pre class="c-sharp">Integer maiorValor = 0; //armazena o maior valor encontrado</pre>
<p>Como não temos mais o limite de memória, fica fácil nomear a variável de forma a um comentário se tornar insignificante. Uma outra questão também deve ser citada: temos mais facilidade em descrever uma coisa do que dar nomes. Talvez por isso muitos programadores preferem comentar a ter que pensar em um nome que descreva o motivo da variável, função, classe e etc. Mas, mesmo assim, um bom nome é melhor e deixa o código mais fácil de ser lido e entendido. Vale a pena investir mais tempo para elaborar melhor os nomes em seu código.</p>
<p><a rel="nofollow" href="http://en.wikipedia.org/wiki/Martin_Fowler" target="_blank">Martin Fowler</a> costuma dizer que, se seu código precisa de comentários para ser entendido, então é porque ele não está bem escrito. Essa idéia está presente também nessa outra frase bem conhecida, também de sua autoria.</p>
<blockquote><p>Qualquer tolo pode escrever código que um computador pode compreender, mas bons programadores escrevem códigos que os seres humanos possam compreender. [Fowler 2000]</p></blockquote>
<p>É lógico que não podemos ser extremistas a ponto de abolir os comentários do nosso código. Muito pelo contrário. Existem ocasiões – não raras – onde comentar é essencial ou, no mínimo, construtivo.</p>
<pre class="c-sharp">/*usei int p/ manter compatibilidade com uso da dll xz.dll*/

int indice;</pre>
<p>Antes de comentar uma linha, devemos sempre nos perguntar se o comentário agrega algo, ou se apenas tenta desfazer a confusão que foi gerada pelo código. Como insistirei frequentemente daqui pra frente: bom senso é sempre fundamental.</p>
<p>Atualmente, como parte dos estudos dos princípios Grasp (abordarei o que é Grasp aqui no AgileZ em breve), na equipe em que trabalho, adotamos o costume de documentar a &#8216;motivação&#8217; que levou uma classe a ser desenvolvida, usando para isso um comentário – de no máximo umas 3 linhas – que explica o motivo da classe existir. Isso, como veremos em artigos futuros, é bem interessante e é parte de uma metodologia adotada por nossa equipe.</p>
<p>Passou longe do objetivo deste breve artigo a intenção de esgotar o assunto. Pretendo voltar discutir a questão de comentários no código quando falar sobre refatoração e também sobre usabilidade aplicada a codificação. Continuem ligados.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/08/15/como-comentar-seu-codigo-fonte-de-forma-eficaz/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programe para uma interface, n&#227;o para uma implementa&#231;&#227;o</title>
		<link>http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/</link>
		<comments>http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 00:38:32 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[simplicidade]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/</guid>
		<description><![CDATA[Um conceito simples, mas nem sempre bem entendido e aplicado. &#8216;Programar para uma interface e não para uma implementação&#8217;, você sabe o que isto significa? Apesar deste conceito ser aplicável a projetos de software, é mais antigo que ele, e é utilizado bem antes do primeiro compilador ser desenvolvido. Um exemplo bem obvio do que [...]]]></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="engrenagens" border="0" alt="engrenagens" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/08/engrenagens.jpg" width="257" height="193" /></p>
<p>Um conceito simples, mas nem sempre bem entendido e aplicado. &#8216;Programar para uma interface e não para uma implementação&#8217;, você sabe o que isto significa?</p>
<p>Apesar deste conceito ser aplicável a projetos de software, é mais antigo que ele, e é utilizado bem antes do primeiro compilador ser desenvolvido. Um exemplo bem obvio do que é isto, pode ser encontrado na casa de qualquer pessoa: um interruptor de luz. &#8216;Como assim José?&#8217;.</p>
<p>Um interruptor de luz é um exemplo muito bom. Consiste em um botão, que liga e desliga a luz. Uma <strong>interface</strong> simples, que <strong>esconde</strong> os detalhes de implementação de quem vai utilizá-la. Para ligar a luz, basta apertar o botão, e para desligá-la, adivinhem? Aperte novamente. A implementação está bem <strong>encapsulada – </strong>o usuário não precisa entender nada de pólo positivo, neutro, 127v, amperagem ou resistência. Qual foi o pensamento do designer ao projetar um interruptor de luz? Com certeza foi algo parecido com: &#8216;qual o mínimo possível de informação o usuário do meu produto precisa para usá-lo?&#8217;. </p>
<p><span id="more-19"></span>  Falando em programação de software, podemos aplicar este conceito a vários pontos. Quando estamos codificando, ao criar uma nova classe, devemos sempre nos fazer a mesma pergunta que o designer do interruptor de luz fez: &#8216;quais operações e atributos eu devo tornar públicos para que o usuário possa usá-la de forma simples?&#8217; e a cada nova implementação: &#8216;será que eu preciso expor estes parâmetros? E esse novo atributo?&#8217;. Classes com menos operações e atributos públicos, geralmente são mais simples de serem utilizadas. Lembre-se sempre: outros programadores terão que interagir com as classes e bibliotecas que você desenvolveu. Mantenha a simplicidade e procure ser objetivo.
</p>
<p>Ao criar uma nova tela de cadastro, analogamente: &#8216;quais controles o usuário vai precisar para executar as operações a qual a janela se destina?&#8217;. Um erro muito comum cometido por projetistas de interfaces gráficas é transmitir a forma de funcionamento interno do algoritmo para o usuário. O clássico exemplo são as telas de cadastro. Todo mundo desenvolve, ou já desenvolveu, uma tela com os famosos botões <strong>novo, editar, cancelar, excluir </strong>e<strong> salvar</strong>, pois é a forma como o seu algoritmo funciona, e fica mais fácil publicar essa característica para o usuário. Mas, será que o usuário realmente precisa de um botão &#8216;editar&#8217; quando ele quer editar um registro? Não seria mais fácil o seu sistema detectar que alguém está tentando alterar um registro e simplesmente entrar em modo de edição, como funciona, por exemplo, um editor de texto? Um botão a menos na tela, na maioria das vezes, pode significar uma interface mais simples – que é o sonho de todo usuário.</p>
<p>Poderia citar dezenas de exemplo aqui, mas a idéia não muda. Um carro com câmbio automático é muito melhor do que um no qual você precisa apertar a embreagem para trocar de marcha. E ambos funcionam, só que o primeiro é mais simples.</p>
<p>É lógico que, ao começar a <strong>pensar </strong>dessa forma, o programador vai sentir necessidade de amparo por algumas técnicas que ele pode ainda não dominar – técnicas que serão abordadas por aqui – como padrões de projetos ou Grasp. Um caminho que provavelmente não terá volta, e fará de você um melhor projetista de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/08/09/como-programar-para-uma-interface-e-nao-para-uma-implementacao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
