<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>blog.caelum.com.br</title>
	
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Wed, 30 May 2012 15:21:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/caelum" /><feedburner:info uri="caelum" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><item>
		<title>Conexão Java 2012 – eu fui!</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/78EkG9tKxYE/</link>
		<comments>http://blog.caelum.com.br/conexao-java-2012-eu-fui/#comments</comments>
		<pubDate>Tue, 29 May 2012 12:24:24 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Caelum]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[conexaojava]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[guj]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5063</guid>
		<description><![CDATA[O Conexão Java 2012 foi um sucesso. Em São Paulo, 400 participantes lotaram o auditório para participar de um evento com novo formato: um problema foi proposto e trabalhado em todas as palestras, guiando quem está começando na plataforma Java. O objetivo era criar uma aplicação Android que consumisse JSON do cloud, para saber que <a href="http://blog.caelum.com.br/conexao-java-2012-eu-fui/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/306155_10150943567724086_190950799085_9806696_1825036587_n.jpeg" width="240" />
		</p><p>O <a href="http://www.conexaojava.com.br">Conexão Java 2012</a> foi um sucesso. Em São Paulo, 400 participantes lotaram o auditório para participar de um evento com novo formato: um problema foi proposto e trabalhado em todas as palestras, guiando quem está começando na plataforma Java. O objetivo era criar uma aplicação Android que consumisse JSON do cloud, para saber que ônibus passavam pelos pontos mais próximos de você. <a href="https://www.facebook.com/media/set/?set=a.10150943546679086.402838.190950799085&#038;type=1">Mais fotos no facebook</a>.</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/306155_10150943567724086_190950799085_9806696_1825036587_n.jpeg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/306155_10150943567724086_190950799085_9806696_1825036587_n-150x150.jpg" alt="" title="306155_10150943567724086_190950799085_9806696_1825036587_n" width="150" height="150" class="alignnone size-thumbnail wp-image-5068" /></a> <a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/545630_10150943567549086_190950799085_9806695_1614293289_n.jpeg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/545630_10150943567549086_190950799085_9806695_1614293289_n-150x150.jpg" alt="" title="545630_10150943567549086_190950799085_9806695_1614293289_n" width="150" height="150" class="alignnone size-thumbnail wp-image-5069" /></a> <a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/179936_10150943817844086_190950799085_9807695_78203661_n.jpeg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/179936_10150943817844086_190950799085_9807695_78203661_n-150x150.jpg" alt="" title="179936_10150943817844086_190950799085_9807695_78203661_n" width="150" height="150" class="alignnone size-thumbnail wp-image-5070" /></a></center></p>
<p>Como houve muita codificação ao vivo, os slides não mostram tudo que ocorreu no evento. Enquanto não lançamos os videos de algumas das palestras, <a href="https://github.com/caelum/conexaojava">publicamos o código fonte utilizado</a>, além dos slides. Eu comecei falando <a href="http://www.slideshare.net/caelumdev/plataforma-java-detalhes-da-jvm">um pouco mais da importância da JVM</a> e mostrando como funciona o bytecode e as otimizações do JIT. Em seguida, Mauricio Aniche elaborou a modelagem do nosso domínio de ônibus, <a href="http://www.slideshare.net/mauricioaniche/conexo-java-2012-orientao-a-objetos-das-galxias">mostrando alguns princípios de orientação a objetos</a>, para serem complementados pela Cecilia, que demonstrou <a href="http://www.slideshare.net/cecifernandes/ceci-13111109">o uso das coleções do Java</a>. </p>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/conexao-java.png" alt="" title="conexao-java" width="235" height="220" class="aligncenter size-full wp-image-5067" /></p>
<p>Adriano Almeida <a href="http://www.slideshare.net/adrianoalmeida7/conexao-java-vraptor">explicou um pouco de MVC</a> para codificar com o VRaptor, e depois Alberto Souza demonstrar onde JSF se enquadra. Guilherme Silveira fez código ao vivo com Hibernate, persistindo o nosso modelo de Onibus. No final, Hanneli passou o <a href="http://www.slideshare.net/hannelita/java-nas-nuvens">conceito de cloud</a>, praticando do OpenShift, para então Erich Egert codificar o que precisava em uma <a href="http://www.slideshare.net/ErichEgert/conexao-java-criando-uma-app-android">aplicação Android</a>. O evento terminou com divertidas lightning talks e o sorteio de um Playstation 3 e outros brindes.</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/156551_10150943823654086_190950799085_9807739_1191469860_n.jpeg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/156551_10150943823654086_190950799085_9807739_1191469860_n-150x150.jpg" alt="" title="156551_10150943823654086_190950799085_9807739_1191469860_n" width="150" height="150" class="alignnone size-thumbnail wp-image-5071" /></a> <a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/487300_10150943566919086_311270336_n.jpeg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/487300_10150943566919086_311270336_n-150x150.jpg" alt="" title="487300_10150943566919086_311270336_n" width="150" height="150" class="alignnone size-thumbnail wp-image-5072" /></a> <a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/545169_10150943567084086_190950799085_9806690_2123050911_n.jpeg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/545169_10150943567084086_190950799085_9806690_2123050911_n-150x150.jpg" alt="" title="545169_10150943567084086_190950799085_9806690_2123050911_n" width="150" height="150" class="alignnone size-thumbnail wp-image-5073" /></a></center></p>
<p>Foi uma comemoração de 10 anos do GUJ, 8 anos da Caelum e recuperar um evento focado a quem está adquirindo suas primeiras experiências na plataforma. Nos vemos nos próximos eventos. Se você está começando com Java, não deixe de ver nossas <a href="http://www.caelum.com.br/apostilas">apostilas</a> e <a href="http://www.caelum.com.br/cursos">cursos</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=78EkG9tKxYE:2_QtbZEYWWM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=78EkG9tKxYE:2_QtbZEYWWM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=78EkG9tKxYE:2_QtbZEYWWM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=78EkG9tKxYE:2_QtbZEYWWM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=78EkG9tKxYE:2_QtbZEYWWM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=78EkG9tKxYE:2_QtbZEYWWM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=78EkG9tKxYE:2_QtbZEYWWM:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/78EkG9tKxYE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/conexao-java-2012-eu-fui/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/conexao-java-2012-eu-fui/</feedburner:origLink></item>
		<item>
		<title>Use CDI no seu próximo projeto Java</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/-wAxapk6Nn0/</link>
		<comments>http://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/#comments</comments>
		<pubDate>Wed, 23 May 2012 12:44:06 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cdi]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[injeção de dependência]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[javaee6]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[weld]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5003</guid>
		<description><![CDATA[CDI é a especificação do Java EE 6 que cuida da parte de injeção de dependências. E, além de ser oficial e estar incluída em todos os servidores de aplicação, é tão boa e produtiva que já tem gente questionando o papel do Spring nos dias de hoje. O CDI se encaixa muito bem em <a href="http://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/injection.png" width="240" />
		</p><p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/injection.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/injection-150x150.png" alt="" title="injection" width="150" height="150" class="alignleft size-thumbnail wp-image-5056" /></a> CDI é a especificação do Java EE 6 que cuida da parte de injeção de dependências. E, além de ser oficial e estar incluída em todos os servidores de aplicação, é tão <strong>boa e produtiva</strong> que já tem gente questionando o <a href="http://blog.caelum.com.br/java-ee-versus-spring-retomando-a-discussao/">papel do Spring nos dias de hoje</a>.</p>
<p>O CDI se encaixa muito bem em todo tipo de projeto Java. Se você usa JSF2, usar CDI é natural, como mostramos no nosso <a href="http://www.caelum.com.br/curso/fj26">curso FJ-26</a>. Mas mesmo para aplicações Web simples, com apenas Servlets, o CDI é um grande ganho. </p>
<h2>Habilitando CDI</h2>
<p>Habilitar o CDI no projeto é muito simples. Se você já está usando um servidor Java EE 6, basta criar um arquivo vazio chamado <code>beans.xml</code> na pasta <code>META-INF</code> do seu projeto (ou <code>WEB-INF</code> num projeto web). Esse é um simples arquivo de marcação e apenas sua presença já faz com que o servidor habilite o suporte a CDI e escaneie suas classes automaticamente.</p>
<p>Se você estiver usando Tomcat, Jetty ou outro servidor antes do Java EE 6, ainda é possível habilitar o CDI copiando e configurando o JAR de alguma de suas implementações. Vamos usar o <a href="http://seamframework.org/Weld">Weld</a>, a implementação de referência e a mais usada (já embutida no JBoss e no Glassfish).</p>
<p>No caso do Tomcat, os passos de configuração são:</p>
<ul>
<li> Baixar a última versão do Weld no <a href="http://seamframework.org/Weld">site dele</a>
<li> Copiar o <strong>weld-servlet.jar</strong> pra pasta WEB-INF/lib
<li> Criar um arquivo <a href="https://gist.github.com/2469299">META-INF/context.xml</a>
<li> Acrescentar as <a href="https://gist.github.com/2469303">configurações do Weld no web.xml</a>
</ul>
<p>Feito isso, basta criar o tal arquivo <strong>META-INF/beans.xml</strong> vazio no projeto.</p>
<h2>Tudo são beans</h2>
<p>Com o CDI habilitado, praticamente todas as classes do projeto são consideradas <em>managed beans</em> e, portanto, passíveis de injeção e de serem injetadas. Podemos usar com CDI toda classe pública com um construtor público padrão ou algum que receba parâmetros e esteja anotado com <code>@Inject</code>.</p>
<p>Aliás, essa anotação <code>@Inject</code> é a base de todo o CDI: é ela quem permite a injeção de dependências e devemos usá-la nos pontos que queremos injeção automática, sejam  construtores, setters ou atributos privados.</p>
<p>Essa anotação, embora usada com CDI, faz parte na verdade de uma outra especificação, a JSR330. Essa é uma especificação bastante simples, com apenas algumas anotações relacionadas à injeção de dependências no pacote <code>javax.inject</code>. A ideia é ter um conjunto básico de recursos para injeção a serem suportados em todos os frameworks do tipo &#8211; além do CDI, Spring, Google Guice, PicoContainer e outros frameworks suportam essas anotações.</p>
<h2>Primeira injeção</h2>
<p>Imagine que temos uma classe <code>ProdutoDAO</code> que cuida de persistir objetos <code>Produto</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class ProdutoDAO {
   public void adiciona(Produto produto) {
      // ... implementação
   }
}
</pre>
<p>Essa classe simples, sem nenhuma configuração particular, pode ter objetos injetados em qualquer outro ponto da aplicação. Basta usar a anotação <code>@Inject</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class ProdutoController {
    @Inject private ProdutoDAO dao;

    public String inserir() {
        Produto p = // ...
        dao.adiciona(p);
        return &quot;Produto adicionado!&quot;;
    }
}
</pre>
<p>Poderíamos também ter feito a própria classe <code>ProdutoDAO</code> receber um <code>EntityManager</code> da JPA para trabalhar com a persistência:</p>
<pre class="brush: java; title: ; notranslate">
public class ProdutoDAO {
   @Inject private EntityManager manager;

   public void adiciona(Produto produto) {
      manager.persist(produto);
   }
}
</pre>
<h2>Produção de objetos</h2>
<p>Sempre que encontrar um ponto de injeção, o CDI vai tentar instanciar a classe sendo referenciada. No caso do DAO anterior, ao criá-lo, o CDI vai tentar dar <code>new</code> em <code>EntityManager</code>.</p>
<p>Mas <code>EntityManager</code>, assim como vários outros objetos, não pode ser criado tão facilmente assim. A criação de um <code>EntityManager</code> exige a chamada do método <code>createEntityManager</code> no <code>EntityManagerFactory</code> correspondente. É um objeto com um processo de fabricação particular.</p>
<p>Nos Design Patterns, sempre que encontramos esse tipo de cenário, criamos uma <strong>Factory</strong> para aquele objeto. É um simples método que encapsula a criação não-trivial do objeto em questão. Com CDI é a mesma coisa.</p>
<p>Vamos criar um método em uma classe qualquer do sistema que cuide da produção de objetos <code>EntityManager</code>. E podemos indicar ao CDI que queremos que ele use esse método sempre que alguém pedir a injeção de um <code>EntityManager</code>. Fazemos isso com a anotação <code>@Produces</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class ProdutorEntityManager {
   private static EntityManagerFactory factory = Persistence.createEntiyManagerFactory(&quot;default&quot;);

   @Produces
   public EntityManager criaEntityManager() {
      return factory.createEntityManager();
   }
}
</pre>
<p>Agora, todos os pontos de injeção que precisarem de <code>EntityManager</code> irão invocar essa fábrica anotada com <code>@Produces</code>.</p>
<h2>Escopos</h2>
<p>Mas quantos EntityManagers vamos criar com o código acima? Por padrão, toda dependência no CDI possui um escopo chamado <strong>Dependant</strong>. Isso é: será instanciada tantas vezes quanto quem estiver chamando for. Certamente não é o que queremos com nosso <code>EntityManager</code>.</p>
<p>É usual criar um <code>EntityManager</code> por requisição em uma aplicação Web. Podemos indicar isso apenas anotando o método produtor com <code>@RequestScoped</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class ProdutorEntityManager {

   @Produces @RequestScoped
   public EntityManager criaEntityManager() {
      // ...
   }
}
</pre>
<p>Agora, um novo <code>EntityManager</code> será criado associado a um request. Se mais de uma classe pedir um <code>EntityManager</code> durante o mesmo request, a mesma instância será passada, evitando desperdício de recursos. Outros escopos comuns são <code>@SessionScoped</code> e <code>@ApplicationScoped</code>.</p>
<p>Mais: como definimos o escopo da dependência, temos agora uma visão clara de seu ciclo de vida. O objeto durará apenas um request, e será descartado quando o request acabar.</p>
<p>O CDI nos deixa, inclusive, executar algo na fase de descarte da dependência, ao final da requsição. No nossa caso, será muito útil para chamar o <code>close</code> no <code>EntityManager</code>. Basta criar um método que receba a dependência a ser descartada e anotar o parâmetro com <code>@Disposes</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class ProdutorEntityManager {

   @Produces @RequestScoped
   public EntityManager criaEntityManager() {
      // ...
   }

   public void finaliza(@Disposes EntityManager manager) {
      manager.close();
   }
}
</pre>
<p>O método <code>finaliza</code> será chamado automaticamente pelo CDI ao final do request e fará o fechamento do <code>EntityManager</code>.</p>
<h2>Use CDI no seu próximo projeto</h2>
<p>O CDI é extremamente completo e poderoso. Esse artigo mostrou apenas o básico e o início do trabalho. Mas seu container de injeção typesafe com anotações simples e produtivas tem muitos outros recursos.</p>
<p>Aqui mesmo no blog já mostramos como fazer a <a href="http://blog.caelum.com.br/customizando-a-producao-de-dependencias-no-cdi/">produção de dependências de tipos genéricos</a>. Além disso, há recursos como qualifiers, interceptadores, decorators, eventos e muito mais. Mostramos várias dessas funcionalidades no <a href="http://www.caelum.com.br/curso/fj26">curso FJ-26 da Caelum</a>, inclusive com o <strong>JBoss Seam 3</strong>, uma ótima companhia para o CDI.</p>
<p>E você, o que acha do CDI? Tem usado em seus projetos?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=-wAxapk6Nn0:hvCyM_sItxY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=-wAxapk6Nn0:hvCyM_sItxY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=-wAxapk6Nn0:hvCyM_sItxY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=-wAxapk6Nn0:hvCyM_sItxY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=-wAxapk6Nn0:hvCyM_sItxY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=-wAxapk6Nn0:hvCyM_sItxY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=-wAxapk6Nn0:hvCyM_sItxY:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/-wAxapk6Nn0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/</feedburner:origLink></item>
		<item>
		<title>Conhecendo o operator new e os protótipos no JavaScript</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/jvLi5bKbqFk/</link>
		<comments>http://blog.caelum.com.br/conhecendo-o-operator-new-e-os-prototipos-no-javascript/#comments</comments>
		<pubDate>Thu, 17 May 2012 18:41:39 +0000</pubDate>
		<dc:creator>Ricardo Valeriano</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[funcões]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programação funcional]]></category>
		<category><![CDATA[this]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5040</guid>
		<description><![CDATA[Como funciona exatamente o new no JavaScript? Podemos utilizá-lo na frente de uma invocação de uma função. Curiosamente, de qualquer função. Quando usado, o new cria um novo objeto e o atribui a palavra chave this de dentro do escopo da função invocada. Podemos então adicionar atributos a esse objeto: Apesar de não existir nenhuma <a href="http://blog.caelum.com.br/conhecendo-o-operator-new-e-os-prototipos-no-javascript/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/05/javascript.png" width="240" />
		</p><p>Como funciona exatamente o <code>new</code> no JavaScript? Podemos utilizá-lo na frente de uma invocação de uma função. Curiosamente, de qualquer função. Quando usado, o <code>new</code> cria um novo objeto e o atribui a palavra chave <code>this</code> de dentro do escopo da função invocada. Podemos então adicionar atributos a esse objeto:</p>
<pre class="brush: jscript; title: ; notranslate">
var Pessoa = function(nome, email) {
    console.log(&quot;criando nova pessoa&quot;);
    console.log(typeof(this));
    this.nome =  nome;
    this.email = email;
}

var joao = new Pessoa(&quot;João da Silva&quot;,  &quot;joao@da.silva&quot;); // criando nova pessoa, object
console.log(joao.nome); // João da Silva
console.log(joao.email); // joao@da.silva
</pre>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2013/05/javascript.png" alt="" title="javascript" width="256" height="256" class="aligncenter size-full wp-image-5055" /></p>
<p>Apesar de não existir nenhuma instrução de retorno explícita na função <code>Pessoa</code>, é possível armazenar em <code>joao</code> uma referência para o objeto criado no momento da invocação. O operador <code>new</code> garante que o objeto referenciado pela palavra chave <code>this</code> seja retornado ao término da função.</p>
<p>Mas e se houver uma instrução de retorno explícita? Nesse caso o retorno é influenciado pelo operador <code>new</code>. Se o tipo do retorno for diferente de <code>object</code> então será retornado o objeto referenciado por this. Com isso em mente, veja no exemplo a seguir como o operador <code>new</code> é capaz de interferir no retorno de uma função. Vamos criar uma função que retorna um objeto do tipo <code>string</code>. Primeiro ela será invocada através do padrão simples e depois usando o <code>new</code>, veja que o objeto retornado muda de acordo com o padrão de invocação:</p>
<pre class="brush: jscript; title: ; notranslate">
var Curso = function(nome) {
    this.nome = nome;
    return &quot;curso &quot;+ nome;
}

// Invocando como função
var stringParaCS01 =  Curso(&quot;CS01&quot;);
typeof(stringParaCS01); // &quot;string&quot;
console.log(stringParaCS01); // curso CS01

// Invocando como construtor
var objetoParaWD47 = new Curso(&quot;WD47&quot;);
typeof(objetoParaWD47); // object
console.log(objetoParaWD47.nome); // WD47
</pre>
<p>Quando a função referenciada por <code>Curso</code> foi criada, a intenção era usá-la sempre como uma função construtora. Mas nada nos impediu de usar o padrão simples de invocação com essa função. A única pista que temos de que ela deve ser usada como um construtor é a convenção de usar a primeira letra maiúscula no nome da referência. <code>Curso</code>, <code>Pessoa</code> indica que queremos que as funções sejam usadas para criar objetos, diferente de <code>alert</code>, <code>log</code>, etc.</p>
<p>Esse é um ponto que precisa de nossa atenção. Considere o caso da função <code>Pessoa</code> que adiciona atributos ao <code>this</code> quando invocada. Se por um acaso em algum momento esquecermos de que ela é na verdade uma construtora, e a invocarmos de forma simples: <code>var p = Pessoa()</code>, serão criadas as variáveis <code>nome</code> e <code>email</code> em <code>window</code>! Isso porque, como vimos no <a href="http://blog.caelum.com.br/as-multiplas-personalidades-do-this-em-javascript/">post anterior</a>, quando uma função é invocada de forma simples, a palavra chave <code>this</code> é associada com <code>window</code>.</p>
<p>Essa ambiguidade das funções criadas para serem construtoras é o alvo de uma das críticas quanto ao uso do operador <code>new</code> feita pelo <a href="http://www.crockford.com/">Douglas Crockford</a>, em seu excelente livro <a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/ref=sr_1_1?ie=UTF8&#038;qid=1336748220&#038;sr=8-1">JavaScript The Good Parts</a>.</p>
<p>Mas e se a função retornar um objeto do tipo <code>object</code> explicitamente, usando a palavra chave <code>return</code>? Nesse caso um novo objeto será criado, atribuído ao <code>this</code>, mas não será retornando ao final da execução. No exemplo a seguir vemos que apesar de atributos serem criados no objeto referenciado por <code>this</code>, eles não são acessíveis fora da função, já que o retorno é um outro objeto:</p>
<pre class="brush: jscript; title: ; notranslate">
var Curso = function(nome, duracao) {
    this.duracao = duracao;
    var novoCurso = {&quot;nome&quot; :  nome, &quot;horario&quot; : &quot;8h00&quot;};
    return novoCurso;
}

var wd47 = new Curso(&quot;WD47&quot;, 20);
typeof(wd47); // object
typeof(wd47.duracao); // undefined
console.log(wd47.nome); // WD47
</pre>
<p>É um bom momento para lembrar que uma instância de <code>Array</code> no JavaScript, é na verdade do tipo <code>object</code>, podemos verificar isso através do seguinte código:</p>
<pre class="brush: jscript; title: ; notranslate">
var novoArray = new Array();
typeof(novoArray); // object
var outroArray = [&quot;oi&quot;];
typeof(outroArray); // object
</pre>
<p>Portanto se sua função construtora retornar um <code>Array</code>, o uso do operador <code>new</code> na invocação não vai interferir no retorno.</p>
<p>Mas por que se preocupar em usar uma função para criar objetos se é possível (e comum) cria-los com a notação literal? Na notação literal, não temos como garantir consistência do estado do objeto no momento de sua criação. Mesmo que todas as pessoas precisem ter um email válido, podemos escrever:</p>
<pre class="brush: jscript; title: ; notranslate">
var ricardo = {
    nome: &quot;Ricardo Valeriano&quot;,
    email: &quot;ricardovaleriano&quot; // email invalido!
}
</pre>
<p>Já com uma função construtora <code>Pessoa</code>, esses dados seriam necessariamente passados a ela:</p>
<pre class="brush: jscript; title: ; notranslate">
ricardo = new Pessoa(&quot;Ricardo&quot;, &quot;ricardovaleriano&quot;);
</pre>
<p>Sabemos que quando uma função é invocada através do operador <code>new</code>, um instância de <code>object</code> é criada e atribuída a <code>this</code>. Sendo assim podemos ter algum tipo de processamento envolvido na criação de um objeto e uma função construtora permite isolar essa lógica caso ela se torne complexa:</p>
<pre class="brush: jscript; title: ; notranslate">
var Pessoa = function(nome, email) {
    this.nome =  nome;
    if (notValid(email)) this.email = &quot;invalido&quot;;
    else this.email = email;
}
</pre>
<p>Um outro aspecto importantíssimo sobre os objetos criados pelas funções construtoras tem um <em>link</em> para o protótipo da função que o criou. Essa é uma característica marcante da linguagem, explorada por frameworks como o <a href="http://jquery.com/">jQuery</a> para aumentar suas capacidades. A forma como o JavaScript lida com protótipos permite adicionar métodos em todos os objetos de determinado tipo, mesmo que esse tipo seja nativo da linguagem como é o caso de uma <code>string</code>.</p>
<p>Para entender melhor vamos alterar o protóptio da função <code>Pessoa</code> para garantir que, se um email não for passado como parâmetro no momento da criação, a pessoa seja criada com o email padrão contato@caelum.com.br. Para isso vamos alterar o protótipo de <code>Pessoa</code>, adicionando o atributo email com o valor padrão desejado no protótipo. Também vamos adicionar uma verificação em nossa função <code>Pessoa</code>: só iremos atribuir o parâmetro <code>email</code> para o atributo <code>email</code> em <code>this</code> caso esse atributo tenha sido passado como parâmetro:</p>
<pre class="brush: jscript; title: ; notranslate">
var Pessoa = function(nome, email) {
     this.nome =  nome;

     // verifica se o e-mail foi preenchido
     if (email) {
          this.email = email;
     }
}

Pessoa.prototype.email = &quot;contato@caelum.com.br&quot;

var ricardo = new Pessoa(&quot;Ricardo&quot;);
console.log(ricardo.email); // contato@caelum.com.br

var joao = new Pessoa(&quot;Joao da Silva&quot;, &quot;joao@da.silva&quot;);
console.log(joao.email); // joao@da.silva
</pre>
<p>Perfeito! Usando essa característica da linguagem podemos alterar o protótipo das que constroem os tipos nativos do JavaScript, como as funções <code>String</code>, <code>Array</code>, <code>Number</code> ou outra qualquer. Qualquer atributo ou função adicionado ao protótipo de uma dessas funções ficará disponível em qualquer objeto do tipo gerado por elas. Vamos alterar o <code>prototype</code> da função construtora <code>String</code> e adicionar uma função a ele. A partir desse momento qualquer <code>string</code> criada tem disponível a função adicionada ao protótipo, veja:</p>
<pre class="brush: jscript; title: ; notranslate">
String.prototype.paraNumero = function() {
  if(this == &quot;um&quot;) {
    return 1;
  }
}

console.log(&quot;um&quot;.paraNumero()); // 1
</pre>
<p>Existem muitos outros detalhes envolvidos com o uso de protóptios em JavaScript, alguns deles abordados no curso <a href="http://www.caelum.com.br/curso/wd-47-programacao-front-end-avancada-javascript-jquery/">WD-47</a> da Caelum. Nos vemos por lá!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=jvLi5bKbqFk:RutNYAgSUyk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=jvLi5bKbqFk:RutNYAgSUyk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=jvLi5bKbqFk:RutNYAgSUyk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=jvLi5bKbqFk:RutNYAgSUyk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=jvLi5bKbqFk:RutNYAgSUyk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=jvLi5bKbqFk:RutNYAgSUyk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=jvLi5bKbqFk:RutNYAgSUyk:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/jvLi5bKbqFk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/conhecendo-o-operator-new-e-os-prototipos-no-javascript/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/conhecendo-o-operator-new-e-os-prototipos-no-javascript/</feedburner:origLink></item>
		<item>
		<title>JavaCE Conference 2012 – Eu Fui</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/bhtcRR1Dxmc/</link>
		<comments>http://blog.caelum.com.br/javace-conference-2012-eu-fui/#comments</comments>
		<pubDate>Tue, 15 May 2012 12:49:18 +0000</pubDate>
		<dc:creator>Raphael Lacerda</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[cejug]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[fortaleza]]></category>
		<category><![CDATA[javace]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5050</guid>
		<description><![CDATA[Nos dias 11 e 12 de maio aconteceu, em Fortaleza, o JavaCE Conference, evento com foco na plataforma Java e não restrito apenas a ela. Foram abordadas outras linguagens como C#, Ruby e Scala, além do desenvolvimento mobile para Android e iOS. O evento foi organizado pela Milfont Consulting e TriadWorks. No primeiro dia, Paulo <a href="http://blog.caelum.com.br/javace-conference-2012-eu-fui/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/javace.png" width="240" />
		</p><p>Nos dias 11 e 12 de maio aconteceu, em Fortaleza, o <a href="http://conference.javace.org/">JavaCE Conference</a>, evento com foco na  plataforma Java e não restrito apenas a ela. Foram abordadas outras linguagens como C#, Ruby e Scala, além do desenvolvimento mobile para Android e iOS. O evento foi organizado pela <a href="http://www.milfont.org/">Milfont Consulting</a> e <a href="http://triadworks.com.br/">TriadWorks</a>. </p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/javace.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/javace-214x300.png" alt="" title="javace" width="214" height="300" class="aligncenter size-medium wp-image-5051" /></a></p>
<p>No primeiro dia, Paulo Silveira e eu apresentamos a principal novidade do futuro próximo do Java, o projeto <a href="http://openjdk.java.net/projects/lambda/">Lambda do JDK 8</a>, passando por APIs que trazem uma programação mais funcional em Java, como o <a href="blog.caelum.com.br/codigo-expressivo-e-programacao-funcional-em-java-com-lambdaj">LambdaJ</a>. Loiane Groner mostrou como ser produtivo com VRaptor e ExtJS, além de fazer uma introdução aos dois frameworks. A equipe TriadWorks analisou várias ferramentas de build (ant, maven e gradle), mostrando vantagens e desvantagens para depois apresentar features do poder do Groovy com Gradle. Carlos Villela e Gregório Melo, da ThoughtWorks, trataram sobre NoSQL, mostrando features do Redis e do HBase, assim como um pouco do <a href="http://blog.caelum.com.br/nosql-do-teorema-cap-para-paccl/">teorema CAP</a>. Otavio Santana também apresentou casos de uso sobre bancos NoSQL, focando o Apache Cassandra e no Java.</p>
<p>Ainda teve Douglas Campos fazendo uma palestra hardcore sobre o invoke dynamic, a nova instrução do bytecode do Java 7. Diogo Souza que fez uma excelente e divertida apresentação sobre <a href="http://blog.caelum.com.br/injecao-de-dependencias-no-android-com-roboguice/">RoboGuice, ferramenta para injeção de dependências para aplicações Android</a>. Ele explicou desde os conceitos básicos de Injeção dependência até demonstração de código e ainda salientou sobre <a href="http://blog.caelum.com.br/2012-e-o-ano-do-mercado-mobile-no-brasil/">o ano mobile no país</a>. E por fim tivemos Leonardo Leitão falando sobre Rest e Cloud Computing, e Bruno Souza finalizou com uma discussão sobre os rumos da plataforma Java, o caso da Oracle X Google e como a comunidade e os desenvolvedores se enquadram em toda essa situação. O Tiago Ribeiro também <a href="http://tiagoribeirof.blogspot.com.br/2012/05/java-ce-community-conference-o-que.html">postou sobre o primeiro dia do evento</a>.</p>
<p>No segundo dia, Alberto Souza explicou as facilidades e dificuldades encontradas no desenvolvimento de uma aplicação em Scala, cuidados em relação ao uso dos implicits e o problema do tooling, compilador e do sbt: todos incipientes. Tivemos Marlus Saraiva com JasperReports no Ruby on Rails. Luca Bastos fez uma palestra divertida sobre machine learning, mostrando que ela está presente em praticamente todas as ferramentas que utilizamos. Maurício Linhares fez uma palestra sobre  algumas dificuldades que ele teve com Ruby, Java e que com Scala foram sanadas. Por fim, Rodrigo Kumpera explicou da dificuldade dos desenvolvedores mobile em ter que programar cross-plataform, haja visto que cada plataforma (iOS, Android, Windows) utiliza uma linguagem diferente. Ele apresentou a proposta do Mono que é uniformizar C# como linguagem de desenvolvimento para as três ambientes. Ainda tivemos palestras sobre integração contínua com Tiago Bastos e big data analytics com Fernando Meyer.</p>
<p>Foi um evento que mais uma vez mostrou a força que tem a comunidade Java, que há tempos saltou de focar na linguagem para abordar mais firmemente a plataforma e até outras tecnologias. Sem falar na destacada comunidade cearense, sempre presente em eventos de todo o Brasil. Quem foi pode ver muitos dos tópicos quentes sendo apresentados, sem contar as produtivas conversas nos corredores e até mesmo codificação durante os vários happy hours. Tudo isso em uma ensolarada Fortaleza. Nos vemos nos próximos eventos, como o <a href="http://www.conexaojava.com.br/">Conexão Java</a>, focado no público iniciante da plataforma, e no <a href="http://www.qconsp.com/">QCon SP</a>, uma conferência para os desenvolvedores mais experientes. Fica o agradecimento a todos organizadores, especialmente  ao Christiano Milfont,  pela coordenação e confiança.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=bhtcRR1Dxmc:lFdU4OAVQ_g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=bhtcRR1Dxmc:lFdU4OAVQ_g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=bhtcRR1Dxmc:lFdU4OAVQ_g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=bhtcRR1Dxmc:lFdU4OAVQ_g:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=bhtcRR1Dxmc:lFdU4OAVQ_g:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=bhtcRR1Dxmc:lFdU4OAVQ_g:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=bhtcRR1Dxmc:lFdU4OAVQ_g:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/bhtcRR1Dxmc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/javace-conference-2012-eu-fui/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/javace-conference-2012-eu-fui/</feedburner:origLink></item>
		<item>
		<title>Trabalhando com JSON no iOS</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/g6x1O6BOtRY/</link>
		<comments>http://blog.caelum.com.br/trabalhando-com-json-no-ios/#comments</comments>
		<pubDate>Thu, 10 May 2012 13:07:12 +0000</pubDate>
		<dc:creator>Diego Chohfi</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ip-67]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[objectivec]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5022</guid>
		<description><![CDATA[Com o crescimento do mercado mobile, a integração de sistemas com os pequenos aparelhos se tornou essencial. O formato JSON se popularizou com a mesma velocidade que o desenvolvimento mobile. Sua simplicidade e facilidade de desenvolver parsers o tornou uma das principais alternativas na integração de sistemas web, em especial para ser consumido via AJAX. <a href="http://blog.caelum.com.br/trabalhando-com-json-no-ios/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/json-ios.png" width="240" />
		</p><p>Com o crescimento do mercado mobile, a integração de sistemas com os pequenos aparelhos se tornou essencial. O formato <a href="http://www.json.org" title="JSON">JSON</a> se popularizou com a mesma velocidade que o desenvolvimento mobile. Sua simplicidade e facilidade de desenvolver parsers o tornou uma das principais alternativas na integração de sistemas web, em especial para ser consumido via AJAX.</p>
<p>No <strong>iOS</strong> não foi diferente. A necessidade dos desenvolvedores levou o surgimento de diversas bibliotecas que faziam o trabalho de ler e gerar JSON com extrema facilidade, como o <a href="https://github.com/stig/json-framework/" title="JSON-Framework">JSON Framework</a> e o <a href="https://github.com/TouchCode/TouchJSON" title="TouchJSON">TouchJSON</a>. Porém a Apple não quis ficar de fora e incorporou a classe <a href="http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html" title="NSJSONSerialization"><code>NSJSONSerialization</code></a>, capaz de gerenciar o formato tanto no iOS como no desenvolvimento para OSX, com a mesma facilidade que as bibliotecas opensource trouxeram.</p>
<p>Recetemente <a href="https://github.com/caelum/onibus-ios">desenvolvemos um projeto para iOS</a> para auxiliar os alunos do <a href="http://www.caelum.com.br/curso/ip-67-desenvolvimento-movel-ios-5-iphone-ipad/" title="IP-67">nosso curso de iOS, o IP-67</a>, enriquecendo a experiência e trazendo um exemplo bem palpável. A aplicação consiste em buscar os pontos de ônibus próximos a localização do usuário. Para integrar a nossa aplicação com um backend em Ruby utilizamos JSON como o formato e a classe <code>NSJSONSerialization</code> se mostrou extremamente simples e fácil de se trabalhar. Vamos entender como fizemos, do lado do dispositivo, a leitura e manipulação dos dados.</p>
<p>Primeiramente precisamos obter as informações no formato JSON para então parsea-los. Utilizando o método <code>+ (id)dataWithContentsOfURL:(NSURL *)url;</code> da classe <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html" title="NSData">NSData</a> para fazer uma request e obter as informações de forma síncrona em um endereço da WEB:</p>
<pre class="brush: objc; title: ; notranslate">
NSString *url = [NSString stringWithFormat:@&quot;http://ondeestaoalbi.herokuapp.com/onibusesNosPontosProximos.json?lat=%f&amp;long=%f&quot;, -23.588453, -46.632103];
NSData *jsonData = [NSData dataWithContentsOfURL: [NSURL URLWithString:url]];
</pre>
<p>O nosso serviço retornará um JSON com a seguinte estrutura:</p>
<pre class="brush: jscript; title: ; notranslate">
{
    &quot;nome&quot;: &quot;920016054&quot;,
    &quot;descricao&quot;: &quot;R. Dr. Neto De Araujo, 311&quot;,
    &quot;coordenada&quot;: {
        &quot;latitude&quot;: -23.5876,
        &quot;longitude&quot;: -46.6321
    }
}
</pre>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/json-ios.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/json-ios.png" alt="" title="json-ios" width="393" height="309" class="aligncenter size-full wp-image-5041" /></a></p>
<p>Após receber as informações, vamos utilizar a classe <code>NSJSONSerialization</code> para transformar o JSON em um <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsdictionary_Class/Reference/Reference.html" title="NSDictionary" >NSDictionary</a>, contendo as chaves e valores das informações sobre o ponto.</p>
<pre class="brush: objc; title: ; notranslate">
NSError* error;
NSDictionary *resultados = [NSJSONSerialization JSONObjectWithData:jsonData
                options:NSJSONReadingMutableContainers error:&amp;error];
</pre>
<p>Caso o JSON seja válido e a conversão seja feita com sucesso podemos buscar os valores no <code>NSDictionary</code> a partir de uma chave, utilizando o método <code>- (id)objectForKey:(id)aKey;</code>:</p>
<pre class="brush: objc; title: ; notranslate">
NSError *error;
NSDictionary *resultados = [NSJSONSerialization JSONObjectWithData:jsonData
                options:NSJSONReadingMutableContainers error:&amp;error];
if(!error) {
    NSString *nome = [resultados objectForKey:@&quot;nome&quot;];
    NSString *descricao = [resultados objectForKey:@&quot;descricao&quot;];
    NSLog(@&quot;Nome: %@, descrição: %@&quot;, nome, descricao);
}
</pre>
<p>Poderíamos continuar utilizando o <code>NSDictionary</code> para armazenar as informações dos pontos encontrados, mas imagine que por algum motivo precisemos mostrar a descrição do nosso Ponto sempre com letra minúscula e removendo os espaços do começo e do fim da nossa NSString, o código ficaria da seguinte forma:</p>
<pre class="brush: objc; title: ; notranslate">
    NSString *nome = [resultados objectForKey:@&quot;nome&quot;];
    NSString *descricao = [[resultados objectForKey:@&quot;descricao&quot;] lowercaseString];
    descricao = [descricao stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSLog(@&quot;Nome: %@, descrição: %@&quot;, nome, descricao);
</pre>
<p>Perceba que o código não é mais tão simples quanto anteriormente, além disso, precisaríamos espalhá-lo por todo o projeto. A manutenção também seria difícil, pois precisaremos <em>copiar e colar</em> o mesmo código toda vez que a descrição for exibida e caso a regra de exibição seja alterada o código que copiamos e colamos terá que ser alterado.</p>
<p>Temos esse problema pois estamos utilizando a classe <code>NSDictionary</code> para guardar <strong>estado</strong> do nosso <code>Ponto</code> e não podemos definir nenhum comportamento adicional. Para manter os dados organizados e de fácil manutenção devemos sempre criar classes para representar tipos e não mantê-los na representação de chave e valor, desta forma, além de guardar o estado do objeto, podemos também definir novos comportamentos, facilitando a manutenção e a reutilização de código.</p>
<p>Vamos criar as classes com os referentes atributos e também definir um método de classe para criar uma instância do <code>Ponto</code>, esse método será responsável por buscar suas informações em um <code>NSDictionary</code> passado como argumento. Essa regra fica isolada e fácil de dar manutenção caso alguma das chaves mude:</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;Foundation/Foundation.h&gt;
#import &quot;Coordenada.h&quot;

@interface Ponto : NSObject

@property(nonatomic, strong) NSString *nome;
@property(nonatomic, strong) NSString *descricao;
@property(nonatomic, strong) Coordenada *coordenada;

+ (Ponto *) comDicionario: (NSDictionary *) dicionario;

@end

#import &quot;Ponto.h&quot;

@implementation Ponto
@synthesize nome, descricao, coordenada;

+ (Ponto *) comDicionario: (NSDictionary *) dicionario {
	Ponto * ponto = [[Ponto alloc] init];
	[ponto setNome: [dicionario objectForKey:@&quot;nome&quot;]];
	[ponto setDescricao: [dicionario objectForKey:@&quot;descricao&quot;]];

	Coordenada *coordenada  = [Coordenada comDicionario: [dicionario objectForKey: @&quot;coordenada&quot;]];
	[ponto setCoordenada: coordenada];
	return ponto;
}

@end
</pre>
<p>Se fosse preciso definir uma regra para buscar a descrição do <code>Ponto</code> da forma que descrevemos anteriormente, podemos alterar o método que busca o atributo na classe, isolando o código e facilitando futuras manutenções.</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;Ponto.h&quot;

@implementation Ponto
@synthesize nome, descricao, coordenada;

- (NSString *) descricao {
    NSString *descricaoEmMinusculo = [descricao lowercaseString];
    return [descricaoEmMinusculo stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

@end
</pre>
<p>Para obter um Ponto a partir de um JSON chegamos ao seguinte código:</p>
<pre class="brush: objc; title: ; notranslate">
NSString *url = [NSString stringWithFormat:@&quot;http://ondeestaoalbi.herokuapp.com/onibusesNosPontosProximos.json?lat=%f&amp;long=%f&quot;, -23.588453, -46.632103];
NSData *jsonData = [NSData dataWithContentsOfURL: [NSURL URLWithString:url]];

NSError *error;
NSDictionary *resultados = [NSJSONSerialization JSONObjectWithData:jsonData
                options:NSJSONReadingMutableContainers error:&amp;error];
if(!error){
    Ponto *ponto = [Ponto comDicionario: resultados];
    NSLog(@&quot;Ponto: %@&quot;, ponto.descricao);
}
</pre>
<p>Percebendo a dificuldade e a duplicação de código que temos que escrever ao buscar os valores no <code>NSDictionary</code>, desenvolvemos uma pequena biblioteca para facilitar essa tarefa. O <code><a href="https://github.com/dchohfi/KeyValueObjectMapping">KeyValueObjectMapping</a></code> surgiu da necessidade de transformar grandes estruturas de dados automaticamente em objetos, seguindo padrões e quando necessário adicionando configurações para alterar as convenções. Poderíamos remover a implementação do método <code>+ (Ponto *) comDicionario: (NSDictionary *) dicionario;</code> e com o <code>KeyValueObjectMapping</code> teríamos:</p>
<pre class="brush: objc; title: ; notranslate">
DCKeyValueObjectMapping *parser = [DCKeyValueObjectMapping mapperForClass:[Ponto class]];
Ponto *ponto = [parser parseDictionary:resultados];
</pre>
<p>Lembrando que o <code>KeyValueObjectMapping</code> serve para transformar qualquer tipo de dado que se comporte como um <code>NSDictionary</code>, chave e valor, podendo ser um JSON, um PLIST, entre outros. Você está convidado a contribuir nos projetos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=g6x1O6BOtRY:rAszcPpjobM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=g6x1O6BOtRY:rAszcPpjobM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=g6x1O6BOtRY:rAszcPpjobM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=g6x1O6BOtRY:rAszcPpjobM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=g6x1O6BOtRY:rAszcPpjobM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=g6x1O6BOtRY:rAszcPpjobM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=g6x1O6BOtRY:rAszcPpjobM:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/g6x1O6BOtRY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/trabalhando-com-json-no-ios/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/trabalhando-com-json-no-ios/</feedburner:origLink></item>
		<item>
		<title>As múltiplas personalidades do this em JavaScript</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/FdCZLj0vTkw/</link>
		<comments>http://blog.caelum.com.br/as-multiplas-personalidades-do-this-em-javascript/#comments</comments>
		<pubDate>Mon, 07 May 2012 14:18:12 +0000</pubDate>
		<dc:creator>Ricardo Valeriano</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[this]]></category>
		<category><![CDATA[wd-47]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5032</guid>
		<description><![CDATA[Se você já escreveu algum código JavaScript, não deve mais achar estranho quando alguém atribui uma função a uma variável. Mas o que exatamente acontece quando você faz isso? Em JavaScript, as funções podem ser passadas como parâmetros para outras funções, retornadas como valor e, como já dito, referenciadas por variáveis. A linguagem trata as <a href="http://blog.caelum.com.br/as-multiplas-personalidades-do-this-em-javascript/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/javascript.jpg" width="240" />
		</p><p>Se você já escreveu algum código JavaScript, não deve mais achar estranho quando alguém atribui uma função a uma variável. Mas o que exatamente acontece quando você faz isso? Em JavaScript, as funções podem ser passadas como parâmetros para outras funções, retornadas como valor e, como já dito, referenciadas por variáveis. A linguagem trata as funções como <a href="http://en.wikipedia.org/wiki/First-class_function">cidadãs de primeira classe</a>.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/javascript.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/javascript-300x225.jpg" alt="" title="javascript" width="300" height="225" class="aligncenter size-medium wp-image-5035" /></a></p>
<p>O JavaScript representa funções como objetos. Quando atribuímos uma função a uma variável, estamos criando uma referência para um objeto do tipo <code>function</code>. Podemos ver isso de forma clara utilizando o operador <code>typeof</code>. O exemplo abaixo cria uma função e a atribui a variável chamada <code>apresentar</code>, que recebe como parâmetro um objeto com os atributos <em>nome</em> e <em>email</em>. Vamos invocar a função e a seguir usar o operador <code>typeof</code> para inspecionar o tipo que é referenciado pela variável usada para guardar a função:</p>
<pre class="brush: jscript; title: ; notranslate">
var apresentar = function(pessoa) {
     console.log(&quot;Eu sou &quot;+ pessoa.nome +&quot; e meu email é: &quot;+ pessoa.email);
}

apresentar({nome: &quot;Ricardo&quot;, email: &quot;ricardo.valeriano@caelum.com.br&quot;});
// Eu sou Ricardo e meu email é: ricardo.valeriano@caelum.com.br

typeof(apresentar); // &quot;function&quot;
</pre>
<p>Quando invocamos uma função com o operador <code>()</code>, estamos utilizando uma forma de invocação chamada por alguns de <a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/this#Simple_call">invocação simples</a>. A maneira como uma função é invocada tem efeito direto sobre como a palavra chave <code>this</code> é &#8220;atribuída&#8221; no corpo da função.</p>
<p>Quando seu código JavaScript é executado em um navegador, uma variável global chamada <code>window</code> é criada para representar a própria janela do navegador. E quando a forma simples de invocação é usada, o objeto referenciado por <code>this</code> é equivalente ao <code>window</code>, veja:</p>
<pre class="brush: jscript; title: ; notranslate">
typeof(window); // &quot;object&quot;

console.log(window); // DOWWindow

var verificandoWindow = function() {
    console.log(this);
    console.log(this === window);
}
verificandoWindow();
// DOWWindow, true
</pre>
<p>Notou que o tipo referenciado por <code>window</code> é <code>object</code>? Podemos criar nossa própria instância de <code>object</code> usando a chamada <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Object_literals">notação literal</a>, que é a que foi usada para criar o parametro passado na invocação da função <code>apresentar</code> no nosso primeiro exemplo.</p>
<p>A variável <code>window</code> é uma referência para um objeto e podemos adicionar atributos a ele! Quando criamos uma variável fora de uma função (ou seja no escopo
<li>global</li>
<p>), automaticamente um atributo com o mesmo nome da variável é criado em <code>window</code> para referenciar o objeto atribuído a nova variável. Quando tentamos acessar o valor dessas variáveis, estamos, na verdade, recuperando o valor de um atributo de <code>window</code>. Veja o exemplo a seguir:</p>
<pre class="brush: jscript; title: ; notranslate">
var todosPodemMeVer = &quot;porque sou um atributo de window&quot;;
console.log(window.todosPodemMeVer);
// porque sou um atributo de window

var pessoa = {
   nome:  &quot;Ricardo&quot;,
   email: &quot;ricardo.valeriano@caelum.com.br&quot;
}

console.log(pessoa.nome);
// Ricardo

console.log(window.pessoa === pessoa);
// true
</pre>
<p>Toda função tem acesso à palavra chave <code>this</code>. Vamos usar isso para obter informações sobre esse objeto. Vamos criar as propriedades <em>nome</em> e <em>email</em> em <code>window</code> e alterar a função para buscar os valores usando atributos presentes em <code>this</code>, e não mais do objeto recebido como argumento:</p>
<pre class="brush: jscript; title: ; notranslate">
var nome = &quot;João da Silva&quot;;
window.email = &quot;joao@da.silva&quot;;

var apresentar = function() {
    console.log(this === window);
    console.log(&quot;Eu sou &quot;+ this.nome +&quot; e meu email é &quot;+ this.email);
}

apresentar();
// true
// Eu sou João da Silva e meu email é joao@da.silva
</pre>
<p>Veja que criamos um atributo novo chamado <code>email</code> para o objeto referenciado por <code>window</code>. Um atributo pode referenciar qualquer objeto, inclusive funções. Para ilustrar, vamos criar um novo atributo chamado <code>quemSouEu</code> em <code>pessoa</code>, que é uma referência para a função <code>apresentar</code> do exemplo anterior. Dessa forma, será possível invocar essa função diretamente a partir do objeto <code>pessoa</code>.</p>
<pre class="brush: jscript; title: ; notranslate">
var pessoa = {
   nome:  &quot;Ricardo&quot;,
   email: &quot;ricardo.valeriano@caelum.com.br&quot;
}
</pre>
<p>Mas a função usa internamente a variável <code>this</code> para fazer seu trabalho, certo? Será que isso vai continuar funcionando? Repare a saída:</p>
<pre class="brush: jscript; title: ; notranslate">
pessoa.quemSouEu = apresentar;
pessoa.quemSouEu();
// false
// Eu sou Ricardo e meu email é ricardo.valeriano@caelum.com.br

apresentar();// Agora novamente invocando a função com o operador ()
// true
// Eu sou João da Silva e meu email é joao@da.silva
</pre>
<p>Uma função referenciada por um atributo de um objeto pode ser invocada como um método daquele objeto, a palavra chave <code>this</code> é atribuída ao objeto onde a função foi invocada.</p>
<p>Uma outra forma de executar uma função no contexto de um objeto específico é invocando o método <code>call</code> disponível em todo objeto do tipo <code>function</code>. Esse método possibilita definir o objeto referenciado por <code>this</code> no momento da invocação:</p>
<pre class="brush: jscript; title: ; notranslate">
apresentar.call(pessoa);
// false
// Eu sou Ricardo e meu email é ricardo.valeriano@caelum.com.br
</pre>
<p>Mas não pense que acabou! Existem ainda outras formas de invocar funções que interferem em como a palavra <code>this</code> é atribuída. Por exemplo, o operador <code>new</code> pode ser utilizado em associação com o operador <code>()</code> para invocar qualquer função, isso vai fazer com que o <code>this</code> seja atribuído a um novo objeto. O retorno da função também pode ser alterado por essa forma de invocação. Você lerá sobre esses detalhes na segunda parte desse artigo.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=FdCZLj0vTkw:nJZx_bHNzmc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=FdCZLj0vTkw:nJZx_bHNzmc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=FdCZLj0vTkw:nJZx_bHNzmc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=FdCZLj0vTkw:nJZx_bHNzmc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=FdCZLj0vTkw:nJZx_bHNzmc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=FdCZLj0vTkw:nJZx_bHNzmc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=FdCZLj0vTkw:nJZx_bHNzmc:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/FdCZLj0vTkw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/as-multiplas-personalidades-do-this-em-javascript/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/as-multiplas-personalidades-do-this-em-javascript/</feedburner:origLink></item>
		<item>
		<title>Injeção de dependências no ASP.NET MVC</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/WObGVsAp77c/</link>
		<comments>http://blog.caelum.com.br/injecao-de-dependencias-no-asp-net-mvc/#comments</comments>
		<pubDate>Thu, 03 May 2012 13:05:24 +0000</pubDate>
		<dc:creator>Victor Kendy Harada</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Asp.Net]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[online]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4995</guid>
		<description><![CDATA[Para melhorar a manutenibilidade de um sistema, devemos programar voltados para interface. Assim, nos preocupamos apenas com o contrato definido pela interface, não com sua implementação, diminuindo o acoplamento do código. Uma das formas de facilitar essa prática é utilizar a injeção de dependências. Dessa forma, nossas classes não precisam conhecer a lógica de instanciação, <a href="http://blog.caelum.com.br/injecao-de-dependencias-no-asp-net-mvc/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/aspnet.gif" width="240" />
		</p><p>Para melhorar a manutenibilidade de um sistema, <a href="http://stackoverflow.com/questions/1257670/c-sharp-when-to-program-to-an-interface">devemos</a> <a href="http://www.arquiteturajava.com.br/livro/programe-voltado-a-interface-nao-a-implementacao.pdf">programar voltados para interface</a>. Assim, nos preocupamos apenas com o contrato definido pela interface, não com sua implementação, diminuindo o acoplamento do código. Uma das formas de facilitar essa prática é utilizar a injeção de dependências. Dessa forma, nossas classes não precisam conhecer a lógica de instanciação, ciclo devida e nem implementação dos componente do sistema, podendo mudar facilmente a implementação de suas dependências.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/aspnet.gif"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/05/aspnet-300x232.gif" alt="" title="aspnet" width="300" height="232" class="aligncenter size-medium wp-image-5026" /></a></p>
<p>Quando escrevemos um controller no <a href="http://www.caelum.com.br/curso/online/aspnetmvc/">ASP.NET MVC</a>, é interessante que a classe não precise se preocupar com a instanciação de suas dependências.  Queremos, por exemplo, receber todas essas dependências no construtor. Vamos usar como exemplo um <code>UserController</code> que precisa de um <code>IUserDao</code>:</p>
<pre class="brush: java; title: ; notranslate">
class UserController {
  private IUserDao userDao;
  public UserController(IUserDao userDao) {
      this.userDao = userDao;
  }
}
</pre>
<p>Porém, o ASP.NET MVC não consegue instanciar um controller escrito dessa forma. Ele não sabe como instanciar um <code>IUserDao</code>! Por esse motivo, apenas controllers que tenham um construtor sem argumentos podem ser instanciados. Para mudar esse comportamento, precisamos ensinar o ASP.NET MVC a instanciar controladores que recebem parâmetros no construtor.</p>
<h2>Unity Container</h2>
<p>Para que possamos criar instâncias de classes que recebam as dependências pelo construtor, precisamos primeiro guardar as instâncias dessas dependências em algum lugar. Precisamos, por exemplo, ter um <code>IUserDao</code> em mãos para passar para o construtor do <code>UserController</code>.</p>
<p>Existem diversos frameworks que nos ajudam nessa tarefa. Eles são conhecidos como frameworks de injeção de dependência. Nesse post utilizaremos o framework de injeção de dependências da Microsoft, o <strong><a href="http://unity.codeplex.com/">Unity</a></strong>.</p>
<p>O Unity nos oferece uma classe chamada <code>UnityContainer</code>, classe na qual podemos registrar tipos que serão injetados. Para registrar uma dependência, utilizamos o método <code>RegisterType</code> do container, passando a interface, a implementação que deve ser injetada e um nome para ela.</p>
<p>No exemplo, queremos registrar o <code>UserController</code> como uma implementação de <code>IController</code> e o <code>UserDao</code> como uma implementação de <code>IUserDao</code>. Além disso, para seguir a convenção de nomes do ASP.NET MVC, registraremos o <code>UserController</code> com o nome <em>User</em>.</p>
<pre class="brush: java; title: ; notranslate">
Container.RegisterType(typeof(IUserDao), typeof(UserDao));
Container.RegisterType(typeof(IController), typeof(UserController), “User”);
</pre>
<p>Agora que temos registrado no Unity tanto o Dao quanto o Controller, podemos pedir instâncias dessas classes para ele! Ao pedirmos uma instância de <code>UserController</code>, o Unity se encarregará de enviar o <code>UserDao</code> para o construtor dele:</p>
<pre class="brush: java; title: ; notranslate">
IController controller = Container.Resolve&lt;IController&gt;(&quot;User&quot;);
</pre>
<h2>ControllerFactory com Injeção de Dependências</h2>
<p>Agora precisamos ensinar o ASP.NET MVC a utilizar o Unity para instanciar os controllers. Para fazer isso, precisamos criar uma classe que implementa <code>IControllerFactory</code>. Implementações dessa interface devem fornecer três métodos: <code>CreateController</code>, <code>ReleaseController</code> e <code>GetControllerSessionBehavior</code>.</p>
<p><code>CreateController</code> recebe uma <code>String</code> com o nome do controller que precisa ser criado e deve devolver uma instância de <code>IController</code>. <code>ReleaseController</code> recebe um <code>IController</code> e deve liberar os recursos utilizados. A <code>String</code> com o nome do controller segue <a href="http://msdn.microsoft.com/en-us/gg618491">a convenção do ASP.NET MVC</a>, ou seja, quando recebemos a <code>String</code> &#8220;<em>User</em>&#8220;, devemos criar uma instância de <code>UserController</code>.</p>
<pre class="brush: java; title: ; notranslate">
class UnityFactory : IControllerFactory {
  public UnityFactory() {
    this.Container = new UnityContainer();
    this.Container.RegisterType(typeof(IUserDao), typeof(UserDao));
    this.Container.RegisterType(typeof(IController), typeof(UserController), “User”);
  }

  public IController CreateController (RequestContext context, String controllerName) {
    IController controller = this.Container.Resolve&lt;IController&gt;(controllerName);
    return controller;
  }
  // ...
}
</pre>
<p>Precisamos também ensinar o ASP.NET MVC a destruir nosso controller e liberar quaisquer recursos que alocamos. Para isso, vamos implementar o método <code>ReleaseController</code>:</p>
<pre class="brush: java; title: ; notranslate">
public void ReleaseController(IController controller) {
  this.Container.Teardown(controller);
}
</pre>
<p>O <code>GetControllerSessionBehavior</code> deve retornar o valor de um enum que define o comportamento da session do ASP.NET MVC. Como queremos que a Session tenha <a href="http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatebehavior.aspx">o mesmo comportamento da Session padrão</a>, esse método vai retornar <code>System.Web.SessionState.SessionStateBehavior.Default</code>.</p>
<pre class="brush: java; title: ; notranslate">
public System.Web.SessionState.SessionStateBehavior
      GetControllerSessionBehavior(RequestContext ctx, string controllerName) {
  return System.Web.SessionState.SessionStateBehavior.Default;
}
</pre>
<p>Estamos quase lá. Resta apenas substituir o mecanismo padrão do ASP.NET MVC pelo que acabamos de criar. Essa substituição é feita no arquivo <code>Global.asax</code> do projeto, através do método <code>SetControllerFactory</code>. Para manter a organização do arquivo <code>Global.asax</code>, o registro do <code>ControllerFactory</code> ficará junto com as configurações globais dentro do método <code>Application_Start()</code>:</p>
<pre class="brush: java; title: ; notranslate">
protected void Application_Start() {
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
  UnityFactory factory = new UnityFactory();
  ControllerBuilder.Current.SetControllerFactory(factory);
}
</pre>
<p>Agora que a aplicação está utilizando a fábrica customizada, o ASP.NET MVC é capaz de instanciar o <code>UserController</code>, passando o <code>UserDao</code> para ele! Essa factory ainda pode ser melhorada. Poderíamos, por exemplo, registrar automaticamente no Unity todos os controllers e componentes que serão injetados. Você pode ver essa implementação, um pouco mais complicada, <a title="Implementação da Unity Factory" href="https://gist.github.com/2490266">aqui</a>. Além disso, você pode ver a implementação da factory utilizando o container <a href="http://docs.castleproject.org/Windsor.MainPage.ashx">Windsor</a> no projeto <a href="https://github.com/caelum/agile-tickets-csharp">agile-tickets-csharp</a>, projeto utilizado no curso <a href="http://msdn.microsoft.com/en-us/gg618491">PM-87</a> da Caelum.</p>
<p>Pronto! Nossos controllers agora podem declarar suas dependências no construtor, deixando o código mais claro e mais fácil de ser testado. Aprenda a desenvolver com ASP.NET MVC em nosso <a title="Curso Online de ASP.NET MVC" href="http://www.caelum.com.br/curso/online/aspnetmvc/">curso online</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=WObGVsAp77c:KI39Tn-mYi8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=WObGVsAp77c:KI39Tn-mYi8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=WObGVsAp77c:KI39Tn-mYi8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=WObGVsAp77c:KI39Tn-mYi8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=WObGVsAp77c:KI39Tn-mYi8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=WObGVsAp77c:KI39Tn-mYi8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=WObGVsAp77c:KI39Tn-mYi8:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/WObGVsAp77c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/injecao-de-dependencias-no-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/injecao-de-dependencias-no-asp-net-mvc/</feedburner:origLink></item>
		<item>
		<title>Scala Days Londres 2012: como foi o evento</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/iNPT_W2vyTc/</link>
		<comments>http://blog.caelum.com.br/scala-days-londres-2012-como-foi-o-evento/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 13:08:43 +0000</pubDate>
		<dc:creator>Alberto Souza</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[funcional]]></category>
		<category><![CDATA[linguagens]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[scala days]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=5007</guid>
		<description><![CDATA[Entre os dias 17 e 18 de abril aconteceu em Londres o Scala Days, evento que reuniu diversos ícones envolvidos com o desenvolvimento da linguagem Scala, a qual também já foi tema de diversos posts no blog da Caelum. A grade contou com palestras sobre frameworks utilizados no mundo de desenvolvimento do Scala, detalhes de <a href="http://blog.caelum.com.br/scala-days-londres-2012-como-foi-o-evento/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays.jpg" width="240" />
		</p><p>Entre os dias 17 e 18 de abril aconteceu em Londres o <a href="http://days2012.scala-lang.org/">Scala Days</a>, evento que reuniu diversos ícones envolvidos com o desenvolvimento da linguagem <a href="http://blog.caelum.com.br/scala-sua-proxima-linguagem/">Scala</a>, a qual também já foi tema de diversos posts no blog da Caelum. <a href="http://days2012.scala-lang.org/program">A grade contou com palestras</a> sobre frameworks utilizados no mundo de desenvolvimento do Scala, detalhes de implementação do compilador, estado das IDE&#8217;s que estão sendo desenvolvidas para melhorar o ferramental, até casos de uso da linguagem nas empresas.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays.jpg"><img class="aligncenter size-medium wp-image-5020" title="scaladays" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays-300x180.jpg" alt="scala days london 2012" width="300" height="180" /></a></p>
<p>Um detalhe bastante interessante foi ver a preocupação com os problemas de tempo de compilação e <a href="http://lift.la/scalas-version-fragility-make-the-enterprise">compatibilidade binária</a> que a linguagem apresenta. Ainda é muito comum que as versões novas de bibliotecas não sejam compativeis com versões prévias e versões novas da linguagem obrigarem os mantenedores dos frameworks a recompilarem seus projetos. O <a href="http://www.scalatest.org/download">ScalaTest</a>, por exemplo, tem versões de downloads para diferentes versões do Scala.</p>
<p>O keynote mais esperado foi o de Martin Odersky, principal criador da linguagem, comentando sobre os rumos do Scala. Ele comentou sobre as novas <a href="http://docs.scala-lang.org/sips/index.html">SIP&#8217;s</a>, Scala Improvement Process, que são as propostas de melhorias para a linguagem, algo análogo às JSRs. Três bastante comentadas foram as <a href="http://docs.scala-lang.org/sips/pending/implicit-classes.html">Implicit Classes</a>, <a href="http://docs.scala-lang.org/sips/pending/value-classes.html">Values Classes</a> e as <a href="http://docs.scala-lang.org/sips/pending/self-cleaning-macros.html">Macros</a>. Esta última é uma nova maneira de realizar meta-programação na linguagem, a ideia é tranformar as Macros na forma padrão de criar extensões do compilador. Martin também comentou sobre a nova <a href="http://alots.wordpress.com/2012/03/06/getting-into-the-new-scalas-2-10-reflection-api/">API de reflection</a> que foi introduzida na versão 2.10 da linguagem. Eles conseguiram facilitar bastante a vida do programdor, principalmente quando é necessário analisar detalhes específicos do código Scala, como os implicits.</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays10.jpg"><img title="scaladays10" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays10-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays3.jpg"><img title="scaladays3" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays3-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays1.jpg"><img title="scaladays1" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/scaladays1-150x150.jpg" alt="" width="150" height="150" /></a></center>&nbsp;</p>
<p>Foi um evento muito bom, enquanto que no ano passado tiveram em torno de 250 inscrições, esse ano chegou na marca de 400 pessoas. Ficou claro que os próximos passos da linguagem são na direção de deixá-la mais preparada para uma abordagem enterprise. O esforço na melhoria das IDEs, compatibilidade binária e compilador deixa evidente a preocupação do time da Typesafe com o ferramental de suporte. O mesmo ferramental que é alvo de muitas critícas hoje em dia. Um outro ponto importante é a importância dada à inovação: basta analisar as novas SIP&#8217;s que trazem sempre novidades. Você já pode conferir <a href="http://skillsmatter.com/event/scala/scala-days-2012">algumas das palestras online</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=iNPT_W2vyTc:PjvU870QROo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=iNPT_W2vyTc:PjvU870QROo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=iNPT_W2vyTc:PjvU870QROo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=iNPT_W2vyTc:PjvU870QROo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=iNPT_W2vyTc:PjvU870QROo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=iNPT_W2vyTc:PjvU870QROo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=iNPT_W2vyTc:PjvU870QROo:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/iNPT_W2vyTc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/scala-days-londres-2012-como-foi-o-evento/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/scala-days-londres-2012-como-foi-o-evento/</feedburner:origLink></item>
		<item>
		<title>Integração contínua de projeto Java com Jenkins</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/mx4LK3A4Z6A/</link>
		<comments>http://blog.caelum.com.br/integracao-continua-de-projeto-java-com-jenkins/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 12:54:38 +0000</pubDate>
		<dc:creator>Francisco Sokol</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[integração contínua]]></category>
		<category><![CDATA[jenkins]]></category>
		<category><![CDATA[pm-87]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4923</guid>
		<description><![CDATA[Há bastante tempo aplicamos e escrevemos sobre integração contínua, uma das práticas mais importantes do desenvolvimento ágil. Através dela, é possível agilizar tarefas demoradas como a compilação de um projeto e a execução dos seus testes automatizados. Com um servidor de integração contínua bem configurado, essas tarefas são executadas a cada mudança no repositório de código e, em caso de <a href="http://blog.caelum.com.br/integracao-continua-de-projeto-java-com-jenkins/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/config.png" width="240" />
		</p><p>Há bastante tempo <a href="http://blog.caelum.com.br/integracao-continua/">aplicamos e escrevemos sobre integração contínua</a>, uma das práticas mais importantes do desenvolvimento ágil. Através dela, é possível agilizar tarefas demoradas como a compilação de um projeto e a execução dos seus testes automatizados. <strong>Com um servidor de integração contínua bem configurado, essas tarefas são executadas a cada mudança no repositório de código e, em caso de erros de compilação ou falhas nos testes automatizados, todos os desenvolvedores são alertados rapidamente</strong>. Dessa forma, se o servidor de integração não aponta problemas no projeto, a equipe tem a segurança de que as mudanças no código estão de acordo com a bateria de testes. É também um passo na direção do <a href="http://blog.caelum.com.br/o-processo-de-deploy-continuo/">deploy contínuo</a>.</p>
<p>Nesse post, iremos ensinar como instalar e configurar um projeto simples com testes de unidade no <a href="http://jenkins-ci.org/">Jenkins</a>, uma versão renovada (e forkada) do Hudson, o servidor de integração contínua que utilizamos aqui na Caelum e um dos mais populares.</p>
<p>O Jenkins é distribuído como um war e portanto pode ser deployado em um servidor de aplicação como o Tomcat ou o Jetty. Nesse post, iremos utilizar o Tomcat e vamos supor que ele já esteja instalado no seu computador. Chamaremos a home do Tomcat de &lt;tomcat&gt;. Você também deve ter o ant instalado no seu computador pois o utilizaremos para compilar o código e executar os testes. Baixe a <a href="http://mirrors.jenkins-ci.org/war/latest/">versão mais recente do Jenkins</a> e coloque no diretório <code>&lt;tomcat&gt;/webpps/</code>. Inicie o servidor de aplicação executando o script <code>&lt;tomcat&gt;/bin/startup.sh</code>. Depois disso, você poderá acessar a interface web do jenkins pela URL <code>http://localhost:8080/jenkins/</code> no seu navegador.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/screen.png"><img class="aligncenter size-full wp-image-4991" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/screen.png" alt="" width="549" height="363" /></a></p>
<p>Para demonstrar a configuração de um projeto novo, iremos utilizar um <a href="https://github.com/csokol/jenkins-exemplo">projeto simples</a>, criado para esse tutorial. Ele possui apenas duas classes bem simples e uma classe de teste com o JUnit. Além disso, o projeto possui um <code>build.xml</code> configurado para compilar o  projeto, executar os testes e gerar um jar. Você pode também ir aplicando todos os passos em seu próprio projeto. Se você ainda não desenvolve com integração contínua, vai poder mudar bastante a forma com que sua equipe desenvolve e receber um feedback contínuo do que está acontecendo.</p>
<p>Como o projeto se encontra em um repositório Git, será necessário instalar um plugin do Git no Jenkins (inicialmente, o Jenkins só suporta CVS e SVN). Para isso, vá até o plugin manager do Jenkins (<em>Manage Jenkins &gt; Manage Plugins</em>) na aba <em>Avaiable</em>, habilite o <em>Git Plugin</em> e clique em <em>Download now and install after restart</em> (pode ser que não exista nenhum plugin disponível na aba <em>Avaiable</em>, nesse caso, vá até a aba <em>Advanced</em> e clique em <em>Check Now</em> para atualizar o repositório de plugins). Depois do término da instalação do plugin, você deverá reiniciar o Jenkins.</p>
<p>Com o plugin instalado, podemos criar uma nova task no Jenkins para compilar e executar os testes do nosso projeto. Clique em <em>New Job</em>, dê um nome a ele, selecione a opção <em>Build a free-style software project</em> e clique em Ok. Você será redirecionado para a página de configurações do projeto.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/config.png"><img class="aligncenter size-full wp-image-4992" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/config.png" alt="" width="549" height="352" /></a></p>
<p>Na seção Source Code Management, selecione Git e coloque a url pública do repositório (<code>git://github.com/csokol/jenkins-exemplo.git</code>). Em <em>Build Triggers</em>, selecione <code>Poll SCM</code> e no campo <code>Schedule</code> coloque &#8220;<code>*/5 * * * *</code>&#8220;. Essa configuração determina que o Jenkins irá verificar se houve alterações no repositório desde o último build a cada cinco minutos. Se existir alguma, irá atualizar o seu repositório e executar o job.</p>
<p style="text-align: center"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/1-cut1.png"><img class="aligncenter size-full wp-image-4984" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/1-cut1.png" alt="" width="550" height="453" /></a></p>
<p>Nesse projeto temos duas targets principais do ant que queremos executar no Jenkins, uma para executar os testes e outra para gerar um jar do projeto, pronto para ser distribuído. Para configurar a execução dessas targets, selecione a opção <em>Invoke Ant</em> na seção <em>Build</em> e no campo <em>Targets</em> coloque <code>test jar</code>, essas são as targets que executa os testes e gera o jar, respectivamente.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/2-cut2.png"><img class="aligncenter size-full wp-image-4990" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/2-cut2.png" alt="" width="550" height="109" /></a></p>
<p>Agora, precisamos configurar as ações que o Jenkins irá executar depois de executar o ant. Caso exista alguma falha nos testes ou na criação do jar, o Jenkins deve notificar a equipe, para isso, na seção <em>Post-build Actions</em> selecione <em>E-mail Notification</em> e adicione os emails que devem ser notificados em caso de falha no build. Além disso, gostaríamos também de guardar o jar gereado pelo ant, para isso, selecione <em>Archive the artifacts</em> e coloque <code>target/*.jar</code> no campo <em>Files to archive</em>. Assim, toda vez que o job for executado, o Jenkins irá disponibilizar o jar para download em sua interface. Clique em <em>Save</em> para salvar as configurações.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/3-cut.png"><img class="aligncenter size-full wp-image-4986" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/3-cut.png" alt="" width="550" height="311" /></a></p>
<p>Pronto! Agora o projeto está configurado e cada alteração no repositório irá disparar o Job no Jenkins, executando os testes de unidade:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/4-cut.png"><img class="aligncenter size-full wp-image-4987" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/4-cut.png" alt="" width="550" height="258" /></a></p>
<p>Como nesse momento o Job nunca foi executado, o primeiro irá iniciar automaticamente e você poderá vizualizá-lo no painel do lado esquerdo em <em>Build history</em>. Você também pode inicar o processo manualmente, clicando em <em>Build Now</em>. Com o build finalizado, você pode visualizar sua página de status, onde poderá baixar o jar criado e também examinar o resultado dos testes em <em>Console Output</em>.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/5-cut.png"><img class="aligncenter size-full wp-image-4988" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/04/5-cut.png" alt="" width="550" height="248" /></a></p>
<p>O Jenkins oferece muitos outros recursos além dos descritos aqui, ele é capaz de executar diversas tarefas, como colocar deployar um war em um servidor em produção, gerar relatórios de cobertura de testes, calcular métricas sobre o código do projeto, entre outras. Você poderá conhecer essas funcionalidades explorando os plugins disponíveis ou mesmo desenvolvendo o seu.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=mx4LK3A4Z6A:xJ0Fq0K49jg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=mx4LK3A4Z6A:xJ0Fq0K49jg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=mx4LK3A4Z6A:xJ0Fq0K49jg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=mx4LK3A4Z6A:xJ0Fq0K49jg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=mx4LK3A4Z6A:xJ0Fq0K49jg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=mx4LK3A4Z6A:xJ0Fq0K49jg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=mx4LK3A4Z6A:xJ0Fq0K49jg:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/mx4LK3A4Z6A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/integracao-continua-de-projeto-java-com-jenkins/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/integracao-continua-de-projeto-java-com-jenkins/</feedburner:origLink></item>
		<item>
		<title>2012 é o ano do mercado mobile no Brasil</title>
		<link>http://feedproxy.google.com/~r/caelum/~3/5_wvETygn84/</link>
		<comments>http://blog.caelum.com.br/2012-e-o-ano-do-mercado-mobile-no-brasil/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 13:15:15 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[fj-57]]></category>
		<category><![CDATA[ip-67]]></category>
		<category><![CDATA[mercado]]></category>
		<category><![CDATA[wd-43]]></category>
		<category><![CDATA[wd-47]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4830</guid>
		<description><![CDATA[O mercado mobile está explodindo em todo o mundo, e no Brasil não é diferente. Saiba porque e como aproveitar as oportunidades. É verdade que o Brasil já ultrapassou a marca de mais celulares que gente há algum tempo. Ainda em 2010, batemos a marca de 200 milhões de linhas. Desde então, o volume de <a href="http://blog.caelum.com.br/2012-e-o-ano-do-mercado-mobile-no-brasil/#more-'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/02/brasil.jpg" width="240" />
		</p><p><em>O mercado mobile está explodindo em todo o mundo, e no Brasil não é diferente. Saiba porque e como aproveitar as oportunidades.</em></p>
<p>É verdade que o Brasil já ultrapassou a marca de <b>mais celulares que gente</b> há algum tempo. Ainda em 2010, batemos a marca de <a href="http://www.brasil.gov.br/noticias/arquivos/2011/01/19/brasil-ultrapassa-marca-de-200-milhoes-de-celulares">200 milhões de linhas</a>. Desde então, o volume de linhas não pára de crescer, a ponto de já termos o <a href="http://tecnologia.uol.com.br/ultimas-noticias/redacao/2012/01/27/numeros-de-celular-terao-nove-digitos-em-sp-a-partir-de-julho-diz-anatel.jhtm">nono dígito</a> nos números celulares de SP a partir de Julho.</p>
<p>É verdade também que já desenvolvemos aplicativos para celulares há muitos anos. Só aqui na Caelum, oferecemos cursos de <a href="http://www.caelum.com.br/curso/fj-55-java-me-mobile/">Java ME</a> desde <b>2005</b> e <a href="http://www.caelum.com.br/curso/fj-57-desenvolvimento-google-android/">Android</a> desde <b>2010</b>. Livros sobre desenvolvimento para celulares são bestsellers em todas as livrarias nacionais já faz tempo.</p>
<p>Apesar de tudo isso, eu acredito que <strong>2012 será um ano particular para o mercado móvel no Brasil</strong>. Muita coisa está acontecendo agora nessa área. E o potencial é gigantesco.</p>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/02/introduction-300x266.png" alt="" title="Google Nexus" width="300" height="266" class="aligncenter size-medium wp-image-4835" /></p>
<h3>Consumidores + &#8230;</h3>
<p>Uma <a href="http://www.slideshare.net/WMcCannBR/consumidor-mvel-2011">pesquisa antiga</a> &#8211; de fevereiro de 2011 &#8211; mostrava que <B>33% das pessoas já tinham smartphone</B> e 20% tinha celular convencional avançado (com Wifi, GPS etc). <b>41% acessava a Internet</b> no celular (83% entre os donos de smartphone!). 15% já tinha efetuado alguma compra via celular (63% entre usuários de iPhone!). Mais da metade das pessoas tinha um celular com menos de 6 meses de uso. E 40% das pessoas pretendia trocar de aparelho nos seis meses seguintes.</p>
<p>Recentemente, saiu a informação de que <a href="http://g1.globo.com/tecnologia/noticia/2012/03/vendas-de-smartphones-no-brasil-crescem-179-em-2011-diz-pesquisa.html">a venda de smartphones cresceu 179%</a> em 2011 no Brasil. Muita gente ainda compra celulares convencionais, mas o <b>preço médio do smartphone caiu 33%</b> em 2011, facilitando a maior adoção. A <a href="http://imagens.extra.com.br/html/infografico/celular-no-brasil.html">banda larga móvel cresce assustadoramente</a> e já ultrapassou a banda larga fixa há algum tempo.</p>
<p>O pessoal do <a href="http://analytics.blogspot.com/2012/01/look-ahead-at-measurement-in-2012.html">Google Analytics divulgou</a> que, só nos últimos 4 meses de 2011, <B>o número de usuários mobile cresceu 40%</B>. Mais: vem crescendo <b>2% por semana</b> e eles prevêem um boom para 2012.</p>
<p>E, apenas para colocar os números em perspectiva: por dia, <b>370 mil</b> novos seres humanos nascem no mundo todo. E, por dia, só de aparelhos Androids são novos <b>700 mil</b>. E ainda temos mais <B>380 mil</B> iPhones/dia. Se somar todos os smartphones e tablets, são <b>1 milhão e meio</b> de novos aparelhos por dia, uma taxa de crescimento <b>4x maior que a da população mundial</b>.</p>
<p><a href="http://www.lukew.com/ff/entry.asp?1506"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/03/whymobile-3.png" alt="" title="Bebes vs iPhones e Androids" width="500" height="324" class="aligncenter size-full wp-image-4902" /></a></p>
<h3>&#8230; + Governo</h3>
<p>As novidades para 2012 atingem até políticas governamentais. Foram anunciados <strong>incentivos fiscais</strong> tanto para produção de <a href="http://info.abril.com.br/noticias/mercado/dilma-sanciona-incentivo-fiscal-para-tablets-11102011-50.shl">tablets</a> quanto de <a href="http://www.techtudo.com.br/noticias/noticia/2012/02/smartphones-ficarao-mais-baratos-com-incentivo-fiscal-afirma-ministro-paulo-bernardo.html">smartphones</a> no Brasil. O iPhone 4 já é produzido no Brasil desde o ano passado e o iPad começou esse ano. </p>
<p>A tendência é que o preço dos aparelhos caia bastante ainda esse ano e que surjam smartphones a preços populares.</p>
<h3>&#8230; + Aparelhos</h3>
<p>Pela primeira vez, o Google trouxe para o Brasil um modelo da sua <a href="http://www.google.com.br/nexus/">grife Nexus</a> de celulares de ponta. É o primeiro modelo com <b>Android 4.0</b> a chegar por aqui. Aliás, essa que é a versão do Android mais revolucionária lançada até hoje e que logo estará em diversos aparelhos novos e em updates para aparelhos já existentes.</p>
<p>No mundo Apple, cada novo lançamento quebra novamente recordes anteriores. A Microsoft e a Nokia lançam sua linha <b>Lumia com Windows Phone</b> no Brasil com bastante barulho.</p>
<p>E não é só de celulares e tablets que vive o mundo móvel. A <a href="http://www.publishnews.com.br/telas/noticias/detalhes.aspx?id=67049">chegada iminente da Amazon ao Brasil</a> vai trazer uma revolução à parte no mundo dos ebooks e do comércio eletrônico. E, junto, vem o <strong>Kindle</strong> para a preços arrasadores. Inclusive o <strong>Kindle Fire</strong>, seu tablet barato com Android que conseguiu deixar o mercado americano de tablets de ponta cabeça no final do ano passado.</p>
<p><img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/reading/images/logo_kindle2._V167628491_.png" title="Amazon Kindle" class="aligncenter" width="186" height="44" /></p>
<h3>&#8230; + Novos comportamentos</h3>
<p>O Google recentemente divulgou diversas <a href="http://www.thinkwithgoogle.com/insights/uploads/194364.pdf">estatísticas sobre a última edição do Super Bowl americano</a> e o efeito nas buscas. Uma em particular me chamou a atenção: <b>25% de todas as buscas realizadas sobre o Super Bowl foram feitas em dispositivos móveis</b>.</p>
<p>Mais: durante o jogo, provavelmente com a TV ligada, <b>41% das buscas foram feitas em dispositivos móveis</b>.</p>
<p><a href="http://www.thinkwithgoogle.com/insights/uploads/194364.pdf"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-13-at-8.14.54-PM-e1329171387828.png" alt="" title="Estatísticas do Super Bowl de 2012" width="500" height="264" class="aligncenter size-full wp-image-4834" /></a></p>
<p>Nas compras não é diferente. O pessoal do <a href="http://googlemobileads.blogspot.com/2011/12/look-back-at-2011.html">Google Adwords fez uma pesquisa</a> que mostrou que <b>79% dos consumidores usam o celular no processo de compra</b> &#8211; seja comparando preços, analisando opções etc. Mais: <b>70% da pessoas usam o celular quando estão <u>dentro</u> da loja física</b>.</p>
<p>É uma imensa mudança de comportamento! </p>
<p>Usamos celulares a todo momento, e frequentemente para <em>complementar</em> uma experiência já existente. Juntamos mídias ao usar nosso dispositivo enquanto vemos TV e mudamos toda a lógica do comércio ao usar o celular para uma compra física mais informada.</p>
<p>O <a href="http://www.paypal.com">PayPal</a>, especializado em pagamentos online, teve <em>141 milhões de dólares</em> movimentados em transações via mobile em 2009. Esse número cresceu para <em>750 milhões de dólares</em> em 2010 e para incríveis <b><a href="http://www.businessweek.com/news/2012-01-11/ebay-s-paypal-mobile-payment-volume-rose-to-4-billion-last-year.html">4 bilhões de dólares</a></b> em 2011!</p>
<p>O Facebook, maior rede social do Brasil e do mundo, teve <b><a href="http://www.webperformancetoday.com/2012/02/23/mobile-web-performance-unlimited-data/">33% de todo o seu tráfego</a></b> de 2011 originado em dispositivos móveis. No Twitter, incríveis <b>55% do tráfego</b> foram em mobile em 2011.</p>
<h3>= Tremendas oportunidades</h3>
<p>O mercado móvel está só no começo, <b>sobretudo no Brasil</b>.</p>
<p>Aquela <a href="http://www.slideshare.net/WMcCannBR/consumidor-mvel-2011">pesquisa de 2011</a> sobre o consumidor móvel brasileiro, mostrava ainda que mais de 50% das pessoas <b>desejavam que houvesse mais conteúdo móvel disponível</b>. E <b>65% mostraram intenção de comprar um tablet</b>.</p>
<p>Um <a href="http://www.gomez.com/wp-content/downloads/19986_WhatMobileUsersWant_Wp.pdf">estudo da Gomez em Julho de 2011</a>, mostrou a gritante diferença entre as expectativas dos usuários mobile e a (ainda) triste realidade. <b>71% das pessoas esperam que um site móvel seja tão rápido quanto no Desktop</b> mas para 46% a experiência foi de mais lentidão. E <b>57% das pessoas falaram ter tido problemas ao acessar sites em seus celulares</b>.</p>
<p>São muitas oportunidades!</p>
<p>Para o Google, os imensos avanços de 2011 são apenas o começo da história do mundo móvel. E, <a href="http://googlemobileads.blogspot.com/2011/12/look-back-at-2011.html">eles falam também que 2012 será o grande ano de mobile</a>.</p>
<h2>Como atacar o mercado móvel?</h2>
<p>Há basicamente dois caminhos: <B>criar uma app mobile</B> e <b>criar um site mobile</b>.</p>
<h3>Apps</h3>
<p><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/02/overview_hero.jpg" alt="" title="Apps de iPhone" width="500" height="142" class="aligncenter size-full wp-image-4836" /></p>
<p>Apps dão uma excelente experiência para o usuário, por serem nativas e se integrarem muito bem com o aparelho. Existe a inconveniência da portabilidade &#8211; e mesmo você fazendo uma para iOS e outra para Android, não esqueça que existem zilhões de outros usuários (e 70% deles nem smartphone têm).</p>
<p>Jacok Nielsen, o papa da usabilidade, <a href="http://www.useit.com/alertbox/mobile-sites-apps.html">afirma que Apps dedicadas hoje provêem uma melhor experiência pro usuário</a>. São mais integradas ao aparelho e conseguem minimizar as limitações com maior sucesso.</p>
<p>Mas talvez o ponto mais crítico para Apps seja o mais óbvio: <i>elas precisam ser instaladas</i>. Apps são ótimas para quem já é seu cliente, mas são uma <b>barreira para converter novos clientes</b>. Ninguém quer instalar uma nova App para cada empresa e serviço do mundo.</p>
<p>Aqui entra a <b>Web mobile</b>, uma área que eu particularmente vejo com muito potencial de crescimento. </p>
<p>E a conclusão daquele <a href="http://www.useit.com/alertbox/mobile-sites-apps.html">artigo</a> do Jakob Nielsen sobre Apps serem melhores de UX hoje, é que a <b>Web Mobile é bem melhor</b> a longo a prazo e será a <b>solução definitiva</b> conforme os navegadores móveis forem evoluindo.</p>
<h3>Web mobile</h3>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/02/tudo.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/02/tudo-e1329171044862.jpg" alt="" title="10 telas diferentes abrindo o site do livro de arquitetura da Caelum" width="500" height="232" class="aligncenter size-full wp-image-4833" /></a></p>
<p>Muita gente acessa a Internet no celular e a maioria navegando por aí. E é péssimo abrir algum Site que não esteja otimizado para mobile. Mesmo nos smartphones mais modernos com telas maiores que permitem abrir sites normais, não há dúvidas que <B>um site não otimizado para mobile traz uma pior experiência para o usuário</B>. E isso prejudica suas vendas, trata mal potenciais clientes e até afeta negativamente sua marca.</p>
<p>Se quiser tirar uma lição desse post gigante e transformá-la em uma ação para esse ano, faça isso: <b>crie <u>já</u> uma versão mobile do seu site</b>.</p>
<p>E não é só para grandes portais ou redes sociais. É fato que as pessoas lêem muitas notícias em seus celulares e tablets, mas também lêem blogs e outros conteúdos. Também querem fazer compras online enquanto estiverem na rua. E querem receber um link qualquer por email ou Facebook e poder visualizá-lo no seu dispositivo. Querem apenas&#8230; <i>navegar normalmente</i>.</p>
<p><b>Todos os sites deveriam funcionar bem em dispositivos móveis.</b></p>
<p>Aqui você pode estar pensando no trabalho de criar uma versão nova do seu site para mobile. E que talvez não valha muito a pena o investimento, dado o (ainda) pequeno número de usuários. Mas você pode apenas adaptar seu site normal para todo tipo de dispositivo, como mostro nesse <a href="http://sergiolopes.org/responsive-web-design/">artigo sobre design resposivo</a>.</p>
<p>Fizemos isso no site do <a href="http://www.arquiteturajava.com.br">Livro de Arquitetura Java da Caelum</a> <b>sem muito esforço</b>. O chato é saber que, após ler sobre o livro em seu dispositivo, o usuário terá uma péssima experiência tentando comprá-lo caso não esteja em seu Desktop, já que as lojas virtuais brasileiras <em>não estão prontas para o mundo móvel</em>.</p>
<p>Mas é disso que trata esse post: <b>despertar para a explosão do mundo mobile</b> e <b>incentivar que cada um faça sua parte</b> para mudarmos o cenários mobile no Brasil.</p>
<p>E se você precisar de uma ajuda pra fazer Apps móveis, a Caelum têm cursos para <a href="http://www.caelum.com.br/curso/fj-57-desenvolvimento-google-android/">Android</a> e <a href="http://www.caelum.com.br/curso/ip-67-desenvolvimento-movel-ios-5-iphone-ipad/">iOS</a>. E nosso <a href="http://www.caelum.com.br/curso/wd-43-desenvolvimento-web-html-css-javascript/">curso de desenvolvimento Web</a> trata também de sites mobile.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caelum?a=5_wvETygn84:pShIJfLntPo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/caelum?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=5_wvETygn84:pShIJfLntPo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caelum?i=5_wvETygn84:pShIJfLntPo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=5_wvETygn84:pShIJfLntPo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/caelum?i=5_wvETygn84:pShIJfLntPo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/caelum?a=5_wvETygn84:pShIJfLntPo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/caelum?i=5_wvETygn84:pShIJfLntPo:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caelum/~4/5_wvETygn84" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2012-e-o-ano-do-mercado-mobile-no-brasil/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://blog.caelum.com.br/2012-e-o-ano-do-mercado-mobile-no-brasil/</feedburner:origLink></item>
	</channel>
</rss>

