<?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; interface</title>
	<atom:link href="http://www.brasiltech.net/agilez/tag/interface/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>Programando orientado a interface</title>
		<link>http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/</link>
		<comments>http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 01:44:43 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[código limpo]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/</guid>
		<description><![CDATA[Se você programa em alguma linguagem de programação orientada a objeto, com certeza conhece os termos “Private”, “protected” e “public” e muito provavelmente sabe para que eles servem. Métodos ou membros públicos são aqueles que podem ser acessados por outras classes, os protegidos apenas pelos descendentes e os privados só possuem visibilidade local, ou seja, [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0px 15px 0px 0px; display: inline; border: 0px;" title="transito_confuso" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/08/transito_confuso.jpg" border="0" alt="transito_confuso" width="183" height="240" align="left" /></p>
<p>Se você programa em alguma linguagem de programação orientada a objeto, com certeza conhece os termos “<em>Private”</em>, “<em>protected”</em> e “<em>public”</em> e muito provavelmente sabe para que eles servem. Métodos ou membros públicos são aqueles que podem ser acessados por outras classes, os protegidos apenas pelos descendentes e os privados<em> </em>só possuem visibilidade local, ou seja, dentro da própria classe. Parece simples, porém, é muito comum encontrar programadores que parecem não seguir critério algum ao definir o nível de visibilidade dos membros de suas classes, ou então aplicam alguma metodologia aleatória para este fim. Propriedades que eram protegidas<em> </em>são publicadas<em> </em>durante o desenvolvimento de outras classes clientes, conforme a necessidade. Classes “amigáveis” (class friendly) são criadas para permitir acesso a funções protegidas. Práticas como essas acabam por criar uma arquitetura extremamente confusa, com componentes de difícil entendimento, difíceis de serem testados e expandidos. Qual seria então o melhor critério para evitar esse tipo de problema?</p>
<p><span id="more-148"></span></p>
<p>Ao desenhar uma classe devemos ter uma ideia bem clara de qual a responsabilidade dela, caso contrário, coloque em dúvida a necessidade de criá-la. O raciocínio é simples: se não sabemos o que a classe deve fazer, então não precisamos dela. Após a definição clara de qual é a responsabilidade da classe, levando em consideração a coesão e nível de acoplamento desejado, devemos pensar sobre a sua interface. Para entender melhor, basta imaginar como a classe deve ser vista por suas classes clientes, ou seja, as classes ou componentes que irão utilizá-las. Apenas métodos e propriedades que permitam acesso e manipulação de dados relacionados à responsabilidade da classe devem ser públicos. Você deve fazer isso não para impedir que outros acessem dados internos de suas classes, mas, principalmente, para garantir que elas sejam mais legíveis, inteligíveis e fáceis de usar. O ideal é que qualquer programador do mundo possa, apenas lendo os métodos públicos de sua classe, dizer qual a responsabilidade dela, e quais métodos chamar, e como chamá-los para conseguir usufruir de suas funcionalidades. Se você não se preocupar em publicar apenas o que for necessário, sua classe corre o risco de ficar confusa demais e difícil de utilizar.</p>
<p>Uma analogia com o mundo real pode ajudá-lo a entender melhor esse raciocínio: imagine um carro onde, junto com os pedais de freio e embreagem, tivessem outros controles estranhos, como um pedal pra regular o nível do óleo e outro para ativar e controlar a bomba de gasolina. Esse carro faria com que o condutor ficasse bem confuso, e tentasse regular o consumo de gasolina manualmente enquanto dirige (um absurdo, não?).</p>
<p>Voltando ao mundo dos bits, por exemplo, se sua classe possuir uma coleção de itens, seria bom deixar claro se ela é dona deles e apenas ela deve poder removê-los ou incluí-los em seu container. Para isso, não disponibilize em sua interface métodos que dão acesso direto a lista, procurando sempre usar o encapsulamento onde for necessário e disponibilizando um iterador.</p>
<p><img style="display: inline; border: 0px;" title="diagrama 1" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/08/diagrama1.jpg" border="0" alt="diagrama 1" width="602" height="348" /></p>
<p>Se ela exigir passagem de parâmetros de inicialização, providencie construtores personalizados, onde a classe cliente possa passar os parâmetros necessários. Esse tipo de design facilita a leitura e entendimento de quem a for utilizar.</p>
<p><img style="display: inline; border: 0px;" title="diagrama 2" src="http://www.brasiltech.net/agilez/wp-content/uploads/2010/08/diagrama2.jpg" border="0" alt="diagrama 2" width="346" height="282" /></p>
<p>Tenha sempre esse conceito em mente: as classes clientes visualizam apenas os métodos publicados, e devem &#8211; apenas se baseando no que enxergam &#8211; entender a responsabilidade e como usar os recursos da classe servidora. Algumas ferramentas muito importantes, como o TDD (desenvolvimento orientado a testes) são extremamente eficazes e – se usadas corretamente – funcionam automaticamente como guias forçando o desenvolvedor a escrever uma interface simples e fácil de usar. Pretendo escrever um artigo sobre esse tema relacionado ao TDD em breve. Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2010/08/22/programando-orientado-a-interface/feed/</wfw:commentRss>
		<slash:comments>2</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>

