<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Alexandre Gama</title>
	<atom:link href="http://alexandregama.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexandregama.wordpress.com</link>
	<description>Sobre desenvolvimento, boas práticas e discussões</description>
	<lastBuildDate>Sun, 12 May 2013 16:36:17 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='alexandregama.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/4b1b4449471dbabbb4c9b0c308c584b4?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Alexandre Gama</title>
		<link>http://alexandregama.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://alexandregama.wordpress.com/osd.xml" title="Alexandre Gama" />
	<atom:link rel='hub' href='http://alexandregama.wordpress.com/?pushpress=hub'/>
		<item>
		<title>SOLID &#8211; Princípio da Responsabilidade Única</title>
		<link>http://alexandregama.wordpress.com/2012/05/14/solid-principio-da-responsabilidade-unica/</link>
		<comments>http://alexandregama.wordpress.com/2012/05/14/solid-principio-da-responsabilidade-unica/#comments</comments>
		<pubDate>Mon, 14 May 2012 20:26:27 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[SRP]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=672</guid>
		<description><![CDATA[Olá Pessoal! Muito se tem falado sobre boas práticas e bom design de código. Se você gosta de trabalhar profissionalmente no seu código e se gosta de facilitar a manutenção do seu código, com toda certeza já precisou aprender sobre alguns padrões e técnicas para isso. Muitos destes padrões e técnicas são antigos, datados desde [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=672&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Olá Pessoal!</p>
<p>Muito se tem falado sobre boas práticas e bom design de código. Se você gosta de trabalhar profissionalmente no seu código e se gosta de facilitar a manutenção do seu código, com toda certeza já precisou aprender sobre alguns <a title="Design Patterns" href="http://en.wikipedia.org/wiki/Software_design_pattern" target="_blank">padrões</a> e <a href="http://www.cs.colorado.edu/~kena/classes/5828/s10/presentations/softwaredesign.pdf" target="_blank">técnicas</a> para isso.</p>
<p>Muitos destes padrões e técnicas são antigos, datados desde 2000 mas infelizmente ainda encontramos grande parte dos códigos com preocupação alguma de manutenibilidade, facilidade de reuso, com bom desempenho, etc.</p>
<p>Isso me motivou a falar um pouco sobre um dos princípios <a title="SOLID" href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">S.O.L.I.D.</a> Este é um acrônimo para <strong>Single responsibility, Open-closed, Liskov substitution, Interface segregation e Dependency inversion</strong>. Este termo foi criado por <a title="Uncle Bob" href="http://en.wikipedia.org/wiki/Robert_C._Martin" target="_blank">Robert C. Martin(Uncle Bob)</a> para unir alguns padrões muito utilizados no Design Orientado a Objetos, que visam facilitar a manutenção, legibilidade e vida do nosso código.</p>
<p>É quase uma arte desenvolver utilizando alguns desses padrões e com toda certeza a próxima equipe a modificar o seu código(inclusive você mesmo!) vai agradecer.</p>
<p>Hoje falaremos sobre o <strong>Single Responsiblity Principle</strong>, que é um padrão extremamente simples e muitas vezes absurdamente ignorado. A regra é simples: Uma classe só deve ter uma, e somente uma, razão para ser modificada. Simples assim!</p>
<p>Então isso quer dizer que se eu criar somente um método para a minha classe, com toda certeza ela só terá uma responsabilidade certo? Não é por aí. Na verdade o princípio nos diz <strong>o que</strong> uma classe deve fazer e <strong>não como</strong> ela deve fazer. Assim, uma classe poderá ser responsável por uma funcionalidade que pode precisar de 5 métodos para tal realização.</p>
<p>Mas vamos analisar um pequeno código para visualizarmos com mais facilidade este princípio:</p>
<pre class="brush: java; title: ; notranslate">
public class Departamento {

	public void calculaNotaFiscal() {
		// seu código para calculo da nota fiscal
	}

	public void calculaPagamentoDeFuncionarios() {
		// seu código para cálculo do pagamento
	}

	public void verificaInadimplenciaDeClientes() {
		// seu código para a verificação de inadimplência
	}
}
</pre>
<p>O que esta classe faz? Bom, ela calcula nota fiscal <strong>e </strong>calcula pagamento <strong>e </strong>verifica inadimplência. Estes &#8220;<strong>es</strong>&#8221; não estão aí atoa. Eles indicam fortemente que a nossa classe tem mais de uma razão para ser modificada, contrariando a nossa simples regra!</p>
<p>Caso o cálculo da nota fiscal precise ser atualizado, modificaremos a classe Departamento. E se o cálculo de pagamento precisar ser melhorado? A classe Departamento também precisará ser modificada.</p>
<p>Observamos aqui que a classe Departamento possui pelo menos 3 motivos para ser modificada e isso não é nada legal. Não será nada divertido modificarmos a classe Departamento toda ver que um requisito for atualizado.</p>
<p>Então para respeitarmos o nosso princípio, poderíamos criar <strong>uma classe</strong> para <strong>cada responsabilidade</strong>. Um exemplo seria:</p>
<pre class="brush: java; title: ; notranslate">
public class NotaFiscal {

	public void calculaNotaFiscal() {
		// seu código para cálculo da nota fiscal
	}

}
</pre>
<p>&nbsp;</p>
<pre class="brush: java; title: ; notranslate">
public class CalculadoraDePagamento {

	public void calculaPagamentoDeFuncionarios() {
		// seu código para cálculo do pagamento
	}

}
</pre>
<p>&nbsp;</p>
<pre class="brush: java; title: ; notranslate">
public class VerificadorDeInadimplencia {

	public void verificaInadimplenciaDeClientes() {
		// seu código para a verificação de inadimplência
	}

}
</pre>
<p>Agora o nosso código ficou muito mais interessante. <strong>Cada classe agora tem uma, e somente uma, razão para ser modificada</strong>. Lembrando que cada classe poderá conter quantos métodos forem necessários para que a sua funcionalidade seja satisfeita.</p>
<p>Observe também que com <a href="http://www.k19.com.br/artigos/?s=tdd" target="_blank">Testes de Unidade</a> você tem uma facilidade muito maior para identificar possíveis quebras do <strong>Single Responsibility Principle</strong>.</p>
<p>Muitas vezes com um simples princípio e com um simples refactoring conseguimos elevar o nível do nosso código e trabalhar de forma muito mais profissional.</p>
<p>É isso pessoal!</p>
<p>Abraços!</p>
<p>Alexandre Gama.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/672/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/672/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=672&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2012/05/14/solid-principio-da-responsabilidade-unica/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>
	</item>
		<item>
		<title>GitHub e Git &#8211; Colaboração e Organização</title>
		<link>http://alexandregama.wordpress.com/2012/04/10/github-e-git-colaboracao-e-organizacao/</link>
		<comments>http://alexandregama.wordpress.com/2012/04/10/github-e-git-colaboracao-e-organizacao/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 21:34:31 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[controle de versão]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[repositorio]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=644</guid>
		<description><![CDATA[Olá Pessoal! Recentemente precisei migrar alguns projetos que utilizavam SVN para o Git e resolvi fazer um post falando um pouquinho sobre o Git e seu amigão GitHub. Então vamos lá! Git Hoje dificilmente um projeto não possui um controle de versão. Se o seu projeto de produção não possui um controle de versão, de [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=644&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://alexandregama.files.wordpress.com/2012/04/github_logo.png"><img class="alignleft size-thumbnail wp-image-660" title="github_logo" src="http://alexandregama.files.wordpress.com/2012/04/github_logo.png?w=150&#038;h=150" alt="" width="150" height="150" /></a>Olá Pessoal!</p>
<p>Recentemente precisei migrar alguns projetos que utilizavam <a title="SVN" href="http://subversion.tigris.org/" target="_blank">SVN</a> para o <a title="Git" href="http://git-scm.com/" target="_blank">Git</a> e resolvi fazer um post falando um pouquinho sobre o Git e seu amigão <a title="GitHub" href="www.github.com" target="_blank">GitHub</a>. Então vamos lá!</p>
<p><strong>Git</strong><br />
Hoje dificilmente um projeto não possui um <a href="http://en.wikipedia.org/wiki/Revision_control" target="_blank">controle de versão</a>. Se o seu projeto de produção não possui um controle de versão, de verdade, corra para criar um! Sobreviver sem um controle é realmente assustador, digno de um herói, ainda mais com equipes grandes e distribuídas.</p>
<p>Durante muito tempo foi usado o CVS e, em seguida, o SVN veio para corrigir algumas falhas do CVS e adicionar <a href="http://www.pushok.com/software/svn-vscvs.html" target="_blank">interessantes funcionalidades</a>. Diversos são os motivos para a adoção do Git:</p>
<p>- Branches facilitados e independentes<br />
- Merges facilitados (quem já usou CVS sabe o quão sofrível é realizar merges)<br />
- Mais rápido<br />
- Distribuído<br />
- Pode ocupar menos espaço que um checkout SVN<br />
- Integração com o GitHub</p>
<p>Não entrarei em detalhes sobre estes pontos pois renderiam diversos outros artigos, mas entraremos em detalhes sobre a sua instalação logo mais.</p>
<p><strong>GitHub</strong><br />
O GitHub é a <a href="http://www.readwriteweb.com/archives/github_a_social_network_for_programmers.php" target="_blank">rede para programadores</a>. Nele podemos criar repositórios (públicos e privados) para os  nossos projetos, seguir outros desenvolvedores, baixar projetos, modificar projetos, receber atualizações de modificações de projetos, etc.</p>
<p>Diversos projetos grandes já estão no GitHub e você já pode até dar uma olhadinha no código fonte deles! Dentre os projetos encontramos o JQuery, Eclipse, VRaptor, Twitter e muito mais! Abaixo listei alguns repositórios:</p>
<p>- <a title="VRaptor" href="https://github.com/caelum/vraptor" target="_blank">VRaptor</a><br />
- <a href="https://github.com/jquery/jquery" target="_blank">JQuery</a><br />
- <a title="Eclipse" href="https://github.com/eclipse/" target="_blank">Eclipse</a></p>
<p><strong>E qual a relação do Git com o GitHub?</strong><br />
A relação é simples: os dois se integram de forma bem simples! Podemos criar um repositório no GitHub e simplesmente &#8220;commitar&#8221; as alterações do nosso projeto git, tornando-o público!<br />
Como exemplo vamos criar um pequeno projeto e torná-lo público no GitHub, utilizando o Git.</p>
<p><strong>Instalando o Git</strong><br />
Como o meu dia a dia é desenvolvendo com Linux (Ubuntu), faremos a instalação neste ambiente. Vamos lá:</p>
<p>Para a instalação basta abrirmos o terminal e digitar:</p>
<pre class="brush: java; title: ; notranslate">
sudo apt-get install git-core
</pre>
<p>Ele mostrará o espaço necessário para a instalação e mostrará quais os pacotes que serão instalados. Basta confirmar que todos os pacotes serão baixados e instalados.<br />
Pronto! Nosso Git está instalado. Agora vamos configurá-lo. Nesta etapa você indicará o seu <strong>Nome </strong>e o seu<strong> Email</strong>. Ainda no Terminal digite:</p>
<pre class="brush: java; title: ; notranslate">
git config --global user.name &quot;Seu nome aqui&quot;
git config --global user.email &quot;seuemail@seudominio.com&quot;
</pre>
<p>Para verificar se deu tudo certo basta digitar no Terminal:</p>
<pre class="brush: java; title: ; notranslate">
git config --global --list
</pre>
<p>Assim serão listadas as configurações recém criadas.</p>
<p>Agora vamos criar um repositório lá no GitHub. Entre no GitHub, entre no seu perfil e clique em <em>New Repository</em>, colocando o nome do seu projeto, no nosso caso &#8220;my-first-project-git&#8221;. O projeto criado será público mas é possível criar repositórios privados.</p>
<p>Com o nosso repositório criado no GitHub vamos criar o nosso projeto agora localmente. No Terminal vamos criar um diretório para o nosso projeto e iniciar o repositório do Git:</p>
<pre class="brush: java; title: ; notranslate">
mkdir my-first-project-git
cd my-first-project-git
git init
</pre>
<p>Agora vamos criar um arquivo <em>Readme</em> e adicionar um repositório ao git. Repare que o <em>origin </em>é apenas um apelido para o nosso projeto.</p>
<pre class="brush: java; title: ; notranslate">
git remote add origin git@github.com:seuloginnogithub/my-first-project-git.git
touch  README
</pre>
<p>Tudo certo até aqui. Criamos o nosso projeto no GitHub, criamos o nosso projeto localmente com o Git e agora vamos subir o nosso projeto para o GitHub. Mas antes de subirmos o projeto, precisamos gerar uma <a href="http://rcsg-gsir.imsb-dsgi.nrc-cnrc.gc.ca/documents/internet/node31.html" target="_blank">chave ssh</a>. Podemos gerar uma chave com o seguinte comando no Terminal:</p>
<pre class="brush: java; title: ; notranslate">
ssh-keygen -t rsa -C &quot;seu comentario&quot;
</pre>
<p>Ele mostrará o diretório onde será salva a nossa chave e você também informará uma senha. Pronto! Chave criada! Agora precisamos acessar a nossa <a href="github.com/account" target="_blank">conta</a> no GitHub, clicar em <em>SSH Keys</em> e inserir o conteúdo exato que foi gerado na chave. Para pegar o conteúdo basta digitar o seguinte comando:</p>
<pre class="brush: java; title: ; notranslate">
cat ~/.ssh/id_rsa.pub
</pre>
<p>Desta forma já podemos acessar o nosso GitHub!</p>
<p>Para adicionar o nosso arquivo <em>Readme</em> e &#8220;comitá-lo&#8221; basta digitarmos os seguintes comandos:</p>
<pre class="brush: java; title: ; notranslate">
git add README
git commit -m &quot;aqui vai seu comentario&quot;
</pre>
<p>Repare que neste momento fizemos o commit localmente mas ainda não enviamos para o GitHub. Para enviar basta digitar o seguinte comando:</p>
<pre class="brush: java; title: ; notranslate">
git push -u origin master
</pre>
<p>Pronto! Agora você pode acessar o seu GitHub e ver o projeto que acabamos de criar. Simples, prático e divertido!</p>
<p>No próximo artigo avançaremos sobre os comandos mais utilizados pelo Git e como podemos modificar projetos já existentes no GitHub.</p>
<p>Não poderei disponibilizar os projetos privados mas disponibilizarei alguns outros projetos públicos no <a href="https://github.com/alexandregama/" target="_blank">meu GitHub</a> para podermos compartilhar conhecimento e experiência. Podem seguir =)</p>
<p>Até mais!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/644/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/644/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=644&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2012/04/10/github-e-git-colaboracao-e-organizacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2012/04/github_logo.png?w=150" medium="image">
			<media:title type="html">github_logo</media:title>
		</media:content>
	</item>
		<item>
		<title>JSON Simples e Prático, Parte II</title>
		<link>http://alexandregama.wordpress.com/2012/02/23/json-simples-e-pratico-parte-ii/</link>
		<comments>http://alexandregama.wordpress.com/2012/02/23/json-simples-e-pratico-parte-ii/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 18:30:33 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[language javascript]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=597</guid>
		<description><![CDATA[Fala pessoal! Seguindo a ideia do post anterior sobre JSON, hoje vamos a um exemplo mais palpável, real e divertido: Simular uma integração com o famoso Facebook! O Facebook, assim como diversos sistemas, disponibiliza acesso aos seus recursos através de alguns métodos. A este conjunto de métodos, damos o nome de API. Como visto no [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=597&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://alexandregama.files.wordpress.com/2012/02/facebook-api.jpg"><img class="alignleft size-thumbnail wp-image-627" title="facebook-api" src="http://alexandregama.files.wordpress.com/2012/02/facebook-api.jpg?w=150&#038;h=115" alt="" width="150" height="115" /></a>Fala pessoal!</p>
<p>Seguindo a ideia do <a title="JSON parte I" href="http://alexandregama.wordpress.com/2011/12/19/json-simples-e-pratico-parte-i/" target="_blank">post</a> anterior sobre JSON, hoje vamos a um exemplo mais palpável, real e divertido: Simular uma integração com o famoso <a title="Eu!" href="https://www.facebook.com/alexandre.gama.lima" target="_blank">Facebook</a>!</p>
<p>O Facebook, assim como diversos sistemas, disponibiliza acesso aos seus recursos através de alguns métodos. A este conjunto de métodos, damos o nome de <a title="API Wikipedia" href="http://en.wikipedia.org/wiki/Application_programming_interface" target="_blank">API</a>.<br />
Como visto no artigo anterior, JSON é um documento com uma estrutura bem bacana de se trabalhar.</p>
<p>Veja o JSON que o Facebook retorna quando chamamos certo método:</p>
<pre class="brush: jscript; title: ; notranslate">
{
   &quot;id&quot;: &quot;19292868552&quot;,
   &quot;name&quot;: &quot;Facebook Platform&quot;,
   &quot;likes&quot;: 4190683,
   &quot;category&quot;: &quot;Product/service&quot;,
   &quot;is_published&quot;: true,
   &quot;website&quot;: &quot;http://developers.facebook.com&quot;,
   &quot;username&quot;: &quot;platform&quot;,
   &quot;founded&quot;: &quot;2007&quot;,
   &quot;mission&quot;: &quot;To make the web more open and social.&quot;,
   &quot;talking_about_count&quot;: 98577
}
</pre>
<p>Interessante não? Muito fácil de ler e encontrar os dados que precisamos. Temos o id, name, likes e muitas outras informações.</p>
<p>Agora imagine que a nossa aplicação precisa buscar os dados de um post específico que foi colocado no Facebook. Podemos imaginar também que precisaríamos persistir esses dados em um banco pra futuras comparações, pesquisas, etc.</p>
<p>No nosso caso usaremos este post para estudo: www.facebook.com/98423808305.</p>
<p>Nao vou prolongar sobre a API do Facebook, mas para usá-la podemos usar o Graph API que o Facebook disponibiliza. Aqui temos o core da API, onde podemos ter diversos métodos para as diversas chamadas que precisamos. Caso você precise desenvolver uma app para o Face, este será o local mais <del>odiado</del> visitado por você! = )</p>
<p>Agora que você já sabe sobre a existência do Graph API, vamos usá-la!</p>
<p>Para o nosso exemplo vamos usar a seguinte URL:<br />
<a href="https://graph.facebook.com/98423808305" target="_blank">https://graph.facebook.com/98423808305</a></p>
<p>Repare que ao clicar na URL, já temos o retorno em JSON! Isso mesmo, simples assim! Para o nosso projeto vamos precisar do Id e dos dados do From (Name e Category).</p>
<p>A primeira classe que criaremos é muito simples, somente para conseguirmos fazer uma chamada GET na url acima e receber o seu retorno.</p>
<pre class="brush: java; title: ; notranslate">

package br.com.artigo.json;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class Http {

    public String chamaUrl(String url) throws IOException {
      URL facebook = new URL(url);
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(facebook.openStream()));

      String retornoJson;

      StringBuilder builder = new StringBuilder();
      while ((retornoJson = bufferedReader.readLine()) != null)
        builder.append(retornoJson);

      bufferedReader.close();

      return builder.toString();
    }
}
</pre>
<p>A segunda classe criada será um <a title="POJO" href="http://pt.wikipedia.org/wiki/Plain_Old_Java_Objects" target="_blank">POJO </a>que conterá as informações que precisamos (id, name e category) vindas do facebook. Repare que esta classe facilmente poderia ser <a title="Persist JPA" href="http://docs.jboss.org/hibernate/orm/3.6/quickstart/en-US/html/hibernate-gsg-tutorial-jpa.html" target="_blank">persistida</a>, bastando inserir as anotações do <a title="JPA" href="http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html" target="_blank">JPA </a>por exemplo! = )</p>
<pre class="brush: java; title: ; notranslate">
package br.com.artigo.json;

public class Facebook {

	private String id;

	private String name;

	private String category;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCategory() {
		return category;
	}

	public void setCategory(String category) {
		this.category = category;
	}

	@Override
	public String toString() {
		return &quot;Facebook [id=&quot; + id + &quot;, name=&quot; + name + &quot;, category=&quot;
				+ category + &quot;]&quot;;
	}

}
</pre>
<p>A terceira classe é a <strong>ArtigoJson</strong> que será a classe principal. Ela usará a classe <strong>Http </strong>para fazer a chamada simples da API e trabalhará com o retorno JSON.</p>
<pre class="brush: java; title: ; notranslate">
package br.com.artigo.json;

import java.io.IOException;
import java.util.Map;
import net.sf.json.JSONObject;

public class ArtigoJson {

	private static final String HTTPS_GRAPH_FACEBOOK = &quot;https://graph.facebook.com/98423808305&quot;;

	@SuppressWarnings(&quot;unchecked&quot;)
	public static void main(String[] args) throws IOException {
		//Retorno JSON
		JSONObject object = chamadaHttp();
		System.out.println(object);

		//Retorno dos dados que precisamos
		String id = (String) object.get(&quot;id&quot;);
		Map map = (Map) object.get(&quot;from&quot;); //Que interessante! Um cast para um Map!
		String name = map.get(&quot;name&quot;);
		String category = map.get(&quot;category&quot;);

		//Populando o objeto facebook para persistencia
		Facebook facebook = new Facebook();
		facebook.setId(id);
		facebook.setName(name);
		facebook.setCategory(category);

		//Impressão do objeto
		System.out.println(facebook);
	}

	private static JSONObject chamadaHttp() throws IOException {
		Http http = new Http();
		String retornoJson = http.chamaUrl(HTTPS_GRAPH_FACEBOOK);
		JSONObject objetoJson = JSONObject.fromObject(retornoJson);

		return objetoJson;
	}
}
</pre>
<p>Ao fazer a chamada, podemos ver um trecho do retorno:</p>
<pre class="brush: jscript; title: ; notranslate">
{&quot;id&quot;:&quot;98423808305&quot;,
   &quot;from&quot;:
      {&quot;name&quot;:&quot;Coca-Cola&quot;,&quot;category&quot;:&quot;Food/beverages&quot;,&quot;id&quot;:&quot;40796308305&quot;}
}
</pre>
<p>Olha que simples! Temos neste trecho as informações que precisamos! = )<br />
Como no artigo anterior, podemos fazer uma chamada usando uma chave. Repare que fizemos a primeira chamada usando a chave <strong>id:</strong></p>
<pre class="brush: java; title: ; notranslate">
//Retorno dos dados que precisamos
String id = (String) object.get(&quot;id&quot;);
</pre>
<p>Mas o mais interessante nas chamadas é o cast para um <strong><a title="Java MAP" href="http://docs.oracle.com/javase/6/docs/api/java/util/Map.html" target="_blank">Map</a></strong>!</p>
<pre class="brush: java; title: ; notranslate">
Map map = (Map) object.get(&quot;from&quot;);
</pre>
<p>Agora podemos obter os nossos dados pelo próprio Map e popular o nosso objeto <strong>facebook!</strong></p>
<p>É isso pessoal! Artigo bem simples para o pessoal que está começando, somente pra mostrar uma das formas de utilização do JSON.</p>
<p>Você também pode encontrar este código no meu <a href="https://gist.github.com/1894280" target="_blank">Gist Público</a>.</p>
<p>Até mais!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/597/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=597&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2012/02/23/json-simples-e-pratico-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2012/02/facebook-api.jpg?w=150" medium="image">
			<media:title type="html">facebook-api</media:title>
		</media:content>
	</item>
		<item>
		<title>JSON Simples e Prático, Parte I</title>
		<link>http://alexandregama.wordpress.com/2011/12/19/json-simples-e-pratico-parte-i/</link>
		<comments>http://alexandregama.wordpress.com/2011/12/19/json-simples-e-pratico-parte-i/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 01:14:35 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Padrões]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=538</guid>
		<description><![CDATA[Fala pessoal! Esta semana percebi que muitos ainda não conhecem ou continuam na dúvida sobre o que é JSON e resolvi contribuir com mais um artigo. Afinal, o que é JSON? JSON é basicamente um formato leve de troca de informações/dados entre sistemas. Mas JSON significa JavaScript Object Notation, ou seja, só posso usar com [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=538&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://alexandregama.files.wordpress.com/2011/12/json.png"><img class="alignleft  wp-image-539" title="JSON" src="http://alexandregama.files.wordpress.com/2011/12/dojo4_1.png?w=259&#038;h=222" alt="" width="259" height="222" /></a>Fala pessoal!</p>
<p>Esta semana percebi que muitos ainda não conhecem ou continuam na dúvida sobre o que é JSON e resolvi contribuir com mais um artigo.</p>
<p><span style="color:#000000;"><strong>Afinal, o que é JSON?</strong></span><br />
JSON é basicamente um formato leve de troca de informações/dados entre sistemas. Mas JSON significa <strong>JavaScript Object Notation</strong>, ou seja, só posso usar com JavaScript correto? Na verdade não e alguns ainda caem nesta armadilha.</p>
<p>O JSON além de ser um formato leve para troca de dados é também muito simples de ler. Mas quando dizemos que algo é simples, é interessante compará-lo com algo mais complexo para entendermos tal simplicidade não é? Neste caso podemos comparar o JSON com o formato XML.</p>
<p><span style="color:#000000;"><strong>Vamos visualizar esta diferença?</strong></span></p>
<pre class="brush: xml; title: ; notranslate">
  &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
    &lt;id&gt;1&lt;/id&gt;
    &lt;nome&gt;Alexandre Gama&lt;/nome&gt;
    &lt;endereco&gt;R. Qualquer&lt;/endereco&gt;
</pre>
<pre class="brush: jscript; title: ; notranslate">
  {&quot;id&quot;:1,&quot;nome&quot;:&quot;Alexandre Gama&quot;, &quot;endereco&quot;:&quot;R. Qualquer&quot;}
</pre>
<p>Bom, é notável a diferença. Visualmente o segundo trecho (em JSON) é mais fácil de ler. Mas só existe essa diferença entre os dois? Na verdade não. Podemos listar algumas outras vantagens:</p>
<p><span style="color:#000000;"><strong>Vantagens do JSON:</strong></span><br />
- Leitura mais simples</p>
<p>- Analisador(parsing) mais fácil</p>
<p>- JSON suporta objetos! Sim, ele é tipado!</p>
<p>- Velocidade maior na execução e transporte de dados</p>
<p>- Arquivo com tamanho reduzido</p>
<p>- Quem utiliza? Google, Facebook, Yahoo!, Twitter&#8230;</p>
<p>Estas são algumas das vantagens apresentadas pelo JSON. Agora vamos ao que interessa: Código! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Vamos fazer um exemplo extremamente simples nesta primeira parte e avançaremos no próximo artigo, inclusive falando sobre JSON em páginas Web.</p>
<p><span style="color:#000000;"><strong>Qual biblioteca usar?</strong></span><br />
Existem <a title="Bibliotecas JSON" href="http://www.json.org/" target="_blank">diversas bibliotecas</a> para trabalharmos com JSON e Java. Usaremos no nosso estudo o json.jar que você pode baixar tranquilamente <a title="json.jar" href="http://code.google.com/p/wave-robot-java-client/downloads/detail?name=json.jar&amp;can=4&amp;q=" target="_blank">neste link</a></p>
<p>O nosso caso de estudo será simples: Teremos uma classe <em><strong>Carro</strong> </em>que será a nossa classe <a title="pojo" href="http://pt.wikipedia.org/wiki/Plain_Old_Java_Objects" target="_blank">POJO</a> e a classe <em><strong>EstudoJSON</strong> </em>que terá o nosso famoso método <em><strong>main</strong></em>.</p>
<p>Classe <strong><em>Carro</em></strong></p>
<pre class="brush: java; title: ; notranslate">
package br.com.json;

public class Carro {
	private Long id;
	private String modelo;
	private String placa;

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getModelo() {
		return modelo;
	}
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
	public String getPlaca() {
		return placa;
	}
	public void setPlaca(String placa) {
		this.placa = placa;
	}

        //Aqui fizemos o Override do método toString() para visualizar a impressão com o System.out.println()
	@Override
	public String toString() {
		return &quot;[id=&quot; + id + &quot;, modelo=&quot; + modelo + &quot;, placa=&quot; + placa
				+ &quot;]&quot;;
	}

}
</pre>
<p>Esta é uma classe simples, onde temos os atributos Id, Modelo e Placa.</p>
<p>Agora teremos a classe <em><strong>EstudoJSON</strong></em></p>
<pre class="brush: java; title: ; notranslate">
package br.com.json;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class EstudoJSON {
	public static void main(String[] args) throws JSONException {
		adicaoSimplesDeDados();
	}
}
</pre>
<p>Repare que criamos o método <em>adicaoSimplesDeDados()</em> que conterá o código de exemplo:</p>
<pre class="brush: java; title: ; notranslate">
private static void adicaoSimplesDeDados() throws JSONException {
    //Criação do objeto carro e atribuição dos valores
	Carro carro = new Carro();
	carro.setId(1l);
	carro.setModelo(&quot;Celta&quot;);
	carro.setPlaca(&quot;AAA1234&quot;);

    //Criação do objeto carroJson
	JSONObject carroJson = new JSONObject();
    //Inserção dos valores do carro no objeto JSON
	carroJson.put(&quot;id&quot;, carro.getId());
	carroJson.put(&quot;Modelo&quot;, carro.getModelo());
	carroJson.put(&quot;Placa&quot;, carro.getPlaca());

    //Impressão do objeto JSON
	System.out.println(carroJson);
}
</pre>
<p>Se executarmos este código, veremos que foi impresso no console o seguinte:</p>
<pre class="brush: jscript; title: ; notranslate">
{&quot;id&quot;:1,&quot;Modelo&quot;:&quot;Celta&quot;,&quot;Placa&quot;:&quot;AAA1234&quot;}
</pre>
<p>Você desenvolvedor mais atento vai reparar que existe um objeto impresso: Um <em>Long</em>! Isso mesmo! Como vimos, o JSON consegue armazenar objetos! Podemos inclusive armazenar um objeto do tipo <em>Carro</em> mesmo:</p>
<p>Modificamos o nosso método main:</p>
<pre class="brush: java; title: ; notranslate">
public class EstudoJSON {
	public static void main(String[] args) throws JSONException {
		adicaoSimplesDeDados();

        adicaoDeUmObjeto();
	}
}
</pre>
<p>E adicionamos o método <em>adicaoDeUmObjeto()</em>:</p>
<pre class="brush: java; title: ; notranslate">
private static void adicaoDeUmObjeto() throws JSONException {
	Carro carro = new Carro();
	carro.setId(1l);
	carro.setModelo(&quot;Celta&quot;);
	carro.setPlaca(&quot;AAA1234&quot;);

	JSONObject carroJson = new JSONObject();
    //Adição do objeto carro
	carroJson.put(&quot;Carro&quot;, carro);

	System.out.println(carroJson);
}
</pre>
<p>Neste caso foi impresso no console o seguinte:</p>
<pre class="brush: jscript; title: ; notranslate">
{&quot;Carro&quot;:&quot;[id=1, modelo=Celta, placa=AAA1234]&quot;}
</pre>
<p>Simples não?<br />
Como o JSON trabalha com coleção de pares nome/valor, podemos imprimir um valor específico simplesmente chamando o nome que desejamos.</p>
<pre class="brush: java; title: ; notranslate">
System.out.println(carroJson.get(&quot;Modelo&quot;));
</pre>
<p>Veja que neste caso queremos somente o modelo do carro, bastando fazer a chamada get(&#8220;nome que desejamos&#8221;)!</p>
<p><span style="color:#000000;"><strong>Conclusão</strong></span><br />
É isso pessoal! Vimos as vantagens do JSON e vimos como é simples começar a trabalhar com ele. Nos próximos artigos veremos exemplos mais complexos e veremos algo mais real onde faremos chamadas à API do Facebook!</p>
<p>Você também pode encontrar este código no meu <a title="Gist Alexandre Gama" href="https://gist.github.com/1499695" target="_blank">Gist Público</a>.</p>
<p>Abraços!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/538/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=538&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2011/12/19/json-simples-e-pratico-parte-i/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2011/12/dojo4_1.png" medium="image">
			<media:title type="html">JSON</media:title>
		</media:content>
	</item>
		<item>
		<title>Voltando ao Blog!</title>
		<link>http://alexandregama.wordpress.com/2011/12/19/voltando-ao-blog/</link>
		<comments>http://alexandregama.wordpress.com/2011/12/19/voltando-ao-blog/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 03:14:52 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=513</guid>
		<description><![CDATA[Fala pessoal! Pois é! Fiquei um bom tempo longe, muito longe do blog devido aos milhares de compromissos. Este é um total quick post  só pra avisar que o blog não morreu e que estou voltando a escrever neste fim de ano e que pretendo escrever sobre diversos assuntos, principalmente as Tecnolgias, Frameworks, Bibliotecas, Linguagens, etc que [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=513&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Fala pessoal!</p>
<p>Pois é! Fiquei um bom tempo longe, muito longe do blog devido aos milhares de compromissos. Este é um total quick post  só pra avisar que o blog não morreu e que estou voltando a escrever neste fim de ano e que pretendo escrever sobre diversos assuntos, principalmente as Tecnolgias, Frameworks, Bibliotecas, Linguagens, etc que vim trabalhando ao longo deste ano.</p>
<p>Dentre os vários assuntos estarão<br />
Java,<br />
Ruby,<br />
PHP,<br />
Tuning de banco,<br />
NoSQL,<br />
JavaScript,<br />
HTML 5,<br />
JQuery,<br />
VRaptor,<br />
JSF,<br />
JPA,<br />
TDD,<br />
BDD,<br />
Padrões de Projetos,<br />
Cloud Computing<br />
e muito mais!! Também farei overviews, críticas e sugestões dos eventos que participarei para podermos trocar mais informações ainda! =)</p>
<p>É isso pessoal, um simples aviso e espero contar com a ajuda de todos para termos artigos de qualidade! =)</p>
<p>Abraços!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/513/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/513/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=513&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2011/12/19/voltando-ao-blog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>
	</item>
		<item>
		<title>MVC simples e prático, Parte I</title>
		<link>http://alexandregama.wordpress.com/2011/03/24/mvc-simples-e-pratico-parte-i/</link>
		<comments>http://alexandregama.wordpress.com/2011/03/24/mvc-simples-e-pratico-parte-i/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 14:21:29 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=462</guid>
		<description><![CDATA[Fala pessoal! Sim, assunto batido! Model View Controller! Mas é muito comum encontrarmos pela internet tutoriais um pouco estranhos, visões às vezes que parecem particulares, diagramas errados e alguns ainda com dúvidas. O conceito do MVC é extremamente simples mas a sua visualização não é lá tão trivial assim. O artigo tem 2 objetivos principais: [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=462&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Fala pessoal!</p>
<p>Sim, assunto batido! <strong>Model View Controller</strong>! Mas é muito comum encontrarmos pela internet tutoriais um pouco estranhos, visões às vezes que parecem particulares, diagramas errados e alguns ainda com dúvidas.</p>
<p>O conceito do MVC é extremamente simples mas a sua visualização não é lá tão trivial assim. O artigo tem 2 objetivos principais: Relembrar a teoria e mostrar uma visualização simplificada do conceito.</p>
<p>Então vamos lá!</p>
<p><span style="color:#000000;"><strong>Entendendo o papel do M &#8211; Model</strong></span></p>
<p>Pessoal, a idéia é simples: Quando pensamos em regras de negócio, estamos pensando no Modelo da aplicação. Basicamente é isto. No Model podemos ter validações, acesso a banco, acesso à arquivos, cálculos, etc.</p>
<p>O usuário, por exemplo, coloca um produto em um carrinho de compras e é no Model que faremos o cálculo final do pedido(descontos, juros), que validaremos a conta do usuário, que calcularemos o frete, que validaremos o endereço e por aí vai.</p>
<p>Mas como o usuário seleciona um produto em um carrinho de compras por exemplo? Como insere um Endereço para a entrega? Na View!</p>
<p><span style="color:#000000;"><strong>Entendendo o papel do V &#8211; View</strong></span></p>
<p>A View só existe por um único motivo: <span style="text-decoration:underline;">Mostrar dados</span>! Na prática <span style="color:#000000;">isso <del>nunca</del></span> muitas vezes não acontece, mas deveria! Você que já desenvolveu em Delphi/VB com toda certeza já viu regras em um botão. Você que já desenvolveu em Java também já viu centenas de regras nas páginas JSP ou espalhadas em Servlets que criam as páginas. Isso é feio! O dia que precisarmos mudar de JSP para JSF ou GWT simplesmente não mudaremos!</p>
<p>Mas e agora? Entendido o conceito básico do Model, como a View passa os valores digitados/selecionados para o Model? Passa direto? Não!</p>
<p><span style="color:#000000;"><strong>Entendendo o papel do C &#8211; Controller</strong></span></p>
<p>Aqui temos um maestro! Temos regras de negócio no Controller? Não! Temos visualização no Controller? Não! O Controller simplesmente delega para o Model as solicitações da View. O Controller é burro no sentido de regras de negócio da aplicação. Ele é responsável por saber quem está pedindo algo e a quem enviará este algo!</p>
<p>O Controller conhece a View e conhece o Model mas o Model não conhece a View, porém a View observa o Model e este avisa quando seus dados foram atualizados, para a View mostrá-los.</p>
<p>Ok! Depois dessa frase bagunçada, nada como um pequeno esquema para entendermos melhor:</p>
<div id="attachment_465" class="wp-caption aligncenter" style="width: 333px"><a href="http://alexandregama.files.wordpress.com/2011/03/mvc.png"><img class="size-full wp-image-465" title="mvc" src="http://alexandregama.files.wordpress.com/2011/03/mvc.png?w=497" alt="Diagrama MVC"   /></a><p class="wp-caption-text">Entendendo o MVC</p></div>
<p><strong>Veja como é simples com o diagrama acima:</strong></p>
<p><strong>O Controller conhece a View e conhece o Model</strong>. Isto porque ele recebe as requisições do usuário da View e envia para o Model fazer algo com estas requisições. Exemplo: O usuário quer saber o endereço de uma residência a partir de um cep digitado.</p>
<p><strong>O Model simplesmente recebe a requisição, faz toda a mágica</strong> (persiste dados, valida informações, etc) e fica com os dados prontos (atualizados) para serem visualizados novamente pela View.</p>
<p><strong>A View fica observando o Model</strong> e quando este é atualizado,<strong> a View mostra os dados </strong>atualizados para o usuário.</p>
<p>E o Model acaba não conhecendo ninguém!</p>
<p><span style="color:#000000;"><strong>Legal! E por que eu trabalharia desta forma?</strong></span></p>
<p>Porque, além de elegante, é profissional! Mas se você não se convenceu com estes argumentos, podemos ter outro: é Seguro! Temos aqui uma <strong>separação bem clara entre a Visualização e as Regras de Negócio</strong>. Caso você queira modificar uma regra, como um cálculo de juros, você precisaria apenas modificar o seu Model (e espero que em um só local! =) )  e não precisaria se preocupar com a visualização.</p>
<p>O mesmo vale para a View. Caso você queira modificar uma tela inteira, não precisaria se preocupar com as regras e sim somente com a tela.</p>
<p>Um outro motivo muito forte é que você pode querer disponibilizar os seus métodos em um WebService por exemplo e com uma separação clara do seu modelo, isso seria facilitado, e muito! Imagine que você tenha uma aplicação Web e outra Desktop (JSF e Swing por exemplo) mas que façam a mesma coisa. Seria muito ruim ter funcionalidades iguais nos dois ambientes pois teríamos que manter as duas iguais. Uma forma seria disponibilizar as funcionalidades em um ponto único e acessá-las nas duas aplicações. Com uma separação clara do modelo poderíamos disponibilizar estas funcionalidades por um WebService, Rest, EJB, etc.</p>
<p><span style="color:#000000;"><strong>Finalizando</strong></span></p>
<p>O MVC é um padrão de arquitetura que existe, a grosso modo, para facilitar a manutenção da nossa aplicação, facilitar a adição de funcionalidades e facilitar a <a href="http://alexandregama.wordpress.com/2010/11/06/tdd-de-forma-simples-parte-i/">testabilidade</a> da aplicação.</p>
<p>Se você ainda escreve regras de negócio nas suas páginas/forms, tente desenvolver com este padrão e veja a diferença na manutenção e na adição de funcionalidades.</p>
<p>No próximo post veremos um exemplo simples de implementação de uma funcionalidade utilizando o padrão MVC e veremos como é simples melhorarmos a nossa aplicação deixando-a profissional.</p>
<p>É isso pessoal! Abraços!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/462/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/462/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=462&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2011/03/24/mvc-simples-e-pratico-parte-i/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2011/03/mvc.png" medium="image">
			<media:title type="html">mvc</media:title>
		</media:content>
	</item>
		<item>
		<title>Algoritmos, Parte II &#8211; Primeiros códigos</title>
		<link>http://alexandregama.wordpress.com/2010/12/22/algoritmos-parte-ii-primeiros-codigos/</link>
		<comments>http://alexandregama.wordpress.com/2010/12/22/algoritmos-parte-ii-primeiros-codigos/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 21:16:03 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Lógica]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Iniciantes]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=423</guid>
		<description><![CDATA[Fala pessoal! Idéia Neste artigo continuaremos a série sobre Algoritmos! No primeiro artigo resolvemos 3 problemas bem simples, utilizando a idéia de pseudocódigo, onde podemos visualizar melhor os passos para a resolução de um problema e não precisamos conhecer nenhuma linguagem de programação nesta etapa. Neste segundo artigo vamos resolver o primeiro problema apresentado anteriormente, [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=423&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Fala pessoal!</p>
<p><strong>Idéia</strong><br />
Neste artigo continuaremos a <a title="Artigo I da série sobre Algoritmos" href="http://alexandregama.wordpress.com/2010/11/24/algoritmos-parte-i-conceito/" target="_blank">série sobre Algoritmos</a>! No primeiro artigo resolvemos 3 problemas bem simples, utilizando a idéia de <a title="Pseducódigo" href="http://pt.wikipedia.org/wiki/Pseudoc%C3%B3digo" target="_blank">pseudocódigo</a>, onde podemos visualizar melhor os passos para a resolução de um problema e não precisamos conhecer nenhuma linguagem de programação nesta etapa.<br />
Neste segundo artigo vamos resolver o primeiro problema apresentado anteriormente, já utilizando Java e C.</p>
<p>Pra você que está iniciando os estudos e não conhece muito bem a sintaxe das linguagens não se preocupe pois a idéia desta série é mostrar os passos para a resolução de um problema e vamos usar essas linguagens só para os problemas não ficarem tão vagos!<br />
Vamos lá!</p>
<p><strong>Quebrando em pequenos pedaços</strong><br />
Conforme havia dito no artigo anterior, podemos dividir um problema em passos para chegar na sua resolução final. A idéia de divisão de um problema em problemas menores já é antiga e facilita muito a nossa vida, pois podemos pensar na resolução de &#8220;mini-problemas&#8221;, deixando de lado a visão macro do problema. Após a resolução dos pequenos problemas, o problema maior é resolvido através da união destes.</p>
<p><strong>Primeira resolução</strong><br />
Para o nosso primeiro código, vamos atacar o problema 1 do artigo anterior. Vamos lembrá-lo:<br />
&#8220;Problema: Fazer a divisão de um número por outro. Se o resultado for positivo, imprimir o número encontrado pela divisão, caso seja negativo, imprimir zero. Caso o divisor seja zero, imprimir o valor -1.&#8221;</p>
<p>No artigo anterior também vimos a resolução deste problema através de um fluxograma e também criamos um pseudocódigo com a intenção de fazer qualquer pessoa entender o objetivo que gostaríamos de atingir, que é a resolução do problema acima.</p>
<p><strong>Ambiente</strong><br />
Com o problema em mãos, vamos fazer o passo a passo da resolução já utilizando as duas linguagens citadas, pra que possamos visualizar o fluxo em um nível mais baixo.<br />
Para o Java, utilizarei o Eclipse e para o C utilizarei o DevC++. Particularmente não gosto do DevC++ e uso o GCC do Ubuntu, mas o DevC++ é bem utilizado pelos que estão começando. O  Eclipse talvez não seja o mais usado pelos iniciantes (o comum é usarem editores simples) , mas ele é muito conhecido. Fique à vontade para desenvolver no NetBeans, JCreator, JBuilder, etc.</p>
<p><strong>Relembrando</strong><br />
Esqueça a sintaxe do código abaixo caso você não a entenda agora. O ponto forte aqui pra você que está começando é entender o conceito, a lógica, a idéia. Pense na situação simples: Pra você pedir um cafezinho, você segue alguns passos, como encontrar um local, chamar o garçom, escolher o café, ver o preço e pedir. E você vai fazer exatamente a mesma coisa se estiver no Brasil, Japão ou na África e só vai mudar o idioma, a &#8220;sintaxe&#8221;!<br />
Portanto, entender os passos neste momento é muito mais útil e fundamental que entender a sintaxe, a linguagem.</p>
<p><strong>Primeiro código em Java</strong><br />
Vamos criar o nosso primeiro código em Java. Para isso, vamos criar uma classe com o nome de &#8220;<em>DivisaoDeNumeros</em>&#8220;. Esta é a classe que irá conter a nossa lógica para a resolução do problema. Com a classe criada, vamos criar o método &#8220;<em>main</em>&#8221; para podermos executar a aplicação, ou seja, imprimir os dados.</p>
<pre class="brush: java;"><span style="color:#008000;">//Classe que trata das divisões de números</span>
<span style="color:#800000;">public class</span> DivisaoDeNumeros {
    <span style="color:#800000;">public static void</span> main(String[] args) {

    }
}</pre>
<p>Agora com a classe e o método principal criados, vamos fazer o passo a passo do artigo anterior, porém escrevendo em código! Pra não ficar uma leitura muita cansativa e demorada fazendo cada passo, escrevi o código inteiro e comentei cada passo no próprio código.</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span> DivisaoDeNumeros {

	<span style="color:#800000;">public static void</span> main(String[] args) {
		<span style="color:#008000;">//Criamos um objeto Scanner para capturar o que foi digitado</span>
		Scanner input = <span style="color:#800000;">new </span>Scanner(System.in);
		<span style="color:#008000;">//Imprime mensagem para a inserção do primeiro valor</span>
		System.<span style="color:#000000;">out</span>.println(<span style="color:#3366ff;">"Insira o valor do dividendo: "</span>);
		<span style="color:#008000;">//Guarda o valor digitado pelo usuário na variável dividendo</span>
		<span style="color:#800000;">int </span>dividendo = input.nextInt();
		<span style="color:#008000;">//Imprime mensagem para a inserção do segundo valor</span>
		System.out.println(<span style="color:#3366ff;">"Insira o valor do divisor: "</span>);
		<span style="color:#008000;">//Guarda o valor digitado pelo usuário na variável divisor</span>
		<span style="color:#800000;">int </span>divisor = input.nextInt();

		<span style="color:#008000;">//Verifica se o valor do divisor é igual a zero</span>
		<span style="color:#800000;">if </span>(divisor == 0) {
			<span style="color:#008000;">//Imprime o valor -1 caso o divisor seja zero</span>
			System.out.println(<span style="color:#3366ff;">"-1"</span>);
		}
		<span style="color:#008000;">//Verifica se o valor do cálculo da divisão é negativo</span>
		<span style="color:#800000;">else if</span> ((dividendo / divisor &lt; 0)) {
			<span style="color:#008000;">//Imprime o valor 0 caso o resultdo da divisão seja negativo</span>
			System.out.println(<span style="color:#3366ff;">"Valor encontrado: 0"</span>);
		}
		<span style="color:#800000;">else</span> {
			<span style="color:#008000;">//Como o divisor não é zero e o cálculo não é negativo, imprime o resultado da divisão</span>
			System.out.println(<span style="color:#3366ff;">"Valor calculado: "</span> + dividendo / divisor);
		}
	}
}</pre>
<p>Você pode perceber que a execução está bem simples! Pelos comentários, podemos ver que passamos pelo &#8220;passo a passo&#8221; do artigo anterior, mas desta vez não escrevemos um pseudocódigo e sim um código em Java que podemos executar. Se você não está acostumado com a sintaxe, perceba que não foi difícil de entender o conceito, a idéia por de trás do código.</p>
<p>Esta é uma possível solução do problema, e não única. Podemos ter outros passos pra resolução! Mas será que se só trocarmos as condições (if&#8217;s / else if&#8217;s) teremos o mesmo resultado? Que tal tentar dar uma olhada no código abaixo e ver qual o problema?</p>
<pre class="brush: java;"><span style="color:#800000;">import </span>java.util.Scanner;

<span style="color:#800000;">public class</span> DivisaoDeNumeros {

	<span style="color:#800000;">public static void</span> main(String[] args) {
		<span style="color:#008000;">//Criamos um objeto Scanner para capturar o que foi digitado</span>
		Scanner input = <span style="color:#800000;">new</span> Scanner(System.in);
		<span style="color:#008000;">//Imprime mensagem para a inserção do primeiro valor</span>
		System.out.println(<span style="color:#3366ff;">"Insira o valor do dividendo: "</span>);
		<span style="color:#008000;">//Guarda o valor digitado pelo usuário na variável dividendo</span>
		<span style="color:#800000;">int </span>dividendo = input.nextInt();
		<span style="color:#008000;">//Imprime mensagem para a inserção do segundo valor</span>
		System.out.println(<span style="color:#3366ff;">"Insira o valor do divisor: "</span>);
		<span style="color:#008000;">//Guarda o valor digitado pelo usuário na variável divisor</span>
		<span style="color:#800000;">int </span>divisor = input.nextInt();

		<span style="color:#008000;">//Verifica se o valor do cálculo da divisão é negativo</span>
		<span style="color:#800000;">if</span> ((dividendo / divisor &lt; 0)) {
                       <span style="color:#008000;"> //Imprime o valor 0 caso o resultdo da divisão seja negativo </span>
                        System.out.println(<span style="color:#3366ff;">"Valor encontrado: 0"</span>);
                }
               <span style="color:#008000;"> //Verifica se o cálculo é positivo</span>
                <span style="color:#800000;">else if</span> (dividendo / divisor &gt; 0) {
			<span style="color:#008000;">//Imprime o resultado do cálculo caso o resultado seja positivo</span>
			System.out.println(<span style="color:#3366ff;">"Valor calculado: "</span> + dividendo / divisor);
		}
		<span style="color:#008000;">//Como o resultado não é positivo e nem negativo, podemos supor que o divisor é zero</span>
		<span style="color:#800000;">else </span>{
			<span style="color:#008000;">//Imprime o valor -1 pois o divisor é zero</span>
			System.out.println(<span style="color:#3366ff;">"-1"</span>);
		}
	}
}</pre>
<p>Erro! Veja como não precisamos entender a linguagem/sintaxe pra saber que este código terá problemas. Se olharmos com mais &#8220;carinho&#8221; vamos perceber que o código, na primeira condição, já tenta calcular a expressão. Se você inserir o valor zero para o divisor, teremos um erro no caso do Java que é o<em> &#8220;java.lang.ArithmeticException: / by zero&#8221;</em>, ou seja, não existe divisão por zero matematicamente falando e claro que na execução o Java vai reclamar.</p>
<p>Perceba que na resolução não basta simplesmente trocarmos as condições. Os passos para a resolução de um problema devem ser bem definidos e bem pensados para que nenhuma regra seja violada.</p>
<p><strong>Código em C</strong><br />
Abaixo temos o código em C, que é muito usado nos cursos de introdução à computação.</p>
<pre class="brush: java;"><span style="color:#999999;">#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;</span>

<span style="color:#800000;">int </span>main() {
   <span style="color:#008000;">//Declaração das variáveis para guardar os valores</span>
   <span style="color:#800000;">int </span>dividendo;
   <span style="color:#800000;">int </span>divisor;

   <span style="color:#008000;">//Imprime mensagem para a inserção do primeiro valor</span>
   printf(<span style="color:#3366ff;">"Digite o valor do dividendo:"</span>);
   <span style="color:#008000;">//Guarda o valor digitado pelo usuário na variável dividendo</span>
   scanf(<span style="color:#3366ff;">"%d"</span>, <span style="color:#800000;">&amp;</span>dividendo);

   <span style="color:#008000;">//Imprime mensagem para a inserção do segundo valor</span>
   printf(<span style="color:#3366ff;">"\nDigite o valor do divisor:"</span>);
   <span style="color:#008000;">//Guarda o valor digitado pelo usuário na variável divisor</span>
   scanf(<span style="color:#3366ff;">"%d"</span>, <span style="color:#800000;">&amp;</span>divisor);   

  <span style="color:#008000;"> //Verifica se o valor do divisor é igual a zero</span>
   <span style="color:#800000;">if </span>(divisor == 0) {
      <span style="color:#008000;">//Imprime o valor -1 caso o divisor seja zero</span>
      printf(<span style="color:#3366ff;">"-1\n"</span>);
   }
   <span style="color:#008000;">//Verifica se o valor do cálculo da divisão é negativo</span>
   <span style="color:#800000;">else if</span> ((dividendo / divisor &lt; 0)) {
      <span style="color:#008000;">//Imprime o valor 0 caso o resultdo da divisão seja negativo</span>
      printf(<span style="color:#3366ff;">"Valor encontrado: 0\n"</span>);
   }
   <span style="color:#800000;">else </span>{
      <span style="color:#008000;">//Como o divisor não é zero e o cálculo não é negativo, imprime o resultado da divisão</span>
      printf(<span style="color:#3366ff;">"Valor calculado: %d \n"</span>, (dividendo / divisor));
   }
   <span style="color:#008000;">//Pausa a execução</span>
   system(<span style="color:#3366ff;">"PAUSE"</span>);
}</pre>
<p><strong>Entendimento do conceito x Sintaxe da linguagem</strong><br />
Volto a lembrar que não foi preciso entender 100% a sintaxe para entender o que está acontecendo. Nos comentários do código vimos o &#8220;passo a passo&#8221; para a resolução do algoritmos e basicamente traduzimos logo em seguida para a sintaxe utilizada no Java e no C.<br />
Devemos lembrar também que não existe somente um passo para a resolução do problema e você pode ficar à vontade pra modificar os códigos acima, criando outros passos!</p>
<p><strong>Finalizando</strong><br />
Neste artigo vimos a resolução de um problema usando Java e C e a idéia principal é entender o conceito! Entendido o problema e os passos para a resolução dele, traduzí-lo para a linguagem é o &#8220;mais fácil&#8221;. Podemos entender muito de uma linguagem, mas se não conseguirmos resolver um problema com passos bem definidos, não conseguimos fazer nada.</p>
<p>Nos próximos artigos desta série vamos resolver alguns problemas mais complicados (este foi bem simples, apenas para a introdução) e em breve vou falar sobre assuntos mais específicos, como Pilhas, Filas, Tempo de Algoritmo, etc.</p>
<p>Estes códigos você também pode encontrar em:<br />
<a href="https://gist.github.com/747582">Código em Java</a><br />
<a href="https://gist.github.com/747608">Código em C</a></p>
<p>Abraços!!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/423/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=423&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2010/12/22/algoritmos-parte-ii-primeiros-codigos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>
	</item>
		<item>
		<title>Inversão de Controle x Injeção de Dependência</title>
		<link>http://alexandregama.wordpress.com/2010/12/07/inversao-de-controle-x-injecao-de-dependencia/</link>
		<comments>http://alexandregama.wordpress.com/2010/12/07/inversao-de-controle-x-injecao-de-dependencia/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 12:38:40 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=387</guid>
		<description><![CDATA[Fala pessoal!!! Com este breve artigo(breve mesmo!) vou falar sobre o conceito de Inversão de Controle, que muitos confundem com Injeção de Dependência. É justo, já que no primeiro momento os dois conceitos são bem parecidos. O que é a Inversão de Controle (IoC)? Basicamente, a Inversão de Controle é uma forma diferente que temos [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=387&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://alexandregama.files.wordpress.com/2010/12/1219355760wonod3.jpg"><img class="alignleft size-thumbnail wp-image-639" title="1219355760wOnoD3" src="http://alexandregama.files.wordpress.com/2010/12/1219355760wonod3.jpg?w=112&#038;h=150" alt="" width="112" height="150" /></a>Fala pessoal!!!</p>
<p>Com este breve artigo(breve mesmo!) vou falar sobre o conceito de Inversão de Controle, que muitos confundem com Injeção de Dependência. É justo, já que no primeiro momento os dois conceitos são bem parecidos.</p>
<p><strong>O que é a Inversão de Controle (IoC)?</strong><br />
Basicamente, a Inversão de Controle é uma forma diferente que temos para manipular o controle sobre um objeto. É um padrão. Gosto de pensar na Inversão de Controle como sendo a mudança de conhecimento que uma classe tem em relação à outra.</p>
<p>Gosto de ver um trecho teórico com um trecho de código, então vamos ver desta forma!</p>
<p>Vamos imaginar uma classe bem simples, onde precisamos gravar um Log em um arquivo após Vender um Produto.<br />
Então podemos ter a seguinte classe bem simples:</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span> VendaDeProduto {
	<span style="color:#800000;">public void </span>vendeProduto(Produto produto) {
	    <span style="color:#339966;">//Todo o código para a venda do produto...</span>
	    Log log = <span style="color:#800000;">new </span>Log(<span style="color:#3366ff;">"Arquivo.txt"</span>);
	    log.grava(produto);
	}
}</pre>
<p><strong>Mas qual o problema?</strong><br />
Razoável o exemplo. Uma classe facilmente encontrada em qualquer código. Eu sou ruim para perceber problemas em uma classe só de vê-la, então vou imaginar uma situação real: Percebemos que a classe <em>Log </em>precisa do arquivo onde será gravado o Log correto? Agora vamos imaginar que o nome do arquivo será mudado para &#8220;ArquivoLog.txt&#8221;! Muito fácil, basta mudar o nome correto? Vamos então abrir a classe VendaDeProduto e mudar!</p>
<p>Putz! Aqui que está o problema! O que a classe de Venda tem a ver com isso? Na verdade, nada! Ou pelo menos não deveria ter. Para uma modificação na classe <em>Log </em>fomos obrigados a modificar algo dentro da classe de Venda e isso não é legal. Neste momento foi fácil modificar, mas e se tivéssemos 30 classes utilizando a classe <em>Log</em>? Quais as chances de esquecermos uma?</p>
<p>No pequeno exemplo acima vimos um detalhe importante: A classe <em>VendaDeProduto </em>sabe demais sobre a classe <em>Log</em>. A classe <em>VendaDeProduto </em>sabe criar a classe <em>Log</em>. Pior, a classe de vendas sabe que a classe <em>Log </em>precisa do nome de um arquivo! E isso não é justo com a classe <em>VendaDeProduto</em>.<br />
A responsabilidade dela é somente de fechar uma venda. Portanto podemos ver um alto acoplamento de classes neste minúsculo código.</p>
<p><strong>Um problema mais a fundo</strong><br />
Pra você que desenvolve <a href="http://alexandregama.wordpress.com/2010/11/06/tdd-de-forma-simples-parte-i/">com TDD</a>, como faríamos por exemplo para fazer um teste com a classe <em>VendaDeProduto </em>quando precisarmos &#8220;mocká-la&#8221;? Simplesmente não conseguimos, justamente por ela criar o objeto Log! E não vale você que conhece o <a title="Powermock" href="http://code.google.com/p/powermock/" target="_blank">PowerMock</a> inventar algo! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Resolvendo o problema</strong><br />
É aqui que entra a <strong>Inversão de Controle</strong>. Vamos literalmente inverter este controle na classe <em>VendaDeProduto</em>. Em vez de deixarmos a responsabilidade da criação da classe <em>Log </em>para a classe <em>VendaDeProduto</em>, vamos dar a ela esta dependência. Vamos injetar esta dependência nela. E olha o que apareceu para nós: <strong>Injeção de Dependência</strong>.</p>
<p>Daí muitos confundirem e acharem que os dois são a mesma coisa. Como você pode ver, vamos resolver o problema desta classe Invertendo o Controle, utilizando a Injeção de Dependência. Simples assim!</p>
<p>Vamos resumir: Injeção de Dependência é apenas uma forma para resolvermos a Inversão de Controle.</p>
<p>Temos algumas formas interessantes de Injeção de Dependência e vou falar da mais comum(em um próximo post falarei de outras!): O <strong>Constructor Injection</strong>, ou seja, injetamos uma dependência de uma classe através do construtor desta classe.</p>
<p>Vamos novamente exemplificar este trecho de teoria com um pouco de código. Para sermos mais coerente, vamos melhorar um pouco mais o nosso código anterior, utilizando a <strong>Injeção de Dependência</strong>!</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span> VendaDeProduto {
        <span style="color:#800000;">private </span>Log log;

        <span style="color:#800000;">public void</span> VendaDeProduto(Log logVenda) {
             <span style="color:#800000;">this</span>.log = logVenda;
        }

	<span style="color:#800000;">public void</span> vendeProduto(Produto produto) {
	     <span style="color:#339966;">//Todo o código para a venda do produto...</span>
	     log.grava(produto);
	}
}</pre>
<p>Olha como ficou interessante, elegante e simples! A classe <em>VendaDeProduto</em> precisa da classe <em>Log </em>para criar um Log mas neste código a classe <em>VendaDeProduto</em> recebeu uma instância da classe <em>Log</em>! Ou seja, agora ela não se preocupa mais com a criação da classe <em>Log </em>e simplesmente a usa.</p>
<p>Como a classe <em>Log </em>é criada agora? Não sei! E nem precisamos saber! A única coisa que precisamos é uma instância da classe <em>Log </em>para trabalharmos, independente de como ela foi criada!</p>
<p>Agora pra você que trabalha com TDD ficou muito mais simples pois basta &#8220;mockar&#8221; a classe Log, passá-la pelo construtor e fazer os testes normais da sua classe!</p>
<p><strong>Finalizando</strong><br />
Desta forma diminuimos o acoplamente entre as nossas classes e a manutenção fica facilitada e, além de elegante, agora temos uma classe testável. Só não está mais elegante pois não estamos Injetando uma implementação de uma Interface, mas este é um assunto para outro post!</p>
<p>É isso pessoal, apenas uma pequena dica simples em um artigo simples para deixarmos o nosso código o mais próximo possível do que deve ser: Profissional!</p>
<p>Abraços pessoal!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/387/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/387/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=387&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2010/12/07/inversao-de-controle-x-injecao-de-dependencia/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/12/1219355760wonod3.jpg?w=112" medium="image">
			<media:title type="html">1219355760wOnoD3</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD simples e prático, Parte IV</title>
		<link>http://alexandregama.wordpress.com/2010/12/07/tdd-simples-e-pratico-parte-iv/</link>
		<comments>http://alexandregama.wordpress.com/2010/12/07/tdd-simples-e-pratico-parte-iv/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 12:37:53 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Padrões]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=319</guid>
		<description><![CDATA[Fala Desenvolvedores!!! Neste artigo teremos a continuação da parte III da série sobre TDD. A idéia deste artigo é continuar comentando um pouco mais sobre os Testes de Unidade e também falarmos sobre os Testes de Unidade em relação ao comportamento dos nossos objetos. Também falaremos sobre o conceito de Mock de Objetos, que é [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=319&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Fala Desenvolvedores!!!</p>
<p>Neste artigo teremos a continuação da <a title="Parte III da série sobre TDD básico" href="http://alexandregama.wordpress.com/2010/11/17/tdd-simples-e-pratico-parte-iii/" target="_blank">parte III da série sobre TDD</a>. A idéia deste artigo é continuar comentando um pouco mais sobre os Testes de Unidade e também falarmos sobre os Testes de Unidade em relação ao comportamento dos nossos objetos. Também falaremos sobre o conceito de Mock de Objetos, que é extremamente importante no TDD.</p>
<p>Já vou adiantar que você ficará chateado com o que faremos para &#8220;Mockar&#8221; os nossos objetos, mas prometo que em seguida ficaremos muito felizes com uma solução bem mais bacana para isso. Calma! o conceito de &#8220;Mockar&#8221; objetos aparecerá logo logo!</p>
<p>Para iniciar este artigo, vamos fugir um pouco do conceito citado acima e fazer a funcionalidade de divisão de dois números para verificarmos a possibilidade de fazer Testes esperando que alguma Exceção ocorra. Isso mesmo! Por algum motivo você deseja lançar uma Exceção caso algo de errado aconteça e podemos fazer isso com o JUnit, apresentado no artigo anterior.</p>
<p><strong>Teste da divisão</strong><br />
A funcionalidade é simples: Fazer a divisão de dois números. Lembrando: É um caso simples e isolado onde a intenção é você imaginar um caso real da sua aplicação.<br />
Então vamos para o Teste!</p>
<p>Mas aqui começaríamos com aquele conceito de BabySteps, onde faríamos passos curtos para chegarmos à solução, correto? Correto, porém os BabySteps não são uma regra xiita que devemos seguir à risca. Segundo o próprio <a href="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530">Kent Beck em seu livro sobre TDD</a>, os BabySteps são para quando realmente não temos confiança suficiente em escrever determinado código. Como ele cita também, não devemos desenvolver com BabySteps a todo momento e sim devemos ficar felizes por podermos fazê-lo quando desejarmos.</p>
<p>Agora que lembramos disso, vamos correr um pouquinho mais no código e escrever um pouco mais rápido que no artigo anterior, porém sinta-se à vontade para colocar a sua velocidade:</p>
<p>Adicionando o método de Teste à nossa classe de CalculadoraTeste:</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span> CalculadoraTeste {
	<span style="color:#888888;">@Test</span>
	<span style="color:#800000;">public void</span> deveriaDividirDoisValoresPassados() throws Exception {
		<span style="color:#800000;">int </span>valorA = 6;
		<span style="color:#800000;">int </span>valorB = 2;
		Calculadora calculadora = <span style="color:#800000;">new </span>Calculadora();
		<span style="color:#800000;">int </span>divisao = calculadora.divide(valorA, valorB);

		assertEquals(3, divisao);
	}
}</pre>
<p>E na nossa classe Calculadora, vamos escrever o nosso método de produção:</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span>  Calculadora {

	<span style="color:#800000;">public int</span> divide(int valorA, int valorB) {
		<span style="color:#800000;">return </span>valorA / valorB;
	}
}</pre>
<p>Legal! Agora podemos rodar o nosso Teste e vê-lo passando. Uma observação simples: Não comentei nos artigos anteriores mas só para ter certeza que é de conhecimento de todos, vou comentar: Rodamos os nossos Testes clicando com o botão direito na classe de Teste, selecionando <em>Run As</em> e em seguida selecionando o <em>JUnit Test</em>.</p>
<p>Agora temos um Teste verde na nossa frente!</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/11/barraverdedivisao.png"><img class="aligncenter size-full wp-image-321" title="barraverdedivisao" src="http://alexandregama.files.wordpress.com/2010/11/barraverdedivisao.png?w=497" alt=""   /></a></p>
<p>Maravilha! Finalizamos? Não.</p>
<p><strong>E quando esperamos por uma exceção?</strong><br />
Vamos atormentar os professores de matemática e fazer a seguinte alteração na nossa classe de Teste:</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span>  CalculadoraTeste {
	<span style="color:#999999;">@Test</span>
	public void deveriaDividirDoisValoresPassados() <span style="color:#800000;">throws </span>Exception {
	        <span style="color:#800000;">int </span>valorA = 6;
  	        <span style="color:#800000;">int </span>valorB = 0;  <span style="color:#339966;">//divisão por zero!</span>
	        Calculadora calculadora = <span style="color:#800000;">new </span>Calculadora();
	        <span style="color:#800000;">int </span>divisao = calculadora.divide(valorA, valorB);

	        assertEquals(?, divisao);
	}
}</pre>
<p>O que fizemos: atribuímos o valor <em>zero </em>à variável <em>valorB</em>. E o que esperamos no nosso assertEquals? Não tenho noção! Podemos esperar tudo, menos um valor! Sendo assim, na sua aplicação, você poderia mostrar uma mensagem para o usuário solicitando gentilmente que ele insira um valor coerente. E como podemos fazer um Teste esperando uma exceção? Vamos lá!</p>
<p><strong>Teste esperando por uma exceção</strong><br />
Podemos usar um parâmetro na própria anotação do JUnit (@Test) para indicar qual a exceção que estamos esperando receber. Assim teríamos o seguinte código para o nosso Teste:</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span>  CalculadoraTeste {

	<span style="color:#999999;">@Test</span>
	<span style="color:#800000;">public void</span> deveriaDividirDoisValoresPassados() <span style="color:#800000;">throws </span>Exception {
	        <span style="color:#800000;">int </span>valorA = 6;
		<span style="color:#800000;">int </span>valorB = 3;
		Calculadora calculadora = <span style="color:#800000;">new </span>Calculadora();
		<span style="color:#800000;">int </span>divisao = calculadora.divide(valorA, valorB);

		assertEquals(2, divisao);
	}

	<span style="color:#999999;">@Test</span>
	<span style="color:#800000;">public void</span> deveriaLancarUmaExcecaoIndicandoFalhaAoDividirUmNumeroPorZero()
             <span style="color:#800000;">throws </span>Exception {
		<span style="color:#800000;">int </span>valorA = 6;
		<span style="color:#800000;">int </span>valorB = 0;
		Calculadora calculadora = <span style="color:#800000;">new </span>Calculadora();
		<span style="color:#800000;">int </span>divisao = calculadora.divide(valorA, valorB);

		assertEquals(0, divisao);
	}
}</pre>
<p>Mas infelizmente ao rodar, temos uma barra vermelha:</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/12/barravermelhadivisao.png"><img class="aligncenter size-full wp-image-322" title="barravermelhadivisao" src="http://alexandregama.files.wordpress.com/2010/12/barravermelhadivisao.png?w=497" alt=""   /></a></p>
<p>Agora sim podemos fazer o nosso Teste passar adicionando o parâmetro à anotação do JUnit (@Test):</p>
<pre class="brush: java;"><span style="color:#800000;">public class</span> CalculadoraTeste {

	<span style="color:#999999;">@Test</span>(expected = ArithmeticException.<span style="color:#800000;">class</span>)
	<span style="color:#800000;">public void</span> deveriaLancarUmaExcecaoIndicandoFalhaAoDividirUmNumeroPorZero()
            <span style="color:#800000;">throws </span>Exception {
		<span style="color:#800000;">int </span>valorA = 6;
		<span style="color:#800000;">int </span>valorB = 0;
		Calculadora calculadora = <span style="color:#800000;">new </span>Calculadora();
		calculadora.divide(valorA, valorB);
	}
}</pre>
<p>E agora sim temos a barra verde para o nosso Teste:</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/12/barraverdedivisaoporzero.png"><img class="aligncenter size-full wp-image-323" title="barraverdedivisaoporzero" src="http://alexandregama.files.wordpress.com/2010/12/barraverdedivisaoporzero.png?w=497" alt=""   /></a></p>
<p>Este foi um caso simples para mostrar como é possível trabalhar com Testes que devem verificar exceções. Podemos estender este conceito para outros momentos, como fazer um Teste que não deveria esperar uma exceção que já esta poderia ser tratada pela nossa classe <em>Calculadora, </em>pois fazer da forma acima não é tão interessante<em>. </em></p>
<p>Agora vamos melhorar os nossos testes!</p>
<p><strong>Indo mais além</strong><br />
Até agora fizemos testes bem simples e a idéia é imaginarmos outras funcionalidades em nossas aplicações reais de forma a desenvolvê-las desta forma.Claro que uma classe do tipo Calculadora não é o melhor dos exemplos, mas optei pela simplicidade até agora.</p>
<p>De qualquer forma, tenho certeza que sua aplicação poderá ter muitas funcionalidades que, se bem isoladas, serão também passíveis de testes semelhantes.</p>
<p>Agora podemos avançar um pouco mais! Começamos o artigo com uma nova palavra: &#8220;Mock&#8221;.<br />
<strong>Definição simples:</strong> <a title="Definição de Mock" href="http://pt.wikipedia.org/wiki/Mock_Object" target="_blank">Um Mock</a> é basicamente um objeto falso, que é capaz de simular as dependências de um objeto e é capaz de simular determinadas ações desse objeto.<br />
<strong>Por que é usado? </strong>Para testar o comportamento de outros objetos desejados.</p>
<p>Por que gostaríamos de testar o comportamento de outros objetos? Justamente para termos certeza de que tudo ocorreu conforme pensamos. Vamos imaginar a seguinte situação: Temos uma aplicação onde cada vez que excluímos uma pessoa, um log é gerado no banco no banco de dados com o nome da pessoa que foi excluída.</p>
<p><strong>Como poderíamos ter certeza que a geração do log realmente vai ser chamada e que nada de ruim acontecerá no caminho?</strong></p>
<p>Podemos fazer este teste usando exatamente um Mock da classe de Log. Vamos fazer o código mais simples que vier na nossa cabeça:</p>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Classe do nosso Teste</span>
public class</span> PessoaTeste {
	<span style="color:#999999;">@Test</span>
	<span style="color:#800000;">public void</span> deveriaCriarUmLogQuandoUmaPessoaForExcluida()
           <span style="color:#800000;">throws </span>Exception {
		Pessoa pessoa = <span style="color:#800000;">new </span>Pessoa();
		pessoa.setNome(<span style="color:#3366ff;">"Alexandre"</span>);
		PessoaController pessoaController = <span style="color:#800000;">new </span>PessoaController();
		pessoaController.exclui(pessoa);
		<span style="color:#339966;">// Como saberemos se realmente o "criaLog" será chamado?</span>
	}
}</pre>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Nosso Controller</span>
public class</span> PessoaController {

	<span style="color:#800000;">private </span>PessoaDAO pessoaDAO;
	<span style="color:#800000;">private </span>Log log;

	<span style="color:#800000;">public </span>PessoaController() {
		pessoaDAO = <span style="color:#800000;">new </span>PessoaDAO();
		log = <span style="color:#800000;">new </span>Log();
	}

	<span style="color:#800000;">public void</span> exclui(Pessoa pessoa) {
		PessoaDAO.exclui(pessoa);
		log.criaLog(pessoa.getNome());
	}
}</pre>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Nossa classe de criação de Logs</span>
public class</span> Log {

	<span style="color:#800000;">public void</span> criaLog(String nomeDaPessoa) {
		<span style="color:#339966;">// Código para criar um Log no banco, em um txt, etc..</span>.
	}
}</pre>
<p>Eu sei, eu sei. Abandonamos aqui algumas boas práticas mas é em prol de um entendimento melhor da situação. Logo logo vamos melhorar um pouco mais este código.</p>
<p>Voltamos à mesma pergunta: Como vamos saber se a criação do Log foi chamada? Vamos criar um Mock da nossa classe de criação de Logs!</p>
<p>O nosso Mock deve simular o funcionamento da funcionalidade, ou seja, ele não conterá código algum, será apenas para verificarmos se ele foi chamado.</p>
<p>Uma idéia seria criarmos uma classe que estende da nossa classe de <em>Log</em>, mas seremos um pouquinho melhores que isso e vamos criar uma Interface para implementarmos.</p>
<p>Assim poderíamos ter:</p>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Nossa Interface de criação de Logs</span>
public interface</span> GeradorDeLog {
	<span style="color:#800000;">public void</span> criaLog(String nomeDaPessoa);
}</pre>
<p>Podemos então ter a seguinte classe horrorosa:</p>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Mock da nossa classe de Log</span>
public class</span> LogMock <span style="color:#800000;">implements </span>GeradorDeLog {

	<span style="color:#800000;">private </span>String nome;

	<span style="color:#999999;">@Override</span>
	<span style="color:#800000;">public void</span> criaLog(String nomeDaPessoa) {
		<span style="color:#800000;">this</span>.nome = nomeDaPessoa;
	}

	<span style="color:#800000;">public </span>String getNome() {
		<span style="color:#800000;">return </span>nome;
	}
}</pre>
<p>Mas temos um detalhe: O nosso Controller está com uma dependência forte que é a classe <em>Log </em>sendo instanciada diretamente pelo Controller. Isso impossibilita o uso do nosso Mock. Então vamos melhorar um pouquinho o Design da nossa aplicação.<br />
Opa! Olha o TDD nos &#8220;obrigando&#8221; a melhorar o Design da nossa aplicação!</p>
<p>Vamos então aplicar um princípio bem importante que é a <a href="http://pt.wikipedia.org/wiki/Invers%C3%A3o_de_controle">Inversão de Controle</a> através da Injeção de nossas Dependências. Vamos enviar então o nosso <em>GeradorDeLog </em>para o Controller através do construtor.</p>
<p>Assim teremos:</p>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Nossa classe de Teste</span>
public class</span> PessoaTeste {
	<span style="color:#999999;">@Test</span>
	<span style="color:#800000;">public void</span> deveriaCriarUmLogQuandoUmaPessoaForExcluida()
            <span style="color:#800000;">throws </span>Exception {
		Pessoa pessoa = <span style="color:#800000;">new </span>Pessoa();
		pessoa.setNome(<span style="color:#3366ff;">"Alexandre"</span>);

		LogMock nossoLogMock = <span style="color:#800000;">new </span>LogMock();
		PessoaController pessoaController = <span style="color:#800000;">new </span>PessoaController(nossoLogMock);
		pessoaController.exclui(pessoa);

		assertEquals(pessoa.getNome(), nossoLogMock.getNome());
	}
}</pre>
<pre class="brush: java;"><span style="color:#800000;"><span style="color:#339966;">//Nosso Controller</span>
public class</span> PessoaController {

	<span style="color:#800000;">private </span>PessoaDAO pessoaDAO;
	<span style="color:#800000;">private </span>GeradorDeLog log;

	<span style="color:#800000;">public </span>PessoaController(GeradorDeLog log) {
		<span style="color:#800000;">this</span>.pessoaDAO = <span style="color:#800000;">new </span>PessoaDAO();
		<span style="color:#800000;">this</span>.log = log;
	}

	<span style="color:#800000;">public void</span> exclui(Pessoa pessoa) {
		PessoaDAO.exclui(pessoa);
		log.criaLog(pessoa.getNome());
	}
}</pre>
<p>E olha que temos aqui, um teste passando!</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/12/barraverdeparamock.png"><img class="aligncenter size-full wp-image-371" title="BarraVerdeParaMock" src="http://alexandregama.files.wordpress.com/2010/12/barraverdeparamock.png?w=497" alt=""   /></a></p>
<p><strong>Recapitulando</strong>: Muitas vezes precisamos testar o comportamento dos nossos objetos. No nosso caso qual é o comportamento? A criação de um Log quando uma pessoa é excluída. Mas não queremos criar um Log de verdade quando fizermos o teste de exclusão e sim queremos verificar se o método da criação do Log foi chamado.</p>
<p>Para fazermos isso, usamos um objeto &#8220;Mockado&#8221; que é um objeto que simula o comportamento do nosso objeto. É, a grosso modo, um objeto falso que não tem inteligência.</p>
<p>Assim, pelo Teste, na exclusão de uma pessoa um Log é gerado pois ao chamar o método de exclusão, o método de criação do Log também é chamado, ou seja, nada de errado acontece pelo caminho.</p>
<p><strong>Para uma visão geral do nosso Teste, vamos listar os nossos passos:</strong><br />
- Criamos a nossa classe de Teste <em>PessoaTeste</em></p>
<p>- Criamos as classes: <em>PessoaController, Log, Pessoa</em></p>
<p>- Sentimos dificuldade para fazer o teste no Controller pois ele estava muito acoplado com a classe de Log</p>
<p>- Criamos a Interface <em>GeradorDeLog </em>para a nossa classe de Log implementá-la</p>
<p>- Fizemos a nossa classe <em>LogMock </em>também implementar a Interface <em>GeradorDeLog</em></p>
<p>- Passamos para o nosso Controller a nossa classe de Log &#8220;Mockada&#8221;, por Injeção de Dependência pelo construtor</p>
<p>- Identificamos pelo assertEquals se o método de geração de Log foi realmente invocado, verificando se o nome no Log era o mesmo nome da Pessoa</p>
<p><strong>Finalizando</strong><br />
Legal! Conseguimos fazer o nosso Teste rodar, melhoramos um pouco o Design da nossa Aplicação aplicando a Inversão de Controle (mas podemos refatorar para algo bem melhor, claro!) mas acabamos ficando com essa classe horrorosa que é a <em>LogMock</em>.</p>
<p>Mas esta idéia não é só feia! Essa idéia só poderá ser usada caso tenhamos objetos simples. Imagine que temos um objeto que instancia outro objeto e este também instancia outro objeto e cada um tem diversos métodos. A nossa vida se resumiria a criar classes de Mock e isso não é legal.</p>
<p>É neste ponto que podemos usar  Frameworks para isso. Podemos &#8220;Mockar&#8221; as nossas dependências através destes Frameworks sem precisar criar outras classes para isso!</p>
<p>Mas este assunto é para o próximo artigo, onde trabalharemos com estas mesmas classes utilizando dois Frameworks bem bacanas do mercado!</p>
<p>Abraços pessoal!!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/319/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=319&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2010/12/07/tdd-simples-e-pratico-parte-iv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/11/barraverdedivisao.png" medium="image">
			<media:title type="html">barraverdedivisao</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/12/barravermelhadivisao.png" medium="image">
			<media:title type="html">barravermelhadivisao</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/12/barraverdedivisaoporzero.png" medium="image">
			<media:title type="html">barraverdedivisaoporzero</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/12/barraverdeparamock.png" medium="image">
			<media:title type="html">BarraVerdeParaMock</media:title>
		</media:content>
	</item>
		<item>
		<title>Servlets simples e prático, Parte I</title>
		<link>http://alexandregama.wordpress.com/2010/11/27/servlets-simples-e-pratico-parte-i/</link>
		<comments>http://alexandregama.wordpress.com/2010/11/27/servlets-simples-e-pratico-parte-i/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 09:48:42 +0000</pubDate>
		<dc:creator>Alexandre Gama</dc:creator>
				<category><![CDATA[JSP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://alexandregama.wordpress.com/?p=214</guid>
		<description><![CDATA[Fala Desenvolvedores!!! Servlets! Nesta série de artigos pretendo falar um pouco sobre os Servlets de uma forma simples e prática e falando também na teoria, que dará uma base melhor quando estiverem nascendo os nossos primeiros códigos com Servlets. A idéia é também evoluir este assunto para outro assunto bem interessante, o JSP! Vocês verão [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=214&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Fala Desenvolvedores!!!</p>
<p><strong>Servlets!</strong> Nesta série de artigos pretendo falar um pouco sobre os Servlets de uma forma simples e prática e falando também na teoria, que dará uma base melhor quando estiverem nascendo os nossos primeiros códigos com Servlets.</p>
<p>A idéia é também evoluir este assunto para outro assunto bem interessante, o JSP! Vocês verão mais pra frente que, a grosso modo, o JSP é convertido em Servlets.</p>
<p>Tá Alexandre, mas já que os artigos falarão sobre Servlets, nada mais justo que começar o primeiro falando sobre o motivo do nascimento dos Servlets.<br />
Então vamos lá!</p>
<p><strong>O problema!</strong><br />
Como toda boa idéia, os Servlets surgiram justamente a partir de um problema: A necessidade de exibição de páginas geradas dinamicamente na Web.<br />
E por que? Por que no começo tínhamos páginas estáticas, ou seja, páginas muito simples em HTML que não eram capazes de retornar respostas de acordo com as requisições dos usuários.</p>
<p>Resumindo a história: No começo tínhamos diversos servidores que continham diversas páginas HTML estáticas que simplesmente acessávamos seu conteúdo e agora temos páginas que nos respondem dependendo da nossa pergunta, ou seja, capazes de enviar diferentes tipos de respostas dinamicamente.</p>
<p><strong>Solução interessante: CGI</strong><br />
CGI. O Common Gateway Interface (CGI) foi criado justamente para contornar este problema. Qual era a idéia do CGI? Receber a requisição do cliente e gerar páginas web dinamicamente, exatamente como queríamos!Uau! Como? Podíamos escrever programas em CGI que poderiam ser executados a partir de parâmetros passados pelo navegador. Sendo um pouco mais ortodoxo, temos scripts CGI que entendem os parâmetros passados pelo navegador e assim podem enviar uma página web para o navegador criada dinamicamente, de acordo com estes parâmetros.</p>
<p>Exemplo simples: Com CGI podemos fazer uma solicitação via web e um programa CGI pode ler dados de um banco de dados a partir da nossa requisição e devolver uma página HTML com estes dados.</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/11/111.png"><img class="aligncenter size-full wp-image-278" title="1" src="http://alexandregama.files.wordpress.com/2010/11/111.png?w=497" alt=""   /></a>Uma curiosidade é que poderíamos escrever os programas usando por exemplo PHP, C, ASP e Perl.</p>
<p>Mas em Java também temos algo semelhante, os Servlets!</p>
<p><strong>Servlets</strong><br />
Basicamente os Servlets funcionam desta mesma forma: Podem gerar páginas dinamicamente, de acordo com as requisições do usuário.</p>
<p>Os Servlets são da plataforma Java e nada mais são que Classes onde podemos criar objetos e trabalhar com eles, gerando páginas HTML dinamicamente.</p>
<p>Assim, basicamente poderíamos ter o seguinte processo:</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/11/2-servlet.png"><img class="aligncenter size-full wp-image-280" title="2 - Servlet" src="http://alexandregama.files.wordpress.com/2010/11/2-servlet.png?w=497" alt=""   /></a>Mas já vou te desanimar: Não é uma boa prática trabalharmos gerando páginas HTML diretamente com Servlets!</p>
<p>Você verá nos próximos artigos que trabalhar desta forma é um tanto quanto trabalhoso! No começo estamos felizes e tranquilos com a forma, mas logo percebemos que para algo mais complexo os Servlets tornam a nossa vida mais dura e caótica e não estou exagerando!</p>
<p><strong>E por que saber sobre Servlets então?</strong> Por que você pode precisar dar manutenção em algum sistema baseado em Servlets (existem muitos!) e por que temos Frameworks que convertem seus dados em Servlets, como o famoso JSP. Além do mais é bem bacana nós desenvolvedores sabermos com o é o funcionamento por de trás dos Frameworks.</p>
<p>Assim, a grosso modo, o estudo sobre Servlets acaba se tornando um estudo sobre geração de páginas criadas dinamicamente mas em um nível mais baixo.</p>
<p><strong>Servlet Container?</strong><br />
Você pode ter ficado em dúvida sobre o que seria o <strong>Servlet Container</strong> na figura. Temos um bem famoso e tenho certeza que você já ouviu falar ou usou: O Tomcat! Ele pode ser o nosso Servlet Container para usar os Servlets, ou seja, precisamos de um container para desenvolver com Servlets.</p>
<p>Um Servlet Container pode, por exemplo, gerenciar o ciclo de vida de uma Servlet, dar suporte à segurança, trabalhar com Multithreading, etc. Poderemos detalhar melhor o trabalho de um Servlet Container ao longo dos posts.</p>
<p>Os Servlets trabalham com o conceito de request/response e na figura seria exatamente a requisição específica e resposta específica respectivamente. Apesar de ser bem comum trabalharmos com Servlets com o protocolo HTTP, podemos trabalhar com outros protocolos que seguem este conceito de request/response.</p>
<p><strong>Por que Servlets e não CGI então?</strong><br />
Existem alguns detalhes interessante que nos fazem escolher os Servlets em relação ao CGI, apesar deles terem a mesma idéia de funcionamento.</p>
<p>Segue uma figura com um pequeno comparativo:</p>
<p><a href="http://alexandregama.files.wordpress.com/2010/11/3-comparac3a7c3a3o3.png"><img class="aligncenter size-full wp-image-289" title="3 - Comparação simples entre Servlets e CGI" src="http://alexandregama.files.wordpress.com/2010/11/3-comparac3a7c3a3o3.png?w=497" alt=""   /></a></p>
<p>Claro que temos outros motivos para o uso do Servlet em relação ao CGI (como serem em Java) e também podemos nos aprofundar nos motivos citados acima. Mas este é um assunto para um futuro post! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Finalizando</strong><br />
Pois é, vamos finalizar sem códigos mesmo. Mas fique tranquilo, este post foi apenas para introduzir a idéia sobre Servlets para podermos escrever código sabendo o que estamos fazendo e não simplesmente escrevermos linhas de códigos e esperarmos algum resultado.</p>
<p>Já no próximo post falaremos sobre as Classes que poderemos trabalhar e faremos o nosso pequeno primeiro exemplo! Para provar que trabalhar criando dinamicamente páginas com Servlets não é algo aconselhável e bacana, também faremos outros exemplos mais complexos, para realmente abandonarmos a idéia de trabalhar somente com Servlets, caso esta idéia apareça!</p>
<p>Abraços pessoal!!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alexandregama.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alexandregama.wordpress.com/214/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alexandregama.wordpress.com&#038;blog=15474371&#038;post=214&#038;subd=alexandregama&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alexandregama.wordpress.com/2010/11/27/servlets-simples-e-pratico-parte-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/927b4b39a6c83569857963665514a1a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alexandregama</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/11/111.png" medium="image">
			<media:title type="html">1</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/11/2-servlet.png" medium="image">
			<media:title type="html">2 - Servlet</media:title>
		</media:content>

		<media:content url="http://alexandregama.files.wordpress.com/2010/11/3-comparac3a7c3a3o3.png" medium="image">
			<media:title type="html">3 - Comparação simples entre Servlets e CGI</media:title>
		</media:content>
	</item>
	</channel>
</rss>
