<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Temple Coding]]></title>
  <link href="http://templecoding.com/atom.xml" rel="self"/>
  <link href="http://templecoding.com/"/>
  <updated>2013-09-03T11:25:10-04:00</updated>
  <id>http://templecoding.com/</id>
  <author>
    <name><![CDATA[Thiago Temple]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Publicando um site Octopress usando GitHub pages a partir de um novo computador]]></title>
    <link href="http://templecoding.com/blog/2013/08/26/publicando-um-site-octopress-usando-github-pages-em-uma-nova-maquina-de-dev/"/>
    <updated>2013-08-26T11:36:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/08/26/publicando-um-site-octopress-usando-github-pages-em-uma-nova-maquina-de-dev</id>
    <content type="html"><![CDATA[<p>OK, eu admito, esse post é bem específico e ele serve mais para que eu <strong>nunca mais</strong> esqueça como fazer isso.</p>

<p>Esse blog é hospedado no <a href="http://pages.github.com">GitHub Pages</a> e é feito só com HTML, não tem nenhum CMS por trás. Mas eu uso o <a href="http://octopress.org">Octopress</a> para gerar os arquivos HTML pra mim.</p>

<p>Tudo funciona muito bem, e esse post não é sobre como usar nem o Octopress, nem o GitHub pages, suas documentações são bem claras e não são necessários muitos passos para ter um site no GitHub pages de forma gratuita.</p>

<p>De qualquer forma, quando se publica um site no GitHub pages, o código fica hospedado e visível no GitHub no branch master e as páginas processadas e geradas ficam em um branch chamado gh-pages.</p>

<h2>O problema</h2>

<p>Tudo funcionava perfeitamente até eu ter que fazer um clone do repositório em uma outra máquina (já que troquei de computador) e publicar uma atualização do site.</p>

<p>Os passos que executei foram:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git clone git@github.com:usuario/repositorio.git
</span><span class='line'>
</span><span class='line'>bundle install <span class="c">#para instalar as dependências do ruby</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake setup_github_pages
</span></code></pre></td></tr></table></div></figure>


<p>O comando acima cria o diretório _deploy e também um branch local <code>gh-pages</code>.</p>

<p>Após as minhas modificações quando fui fazer o deploy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake gen_deploy
</span></code></pre></td></tr></table></div></figure>


<p>Eu recebia o seguinte erro:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>! <span class="o">[</span>rejected<span class="o">]</span>     gh-pages -&gt; gh-pages <span class="o">(</span>non-fast-forward<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>E ainda dizia que o repositório não estava atualizado.</p>

<h2>A solução</h2>

<p>Enfim, depois de muito procurar, porque um <code>git pull</code> não resolveu, eu resolvi fazer um <code>force push</code> no momento do deploy.</p>

<p>Para isso eu abri o arquivo <code>Rakefile</code> e editei a tarefa push. Onde estava:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">system</span> <span class="s2">&quot;git push origin </span><span class="si">#{</span><span class="n">deploy_branch</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Eu troquei para:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">system</span> <span class="s2">&quot;git push origin +</span><span class="si">#{</span><span class="n">deploy_branch</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Perceba o sinal de + ali, isso fará um force push e resolve o problema. Depois de um deploy usando o force push, eu voltei a tarefa para como ela estava antes e tudo passou a funcionar normalmente mais uma vez.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instalando uma máquina de desenvolvimento com dois comandos]]></title>
    <link href="http://templecoding.com/blog/2013/08/25/instalando-uma-maquina-de-desenvolvimento-com-dois-comandos/"/>
    <updated>2013-08-25T12:11:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/08/25/instalando-uma-maquina-de-desenvolvimento-com-dois-comandos</id>
    <content type="html"><![CDATA[<p>Recentemente eu tive que preparar duas máquinas de desenvolvimento, um novo notebook Windows 8 e uma VM Windows 7 e, honestamente, por mais que eu goste de uma máquina nova, perder tempo instalando uma porção de aplicações e configurar tantas outras não é algo que eu ache divertido. Além do mais, sempre tem algumas coisas que eu não faço todo dia e, na hora que eu preciso eu não lembro. Por exemplo, como é que eu gero uma chave RSA para usar com ssh mesmo?</p>

<p>Enfim, dessa vez, ao invés de instalar tudo manualmente, eu decidi fazer um script que faz todas essas coisas automaticamente para mim. Usando <a href="http://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx">PowerShell</a> e <a href="http://chocolatey.org">Chocolatey</a>.</p>

<p><img class="alignleft" src="http://templecoding.com/images/2013/08/chocolateyicon.gif" title="Chocolatey" alt="Chocolatey"> Acho que o PowerShell é bem conhecido, então não vou perder muito tempo com ele. Sobre o Chocolatey, ele é um gerenciador de pacotes para linha de comando do Windows. Ele funciona mais ou menos como funciona o apt-get no linux ou o brew no Mac. É um projeto open source e gratuito bem interessante, é relativamente recente se comparado com as outras plataformas, mas ele funciona muito bem no Windows e é muito prático para evitar ficar procurando instaladores. Já existe uma grande <a href="http://chocolatey.org/packages">variedade de aplicações disponíveis para serem instaladas através dele</a>. Mas também, se precisar, é muito fácil criar um pacote e publicar lá, eu mesmo <a href="http://chocolatey.org/packages/ruby.devkit.ruby193">criei um pacote para instalar o DevKit do Ruby na versão 1.9.3 do Ruby</a>.</p>

<p>Ok, chega de história. O script completo que eu criei <a href="https://gist.github.com/vintem/6334646">está disponível em um gist</a>. Ele é até que bem simples e suas principais partes estão comentadas (em inglês). Fique a vontade para baixar e modificar a gosto.</p>

<h2>Mas o que ele faz?</h2>

<h3>Instala as seguintes aplicações usando o Chocolatey</h3>

<ul>
<li>Git</li>
<li>Poshgit</li>
<li>Ruby (1.9.3)</li>
<li>Node.js</li>
<li>WebPI</li>
<li>Notepad++</li>
<li>Sublime Text</li>
<li>ConEmu</li>
<li>Python</li>
<li>.NET Framework (4.0 e 4.5)</li>
<li>Putty</li>
<li>Firefox</li>
<li>Chrome</li>
<li>Fiddler</li>
<li>Filezilla</li>
<li>Winrar</li>
<li>MongoDB</li>
<li>Nuget Package Explorer</li>
<li>Skydrive</li>
<li>Evernote</li>
<li>Windows Installer (3.1 e 4.5)</li>
</ul>


<p>Opcionalmente, no meio da execução do script ele pergunta se quer instalar o SQL Express 2012 (também utilizando o Chocolatey).</p>

<h3>Customização do PowerShell e Git Bash</h3>

<p>Eu tenho alguns atalhos criados tanto para o shell do PowerShell como o do Git, então eu baixo automaticamente essas customizações e adiciono nos respectivos arquivos de customização.</p>

<h3>Configuração do Git</h3>

<p>Na maior parte do tempo eu uso o Git como repositório de código ou o <a href="http://git-scm.com/book/ch8-1.html">git svn</a> e eu tenho algumas configurações globais que eu gosto de usar, como alguns arquivos que geralmente eu ignoro, ou alguns atalhos específicos para o git. Então eu também baixo essas configurações de dois outros gists que que tenho.</p>

<h3>Gems e pacotes Node</h3>

<p>Algumas gems para o Ruby que eu sempre uso são instaladas automaticamente, depois disso alguns pacotes do Node.js também são instalados.</p>

<h3>Geração da chave RSA</h3>

<p>Por fim, a última coisa que eu faço é gerar uma chave RSA que eu vou usar para me conectar via SSH em outros terminais, ou no GitHub.</p>

<h2>Executando o script</h2>

<p>Para executar o script são necessários dois comandos, mas primeiro, <a href="https://gist.github.com/vintem/6334646">baixe o script do gist</a>. Depois disso, <strong>abra o PowerShell como Administrador</strong> e, para executar um script baixado da internet é preciso modificar a política de execução do PowerShell, então digite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Set-ExecutionPolicy Unrestricted
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Depois disso, é só executar o script. Supondo que ele esteja no desktop, execute:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>~/Desktop/dev_setup.ps1
</span></code></pre></td></tr></table></div></figure>


<p>E é isso, você tem todas as aplicações instaladas. Em algum momento da execução do script ele vai perguntar se você quer instalar o SQL Express e também uma senha para a chave RSA, mas no mais você tem uma máquina instalada com apenas dois comandos.</p>

<p>PS: Eu tentei fazer com que o Visual Studio 2012 fosse instalado automaticamente também, mas honestamente, não existe muita documentação sobre o assunto e achei que não valia o trabalho. Afinal, nesse caso é só montar um ISO e seguir os passos da instalação. Para uma aplicação só tá valendo.</p>

<p>Se você ficou com preguiça de ir lá olhar o script, veja ele aqui completo:</p>

<div><script src='https://gist.github.com/6334646.js?file=dev_setup.ps1'></script>
<noscript><pre><code>function Add-Path() {
    [Cmdletbinding()]
    param([parameter(Mandatory=$True,ValueFromPipeline=$True,Position=0)][String[]]$AddedFolder)
    # Get the current search path from the environment keys in the registry.
    $OldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path
    # See if a new folder has been supplied.
    if (!$AddedFolder) {
        Return 'No Folder Supplied. $ENV:PATH Unchanged'
    }
    # See if the new folder exists on the file system.
    if (!(TEST-PATH $AddedFolder))
    { Return 'Folder Does not Exist, Cannot be added to $ENV:PATH' }cd
    # See if the new Folder is already in the path.
    if ($ENV:PATH | Select-String -SimpleMatch $AddedFolder)
    { Return 'Folder already within $ENV:PATH' }
    # Set the New Path
    $NewPath=$OldPath+’;’+$AddedFolder
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath
    # Show our results back to the world
    Return $NewPath
}

######################################################
# Install apps using Chocolatey
######################################################
Write-Host &quot;Installing Chocolatey&quot;
iex ((new-object net.webclient).DownloadString('http://bit.ly/psChocInstall'))
Write-Host

Write-Host &quot;Installing applications from Chocolatey&quot;
cinst git
cinst ruby -Version 1.9.3.44800
cinst nodejs.install
cinst PhantomJS
cinst webpi
cinst poshgit
cinst notepadplusplus
cinst sublimetext2
cinst SublimeText2.PackageControl
cinst SublimeText2.PowershellAlias
cinst ConEmu
cinst python
cinst DotNet4.0
cinst DotNet4.5
cinst putty
cinst Firefox
cinst GoogleChrome
cinst fiddler4
cinst filezilla
cinst dropbox
cinst winmerge
cinst kdiff3
cinst winrar -Version 4.20.0
cinst mongodb
cinst NugetPackageExplorer
cinst SkyDrive
cinst Evernote
Write-Host

######################################################
# Set environment variables
######################################################
Write-Host &quot;Setting home variable&quot;
[Environment]::SetEnvironmentVariable(&quot;HOME&quot;, $HOME, &quot;User&quot;)
[Environment]::SetEnvironmentVariable(&quot;CHROME_BIN&quot;, &quot;C:\Program Files (x86)\Google\Chrome\Application\chrome.exe&quot;, &quot;User&quot;)
[Environment]::SetEnvironmentVariable(&quot;PHANTOMJS_BIN&quot;, &quot;C:\tools\PhanomJS\phantomjs.exe&quot;, &quot;User&quot;)
Write-Host

######################################################
# Download custom .bashrc file
######################################################
Write-Host &quot;Creating .bashrc file for use with Git Bash&quot;
$filePath = $HOME + &quot;\.bashrc&quot;
New-Item $filePath -type file -value ((new-object net.webclient).DownloadString('http://vintem.me/winbashrc'))
Write-Host

######################################################
# Install Windows installer through WebPI
######################################################
Write-Host &quot;Installing apps from WebPI&quot;
cinst WindowsInstaller31 -source webpi
cinst WindowsInstaller45 -source webpi
Write-Host

######################################################
# Install SQL Express 2012
######################################################
Write-Host
do {
    $createSiteData = Read-Host &quot;Do you want to install SQLExpress? (Y/N)&quot;
} while ($createSiteData -ne &quot;Y&quot; -and $createSiteData -ne &quot;N&quot;)
if ($createSiteData -eq &quot;Y&quot;) {
    cinst SqlServer2012Express
}
Write-Host

######################################################
# Add Git to the path
######################################################
Write-Host &quot;Adding Git\bin to the path&quot;
Add-Path &quot;C:\Program Files (x86)\Git\bin&quot;
Write-Host

######################################################
# Configure Git globals
######################################################
Write-Host &quot;Configuring Git globals&quot;
$userName = Read-Host 'Enter your name for git configuration'
$userEmail = Read-Host 'Enter your email for git configuration'

&amp; 'C:\Program Files (x86)\Git\bin\git' config --global user.email $userEmail
&amp; 'C:\Program Files (x86)\Git\bin\git' config --global user.name $userName

$gitConfig = $home + &quot;\.gitconfig&quot;
Add-Content $gitConfig ((new-object net.webclient).DownloadString('http://vintem.me/mygitconfig'))

$gitexcludes = $home + &quot;\.gitexcludes&quot;
Add-Content $gitexcludes ((new-object net.webclient).DownloadString('http://vintem.me/gitexcludes'))
Write-Host

$env:Path = [System.Environment]::GetEnvironmentVariable(&quot;Path&quot;,&quot;Machine&quot;)

######################################################
# Update RubyGems and install some gems
######################################################
Write-Host &quot;Update RubyGems&quot;
C:\Chocolatey\bin\cinst ruby.devkit.ruby193
gem update --system
gem install bundler compass
Write-Host

######################################################
# Install npm packages
######################################################
Write-Host &quot;Install NPM packages&quot;
npm install -g yo grunt-cli karma bower jshint coffee-script nodemon generator-webapp generator-angular
Write-Host

######################################################
# Generate public/private rsa key pair
######################################################
Write-Host &quot;Generating public/private rsa key pair&quot;
Set-Location $home
$dirssh = &quot;$home\.ssh&quot;
mkdir $dirssh
$filersa = $dirssh + &quot;\id_rsa&quot;
ssh-keygen -t rsa -f $filersa -q -C $userEmail
Write-Host

######################################################
# Add MongoDB to the path
######################################################
Write-Host &quot;Adding MongoDB to the path&quot;
Add-Path &quot;C:\MongoDB\bin&quot;
Write-Host

######################################################
# Download custom PowerShell profile file
######################################################
Write-Host &quot;Creating custom $profile for Powershell&quot;
if (!(test-path $profile)) {
    New-Item -path $profile -type file -force
}
Add-Content $profile ((new-object net.webclient).DownloadString('http://vintem.me/profileps'))
Write-Host</code></pre></noscript></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Só é uma bagunça se você deixar. Responsabilidade única com JavaScript]]></title>
    <link href="http://templecoding.com/blog/2013/07/30/responsabilidade-unica-com-javascript/"/>
    <updated>2013-07-30T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/07/30/responsabilidade-unica-com-javascript</id>
    <content type="html"><![CDATA[<p>Muita gente que reclama de JavaScript mas não se dá ao mínimo trabalho de entender a linguagem e, boa parte das vezes, não trata o código desenvolvido como um código de verdade, afinal de contas &ldquo;é só JavaScript mesmo&rdquo;.</p>

<p>Mas esse é só uma das razões de boa parte dos problemas enfrentados quando a gente tem que dar manutenção em um código já existente. O bom e velho spaguetti de código.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/07/spagett.jpg" title="Código spaghetti" alt="Código spaghetti"></p>

<p>Tenho que admitir que eu já contribui para bastante código spaguetti (como do exemplo que vou mostrar aqui). Exatamente porque não tratei esse código como um programa sério e não apliquei princípios básicos como o da <a href="http://robsoncastilho.com.br/2013/02/06/principios-solid-principio-da-responsabilidade-unica-srp/" target="_blank">responsabilidade única</a>.</p>

<p>Vamos imaginar uma cesta de compras como a da imagem abaixo, que tem um link para atualizar a quantidade de itens do carrinho. O código que vou mostrar, captura o click no link usando o jQuery e faz uma validação de que o valor informado no campo é numérico. A regra de negócio diz ainda que tem que ser uma quantidade entre 0 e 10. Não posso vender mais do que 10 unidades de um mesmo item.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/07/shopping_basket.png" title="Carrinho de compras" alt="Carrinho de compras"></p>

<p>Um código que faria isso é esse:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;.update_cart&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">itemsCount</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">closest</span><span class="p">(</span><span class="s2">&quot;td&quot;</span><span class="p">).</span><span class="nx">prev</span><span class="p">()</span>
</span><span class='line'>        <span class="p">.</span><span class="nx">children</span><span class="p">(</span><span class="s2">&quot;.quantity&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nb">isNaN</span><span class="p">(</span><span class="nx">itemsCount</span><span class="p">)</span> <span class="o">||</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">itemsCount</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span>
</span><span class='line'>          <span class="nb">parseInt</span><span class="p">(</span><span class="nx">itemsCount</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">showError</span><span class="p">(</span><span class="s2">&quot;Nao é numero valido&quot;</span><span class="p">);</span>
</span><span class='line'>          <span class="k">return</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/updatecart&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">data</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// lógica para formatar os dados a serem enviados para o servidor</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// update table with cart data</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">xhr</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// handle error</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Embora esse seja um código simples &ndash; e que está pouco mais curto do que realmente seria já que eu omiti alguns detalhes da implementação &ndash; ele viola um dos princípios de desenvolvimento mais importantes na minha opinião, que é o princípio da responsabilidade única. Mas, é um código que nós vemos com bastante facilidade em muitos aplicações na web.</p>

<p>Mesmo que a gente não tenha classes em JavaScript, as funções são usadas para fazer separações de responsabilidades. Veja, no exemplo acima, a função responsável por responder ao evento de click de atualização faz a validação, faz a chamada ajax e também atualiza a página após o resultado, seja com sucesso ou não.</p>

<p>Fazendo uma breve analogia, a chamada ajax como essa acima, pode ser comparada a uma chamada de um web service feito por um código C# ou Java. Ou seja, é um serviço externo ao código que está sendo executado, ou melhor ainda, é uma dependência externa que está gerando acoplamento no código. Taí a primeira separação que a gente pode fazer.</p>

<p>Outra ponto, o script acima lê informações da página (DOM) e depois atualiza informações nessa mesma página de acordo com o retorno do processamento. Então, em uma outra analogia, pode-se dizer que o DOM nesse caso, é uma forma de banco de dados do programa, portanto, é outra dependência externa que a gente pode separar no código.</p>

<p>Então vamos ver o que seria um código melhor estruturado para esse caso.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">BasketUpdater</span> <span class="p">(</span><span class="nx">basketView</span><span class="p">,</span> <span class="nx">basketService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">init</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">basketView</span><span class="p">.</span><span class="nx">handleUpdate</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">update</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">isValid</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">quantity</span> <span class="o">=</span> <span class="nx">item</span><span class="p">.</span><span class="nx">quantity</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="o">!</span><span class="nb">isNaN</span><span class="p">(</span><span class="nx">itemsCount</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>        <span class="nb">parseInt</span><span class="p">(</span><span class="nx">itemsCount</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">itemsCount</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">update</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">item</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">basketService</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">item</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">basketView</span><span class="p">.</span><span class="nx">refreshViewSuccess</span><span class="p">,</span> <span class="nx">basketView</span><span class="p">.</span><span class="nx">refreshViewError</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">BasketView</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">handleUpdate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;.update_cart&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>        <span class="c1">// logica para formatar um objeto com os dados do item no formulario</span>
</span><span class='line'>        <span class="nx">callback</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">refreshViewSuccess</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// </span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">refreshViewError</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// </span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">BasketService</span><span class="p">(</span><span class="nx">url</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">update</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">,</span> <span class="nx">callbackSuccess</span><span class="p">,</span> <span class="nx">callbackError</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">data</span><span class="o">:</span> <span class="nx">item</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">algum</span> <span class="nx">codigo</span> <span class="nx">para</span> <span class="nx">formatar</span> <span class="nx">os</span> <span class="nx">dados</span> <span class="nx">de</span> <span class="nx">retorno</span>
</span><span class='line'>          <span class="nx">callbackSuccess</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">xhr</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algum codigo para tratar a mensagem de erro</span>
</span><span class='line'>          <span class="nx">callbackError</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">basketService</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">BasketService</span><span class="p">(</span><span class="s1">&#39;http://localhost/updateCart&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">basketView</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">BasketView</span><span class="p">();</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">basketUpdater</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">BasketUpdater</span><span class="p">(</span><span class="nx">basketView</span><span class="p">,</span> <span class="nx">basketService</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">basketUpdater</span><span class="p">.</span><span class="nx">init</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Mesmo que esse código seja um tanto quanto mais extenso que o anterior, fica bem clara a divisão de responsabilidades. Temos uma função para atualizar a view <em>BasketView</em>, uma para fazer a chamada ajax <em>BasketService</em> e uma com a lógica de negócio necessária para a página <em>BasketUpdater</em>.</p>

<p>Os benefícios de um código como esse (comparado com o anterior) são muitos, e bem semelhantes aos que a gente vê em códigos &ldquo;servidor&rdquo; bem estruturados.</p>

<ol>
    <li>As dependências necessárias para que um objeto funcione (sim, uma função em JavaScript é um objeto) estão claras e definidas já no construtor.</li>
    <li>Uma função não depende explicitamente de outra, ela apenas espera um objeto que implemente determinados métodos</li>
    <li>É possível testar as funções isoladamente com um framework de testes</li>
    <li>É possível utilizar injeção de dependência e no caso dos testes, usar mocks</li>
    <li>É possível alterar uma função sem interferir na outra (desde que os nomes dos métodos se mantenham os mesmos)</li>
</ol>


<p>Para concluir, temos um código muito mais organizado, de fácil manutenção e com responsabilidades claras. Para chegar nesse resultado, fiz uso apenas de técnicas já conhecidas de outras linguagens e sem inventar muita coisa. Então da próxima vez que você for dizer que é muito difícil dar manutenção em código JavaScript, pense se você está contribuindo para um código sustentável ou só preparando o almoço do próximo domingo.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/07/Spaghetti.gif" title="Spaghetti" alt="Spaghetti"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Meu TED Talk favorito]]></title>
    <link href="http://templecoding.com/blog/2013/07/23/meu-ted-talk-favorito/"/>
    <updated>2013-07-23T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/07/23/meu-ted-talk-favorito</id>
    <content type="html"><![CDATA[<p>Ainda hoje, depois de muitos TEDs ouvidos e assistidos, o meu favorito ainda é um de 2007.</p>

<p><strong><a href="http://vintem.me/12Hzg5h" target="_blank">Ben Dunlap</a> fala sobre uma vida apaixonada.</strong></p>

<p>Assista primeiro, depois a gente conversa:</p>

<iframe src="http://embed.ted.com/talks/lang/pt-br/ben_dunlap_talks_about_a_passionate_life.html" width="640" height="360" frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p>Diversas lições podem ser tiradas desse vídeo. Eu poderia focar na superação de um sobrevivente do holocausto, na forma como uma pessoa decidiu lidar com alguém que estava roubando suas coisas e como decidiu ver o melhor das pessoas, ou até sobre como lidar com diferenças culturais no mundo corporativo.</p>

<p>Mas eu fico mesmo com a lição mais clara que é a lição final. Se duas pessoas com tanto conhecimento e, no estágio da vida em que se encontravam na historia contada, podem ter tanta paixão pelo conhecimento, não importando o tipo do conhecimento, porque eu, que não sei quase nada da vida vou agir de forma diferente?</p>

<blockquote>Viva cada dia como se fosse o último, aprenda como se fosse viver para sempre.
<strong>Mahatma Ghandi</strong></blockquote>


<p>Então é isso, de tempos em tempos, eu gosto de assistir à esse vídeo para me lembrar disso.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Programação orientada à coincidência]]></title>
    <link href="http://templecoding.com/blog/2013/07/16/programacao-orientada-a-coincidencia/"/>
    <updated>2013-07-16T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/07/16/programacao-orientada-a-coincidencia</id>
    <content type="html"><![CDATA[<p>Eu gosto muito de programar, gosto dos desafios técnicos que programar que traz. Mas o que eu mais gosto é do constante aprendizado que faz parte da profissão de programador.</p>

<p>Por causa de tudo isso eu nunca entendi ou gostei de frases como &ldquo;se esta funcionando não mexe&rdquo; ou &ldquo;não encosta nesse código porque senão para de funcionar&rdquo;. Como alguém que gosta de aprender, minha primeira pergunta é: porque para de funcionar? Ou, porque não pode mexer? Ou, o que vai estragar?</p>

<p>Informações sobre os mais diversos assuntos estão disponíveis de forma muito fácil (para uns até um pouco mais que para outros, não é NSA?) então não vejo sentido de não buscar se aprofundar nos assuntos. <a href="http://www.hanselman.com/">Scott Hanselman</a>, em um ótimo post, já disse que <a href="http://vintem.me/1dAms6P" target="_blank">a internet não é uma caixa preta</a>. Citando uma frase desse post que resume o que eu quero dizer:</p>

<blockquote>When coding on the web, remember that effectively NOTHING is hidden from you.</blockquote>


<p>NADA esta escondido de você, enfase no NADA.</p>

<p>No livro <a href="http://www.amazon.com/gp/product/020161622X/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=020161622X&amp;linkCode=as2&amp;tag=tempcodi0f-20">The Pragmatic Programmer</a>, Andrew Hunt e David Thomas dedicam um capitulo à programação por coincidência e eles abrem o capitulo com uma metáfora muito interessante. Eles comparam um programador que codifica por tentativa e erro, resolvendo problemas de forma aleatórias e sem conhecimento sobre o assunto à um soldado andando em um campo minado. O soldado pode dar um, dois, vários passos sem pisar em uma mina, achar que esta fazendo algo correto, mas é somente uma caminhada aleatória, uma hora ele pode pisar em uma mina e explodir.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/07/falklands-minefield1.jpg" title="Campo minado" ></p>

<p>Outra coisa bem comum quando não se entende do problema, é a tendencia de resolver as coisas sempre do mesmo jeito, ou seja é o velho caso daquela frase &ldquo;se você só tem um martelo todo o problema é um prego&rdquo;. Parece que é uma formula magica, funcionou para um problema não se sabe como, deve funcionar para os outros.</p>

<p>Ainda nesse sentido, pode ser que um problema seja resolvido passando dados inválidos
para um método e que isso resulte numa resposta inesperada do programa. Mas se a sua unica fonte de analise for a resposta daquela chamada com dados inválidos, quando aquele programa for corrigido, sua chamada não vai mais funcionar porque aquela coincidência foi modificada.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/07/coincidence1.jpg" title="Parece um coelho, mas..." ></p>

<p>E o pior na minha opinião, é a ignorância que isso gera. Até hoje ainda vejo gente que acha que POST é mais seguro do que GET só porque os dados não são enviados na URL!</p>

<p><strong>Escolhendo a pilula vermelha</strong></p>

<iframe src="http://www.youtube.com/embed/xFhn_GUAhGU" frameborder="0" width="420" height="315"></iframe>


<p>E sim, entender e aprender as coisas dá trabalho, toma tempo, tomar a pilula vermelha às vezes quer dizer por em prática para aprender, ou, como já disse um Yogi Berra:</p>

<blockquote>Mastering knowledge alone, without experience isn&#8217;t effective</blockquote>


<p>Ou, numa tradução livre e direta: <em>Dominar um assunto sem a pratica não é efetivo.</em></p>

<p><strong>Mas até onde ir?</strong></p>

<p>Essa é uma linha difícil de traçar. De uma forma geral eu tento entender o suficiente para resolver o problema que eu estou enfrentando, e qualquer outra coisa, eu deixo para ler mais tarde.</p>

<p>Por exemplo, eu estava estudando Backbone.js usando <a href="http://vintem.me/12QNKkh" target="_blank">esse tutorial</a>, e nele é usado o <a href="http://vintem.me/15yM296" target="_blank">padrão AMD</a> implementado pelo <a href="http://requirejs.org/" target="_blank">Require.JS</a>. Eu podia simplesmente seguir o tutorial que isso resolveria o problema, mas o que eu decidi fazer foi ler um pouco sobre o Require.JS no seu site para entender o seu funcionamento e depois ler sobre o padrão AMD quando eu tivesse um pouco mais de tempo. Esse tutorial, também usa o Node.js, ou seja, depois eu ainda fui explorar um pouco sobre o Node.js :)</p>

<p>É claro, não existe uma regra, e ninguém pode dizer até onde cada um deve ir, você é quem tem que traçar a linha entre o que é informação necessária e o que é procrastinação, sempre tentando ser pragmático.</p>

<p>O mais importante de tudo é deixar a preguiça de lado e entender o que você faz. Não basta pegar a primeira resposta no StackOverflow. Afinal de contas, você também não ia gostar que um médico te receitasse um medicamento só porque esse remédio funciona para a dor de barriga de outra pessoa, você quer que ele te examine e te diga porque esse remédio vai funcionar, não é?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quatro bons livros para mudar a forma como você vê/escreve JavaScript]]></title>
    <link href="http://templecoding.com/blog/2013/06/10/quatro-bons-livros-para-mudar-a-forma-como-voce-ve-escreve-javascript/"/>
    <updated>2013-06-10T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/06/10/quatro-bons-livros-para-mudar-a-forma-como-voce-ve-escreve-javascript</id>
    <content type="html"><![CDATA[<p>A maioria dos programadores que eu conheço dizem que não gostam de JavaScript. Eu entendo que a linguagem tem muitas coisas que são &ldquo;meio bizarras&rdquo;, mas eu também tenho certeza que não gostar de JavaScript, vem do fato de que as pessoas não conhecem a linguagem além da sintaxe básica e, de copy/paste de scripts prontos encontrados na internet.</p>

<p>JavaScript tem chaves {}, ponto e virgula, tem Java no nome mas seu funcionamento não tem nada a ver nem com Java ou com qualquer outra linguagem derivada de C, como o C#. Por isso, para usar o JavaScript de uma maneira correta e até para começar a gostar da linguagem a gente tem que entender seu funcionamento.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/06/java-javascript-sm.png" title="Java e JavaScript" ></p>

<p>Aqui vai uma pequena lista de quatro livros que li sobre JavaScript que vão ajudar a aprofundar seu conhecimento sobre: a linguagem, sobre as interações com o browser e até como escrever um código mais rápido, organizado e elegante usando o que o JavaScript tem de melhor.</p>

<p>Os livros que vou indicar podem ter assuntos que são cobertos mais de uma vez em cada livro. Mas de uma forma geral, são livros que se complementam tratando a linguagem e o ambiente em que ela existe de formas diferentes.</p>

<h2><a href="http://www.amazon.com/gp/product/0596517742/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596517742&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">JavaScript: The Good Parts</a> por <a href="http://www.crockford.com/" target="_blank">Douglas Crockford</a></h2>


<p><a href="http://www.amazon.com/gp/product/0596517742/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596517742&amp;linkCode=as2&amp;tag=tempcodi0f-20"><img class="alignleft" style="border: 0px;" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=0596517742&amp;Format=_SL160_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=tempcodi0f-20" alt="" width="122" height="160" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=tempcodi0f-20&amp;l=as2&amp;o=1&amp;a=0596517742" alt="" width="1" height="1" border="0" /></p>

<p>Pra mim esse livro é uma boa introdução para quem quer começar a entender um pouco além da sintaxe básica da linguagem. Não, ele não é um livro que vai aprofundar muito na linguagem, vai apenas começar a cobrir alguns tópicos de uma forma mais avançada. Mas principalmente, vai ajudar a entender um pouco melhor o que JavaScript tem de bom. Se você já entende bem a sintaxe do JavaScript, já sabe como funcionam objetos e funções no JavaScript você pode pular esse livro.</p>

<h2><a href="http://www.amazon.com/gp/product/0596806752/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596806752&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">JavaScript Patterns</a> por <a href="http://www.phpied.com/" target="_blank">Stoyan Stefanov</a></h2>


<p><a href="http://www.amazon.com/gp/product/0596806752/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596806752&amp;linkCode=as2&amp;tag=tempcodi0f-20"><img class="alignleft" style="border: 0px;" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=0596806752&amp;Format=_SL160_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=tempcodi0f-20" alt="" width="122" height="160" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=tempcodi0f-20&amp;l=as2&amp;o=1&amp;a=0596806752" alt="" width="1" height="1" border="0" /></p>

<p>Como o nome diz, vai falar de padrões. Os padrões aqui estão relacionados às características especificas do JavaScript, como por exemplo, como fazer reuso de código usando Prototype. Fala ainda de convenções adotadas na linguagem, como resolver o problema do escopo global, como usar construtores, entre outros. O livro aborda também alguns dos <a href="https://en.wikipedia.org/wiki/Design_Patterns">padrões do GoF</a>, mas com uma visão focada nas características do JavaScript. Esse com certeza é um livro que deve ser lido por qualquer programador que queira levar o JavaScript mais a sério.</p>

<h2><a href="http://www.amazon.com/gp/product/193398869X/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=193398869X&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">Secrets of the JavaScript Ninja</a> por <a href="http://ejohn.org/" target="_blank">John Resig</a></h2>


<p><a href="http://www.amazon.com/gp/product/193398869X/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=193398869X&amp;linkCode=as2&amp;tag=tempcodi0f-20"><img class="alignleft" style="border: 0px;" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=193398869X&amp;Format=_SL160_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=tempcodi0f-20" alt="" width="127" height="160" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=tempcodi0f-20&amp;l=as2&amp;o=1&amp;a=193398869X" alt="" width="1" height="1" border="0" /></p>

<p>Pra mim, o melhor livro sobre JavaScript do ponto de vista didático. Ótimos exemplos, explicações bem claras e muitos detalhes sobre a linguagem. Foi nesse livro que vi a melhor explicação do funcionamento de closures em JavaScript. Dos livros que estou indicando, é o que lida mais com as interações entre o JavaScript e o browser, inclusive demostrando estratégias para lidar com as diferenças entre os principais fabricantes de browser.</p>

<h2><a href="http://www.amazon.com/gp/product/0321812182/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321812182&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript</a> por <a href="http://calculist.org/" target="_blank">David Herman</a></h2>


<p><a href="http://www.amazon.com/gp/product/0321812182/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321812182&amp;linkCode=as2&amp;tag=tempcodi0f-20"><img class="alignleft" style="border: 0px;" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=0321812182&amp;Format=_SL160_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=tempcodi0f-20" alt="" width="122" height="160" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=tempcodi0f-20&amp;l=as2&amp;o=1&amp;a=0321812182" alt="" width="1" height="1" border="0" /></p>

<p>Esse é sem duvidas o livro que vai mais a fundo na linguagem. É um livro curto, mas com muitas informações. Se você deixar para ler esse livro por ultimo (eu recomendo assim), vai ver que algumas das dicas vão ser repetidas, mas a maioria das dicas vai trazer bastante informação. Alguns dos itens precisam ser lidos mais de uma vez porque são bem complexos (pelo menos para o meu cérebro limitado), mas o livro é pura informação do começo ao fim.</p>

<h2><strong>Tudo isso sobre JavaScript?</strong></h2>


<p>Pode parecer muito para uma linguagem que muitas vezes parece tão simples e, de fato, a sintaxe do JavaScript é simples. Mas alguns conceitos não são muito conhecidos especialmente para programadores acostumados com linguagens estáticas e não habituados à programação funcional. Se você não quiser/puder ler todos mas ainda assim quiser ler sobre JavaScript eu diria para ler pelo menos dois: <a href="http://www.amazon.com/gp/product/0596806752/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596806752&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">JavaScript Patterns</a> e <a href="http://www.amazon.com/gp/product/193398869X/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=193398869X&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">Secrets of the JavaScript Ninja</a>. Esses dois cobrem a maior parte dos assuntos que vemos no dia a dia, e com certeza já vão ajudar a sair do nível &ldquo;copy/paste&rdquo; para chegar no nível de entender o que realmente esta acontecendo quando você faz suas aplicações com JavaScript.</p>

<p>Boa leitura!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Análise do livro Pragmatic Thinking and Learning]]></title>
    <link href="http://templecoding.com/blog/2013/06/04/analise-do-livro-pragmatic-thinking-and-learning/"/>
    <updated>2013-06-04T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/06/04/analise-do-livro-pragmatic-thinking-and-learning</id>
    <content type="html"><![CDATA[<p>Alguns livros são tão bons que você tem vontade de falar deles para todo mundo antesmesmo de terminar. Esse é um deles.</p>

<p><a href="http://vintem.me/18LjWdg"><img class="aligncenter" src="http://templecoding.com/images/2013/06/ahptl_xlargecover.jpg" title="Pragmatic Thinking and Learning" ></a></p>

<p>Numa tradução livre e amadora do resumo do livro no site, diz o seguinte:</p>

<blockquote>Nesse livro escrito por Andy Hunt, você vai aprender nosso cérebro é conectado e, como tirar proveito d arquitetura do seu cérebro. Você vai aprender novas dicas e truques para aprender mais, mais rápido e guardar mais do que você aprende.</blockquote>


<p>Eu posso resumir a minha avaliação desse livro em uma frase bem curta. <strong>Eu queira ter lido antes</strong>.</p>

<p>Realmente o livro traz diversas informações sobre o funcionamento do nosso cérebro, informações que, pelo menos para mim, eram novas. Ou então eram informações que eu tinha obtido e não tinha guardado. É muito interessante (e útil) as analogias que autor usa para explicar o nosso cérebro fazendo referências à arquitetura de computadores e a programação assíncrona.</p>

<p>O livro não fica só na parte teórica do funcionamento de cérebro. É interessante entender o que é o modelo Dreyfus e os estágios que passamos na obtenção de conhecimento. São eles: iniciante, iniciante avançado, competente, proficiente e expert. Embora eu não ache que as pessoas possam ser categorizadas em níveis, ou melhor, só em cinco níveis, eu acho também que é uma forma de feedback e uma forma de termos parâmetros para nos guiar em como alcançar um nível mais alto de conhecimento.</p>

<p>Que as pessoas aprendem de forma diferente já é bem divulgado, mas o que eu achei interessante sobre as formas que aprendemos (relacionado com o funcionamento do nosso cérebro), foi que o livro expõe de forma bem clara e, sempre usando ótimas métaforas, como podemos explorar essas diferenças com técnicas práticas.</p>

<p>Uma das técnicas passadas no livro é a técnica de definição de objetivos de aprendizado</p>

<p><img class="alignright" src="http://templecoding.com/images/2013/06/smart2.jpg" title="SMART" > chamada S.M.A.R.T. Que é o acrônimo para Specific, Measurable, Attainable, Relevant e Time-Bound. Outras incluem, carregar sempre um livro de notas, criar um wiki pessoal,desenhar mapas mentais, entre outros. Tudo sempre com um ótimo embasamento teórico.</p>

<p>Eu, como leio muito, gostei muito do livro e tenho tentado por em práticas coisas que já aprendi. Espero que você aproveite a dica e leia o livro, eu gostei muito.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ASP.NET MVC Model Binding]]></title>
    <link href="http://templecoding.com/blog/2013/05/20/asp-net-mvc-model-binding/"/>
    <updated>2013-05-20T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/05/20/asp-net-mvc-model-binding</id>
    <content type="html"><![CDATA[<iframe src="http://www.youtube.com/embed/BjmRewB7tY4" frameborder="0" width="640" height="360"></iframe>


<h2>ASP.NET MVC Model Binding</h2>


<p>Nesse video explico o funcionamento do ASP.NET MVC Model Binding, começo com alguns exemplos básicos e depois mostro como criar um Model Binder Customizado.</p>

<p>Por fim, mostro como criar um Model Binder Provider que retorna um Model Binder customizado e genérico para usar junto com o Entity Framework, mas que obviamente poderia ser qualquer outro como NHibernate.</p>

<p><a href="https://github.com/vintem/ModelBindingDemo" target="_blank">O código está disponível no meu github.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript is Sexy - dica rápida]]></title>
    <link href="http://templecoding.com/blog/2013/03/25/javascript-is-sexy-dica-rapida/"/>
    <updated>2013-03-25T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/03/25/javascript-is-sexy-dica-rapida</id>
    <content type="html"><![CDATA[<p>Uma dica bem rápida. Hoje (não sei exatamente como), fui parar nesse site <a href="http://javascriptissexy.com/" target="_blank">JavaScript is Sexy</a>. E achei o site excelente, com vários &ldquo;roadmaps&rdquo; para aprender assuntos diferentes mas relacionados ao JavaScript.</p>

<p>Por exemplo, tem um bom roadmap para aprender <a href="http://javascriptissexy.com/learn-node-js-completely-and-with-confidence/" target="_blank">Node.js com confiança</a> ou então, um outro para aprender <a href="http://javascriptissexy.com/learn-intermediate-and-advanced-javascript/" target="_blank">JavaScript avançado</a>.</p>

<p>Bom, fica ai a dica rápida.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Integrar é traduzir, não é reproduzir]]></title>
    <link href="http://templecoding.com/blog/2013/03/21/integrar-e-traduzir-nao-e-reproduzir/"/>
    <updated>2013-03-21T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/03/21/integrar-e-traduzir-nao-e-reproduzir</id>
    <content type="html"><![CDATA[<p>Eu trabalho fazendo integrações de aplicações web com o SAP há alguns anos já. E existem &ldquo;alguns padrões&rdquo; (vou chamar de padrões), que existem no SAP que são bem particulares à esse ERP.</p>

<p>Só para ambientar aqueles que não conhecem nada de SAP, o SAP é um grande ERP e ele possui todo um ecossistema próprio para customização e criação de soluções de negócio. Por exemplo, ele tem uma linguagem própria o <a href="https://en.wikipedia.org/wiki/Abap">ABAP</a>, tem um protocolo de comunicações proprietário, o <a href="https://en.wikipedia.org/wiki/Remote_function_call">RFC</a>, entre outras coisas. Fora isso, existe também toda uma cultura particular de desenvolvimento, que honestamente, eu não conheço muito, já que nunca fui um programador ABAP.</p>

<p><img class="alignleft" src="http://templecoding.com/images/2013/03/system_integration.jpeg" title="System integration" >A minha questão aqui é, independente do porque, e se esta certo ou não, geralmente quando faço integrações com o SAP encontro coisas que não estou acostumado a ver quando desenvolvo minhas soluções usando outras tecnologias, como por exemplo, .NET e C#.</p>

<p>Por exemplo, em muitas integrações que fiz com o SAP quando chamo uma função remota e essa gera um erro, ao invés de receber um exceção, a chamada é executada com sucesso e uma estrutura de dados (como na imagem abaixo) é retornada preenchida contendo um tipo de erro, um código e possivelmente algumas mensagens. Esse é um padrão usado e que já vi várias vezes.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/03/sap_return.png" title="Retorno de erros no SAP" ></p>

<p>Obs.: <a href="http://cc2e.com/Page.aspx?hid=147" target="_blank">Steven McConnell deve ficar tão orgulhoso disso</a>.</p>

<p>OK, mas qual é o problema disso e o que tem a ver com o que eu faço?</p>

<p>Bom, o problema na minha opinião, é quando esse tipo de padrão começa a vazar para outras aplicações. Tenho que admitir que eu já fiz a minha parte de permitir que isso vazasse. Shame on me!</p>

<p>Mas voltando, se estamos fazendo uma integração com uma aplicação terceira, não importa qual, e ela tem uma particularidade, não precisamos expor essa particularidade, podemos encapsulá-la e mudar o padrão para algo mais genérico, ou que faça sentido para a nossa plataforma de desenvolvimento. Por exemplo, no caso de um Web Service, lançar um SoapException.</p>

<p>Outro padrão comum ao SAP é a nomenclatura de estruturas. Não sei porque, mas encontramos muitas estruturas com esse tipo de nomenclatura.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/03/nomes_sap.png" title="Nomenclatura no SAP" ></p>

<p>Talvez isso faça sentido na cabeça de algum alemão louco, mas, voltando ao C#, um nome de variável pode ter até 1023 bytes, isso quer dizer que podemos ser bem mais descritivos que isso. E no caso de um Web Service também, não ha uma limitação especifica para o nome de uma tag XML.</p>

<p>Mais uma vez o ponto é, no momento em que estamos fazendo uma integração, seja qual for a tecnologia utilizada (no meu caso é o BizTalk), esse é o momento de abstrair particularidades, de aplicar boas práticas para quem vai consumir essa integração.<img class="alignright" src="http://templecoding.com/images/2013/03/images_boo.jpeg"></p>

<p>Eu vejo uma integração como uma tradutora. Ela ouve em alemão e traduz para português, ela não traduz algumas partes para português e mantém outras no formato original. Para mim, que não falo nada de alemão, isso só me atrapalharia.</p>

<p>E nem sempre é uma questão de certo ou errado, mas sim de pontos que são mais idiomáticos em uma tecnologia do que em outra. Nesse caso o problema são as traduções literais que muitas vezes não fazem sentido, temos que contextualizar para a tecnologia que estamos usando.</p>

<p><img class="aligncenter" src="http://templecoding.com/images/2013/03/slip.png" title="slip" >
Mais uma vez usando o SAP como <del>bode expiatório</del> exemplo, existem alguns casos em que as strings não podem ter mais do 132 caracteres, por isso vemos estruturas como a anterior que tem campos message1, message2, message3, etc., e, embora isso funcione, é uma limitação daquela plataforma/tecnologia. Esse não é o caso de um XML ou do próprio C#, portanto, passar uma estrutura dessas adiante é simplesmente fazer uma tradução literal e não olhar para o contexto.</p>

<p>Concluindo, quando for integrar duas ou mais aplicações, tenha em mente os limites tecnológicos, funcionais e semânticos de cada ponta. Leve em consideração o que é um padrão proprietário e deve ser transformado do que realmente é um padrão de integração e deve ser mantido. <a href="http://www.amazon.com/gp/product/0321200683/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321200683&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">Existem inclusive livros que podem nos ajudar com isso</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Loops for in no JavaScript]]></title>
    <link href="http://templecoding.com/blog/2013/03/11/loops-for-in-no-javascript/"/>
    <updated>2013-03-11T00:00:00-04:00</updated>
    <id>http://templecoding.com/blog/2013/03/11/loops-for-in-no-javascript</id>
    <content type="html"><![CDATA[<p>O JavaScript tem o suporte nativo a loops do tipo <em>for in</em> e, ele funciona de uma forma muito semelhante ao <em>foreach</em> do C# (por exemplo), mas temos que tomar alguns cuidados, por que como tudo no JavaScript, sempre temos uma pegadinha.</p>

<div style="margin: 5px 0px; border: #f48432 1px dashed; padding: 5px;">

<strong>Sofrendo menos com JavaScript</strong>
Esse post faz parte de uma série, confira os outros já feitos:
<ol>
    <li><a href="http://templecoding.com/blog/2012/10/25/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/05/elevao-em-javascript/">Elevação em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/12/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/21/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/28/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
    <li><a href="http://templecoding.com/blog/2012/12/05/funes-de-callback-no-javascript/">Funções de callback</a></li>
    <li><a href="http://templecoding.com/blog/2012/12/14/tratamento-de-excecoes-em-javascript/">Tratamento de exceções em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2013/02/18/construtores-de-arrays-do-javascript/">Construtores de Arrays</a></li>
    <li>Loops for in</li>
</ol>
</div>


<p>Primeiro um exemplo. Se eu quiser iterar por todas as propriedades é métodos de um objeto o código é exatamente o que imaginamos.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">propriedade</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">nome</span><span class="o">:</span> <span class="s1">&#39;Thiago&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">sobrenome</span><span class="o">:</span> <span class="s1">&#39;Temple&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">dizOla</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;Ola&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="k">for</span><span class="p">(</span><span class="nx">propriedade</span> <span class="k">in</span> <span class="nx">pessoa</span><span class="p">){</span>
</span><span class='line'>    <span class="nb">document</span><span class="p">.</span><span class="nx">writeln</span><span class="p">(</span><span class="nx">propriedade</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//exibe: nome sobrenome dizOla</span>
</span></code></pre></td></tr></table></div></figure>


<p>Esse código produz um retorno com: nome sobrenome dizOla</p>

<p>Se eu quiser exibir somente os atributos e não os métodos, eu preciso adicionar um filtro no loop, dessa forma:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">for</span><span class="p">(</span><span class="nx">propriedade</span> <span class="k">in</span> <span class="nx">pessoa</span><span class="p">){</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">pessoa</span><span class="p">[</span><span class="nx">propriedade</span><span class="p">]</span> <span class="o">!==</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">document</span><span class="p">.</span><span class="nx">writeln</span><span class="p">(</span><span class="nx">propriedade</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//exibe: nome sobrenome</span>
</span></code></pre></td></tr></table></div></figure>


<p>Até aqui bem simples.</p>

<p>O primeiro ponto a considerar é que nunca podemos garantir a ordem do retorno de um loop for in. Geralmente isso não importaria muito, como no exemplo anterior, mas no caso de um array, que é também um objeto, isso pode ser importante. Nesse momento é melhor usar mesmo um loop for do que um loop for in.</p>

<p>A segundo ponto a considerar é que o JavaScript tem herança através da propriedade prototype, e que todo objeto herda de Object. Isso é importante porque o JavaScript é uma linguagem dinâmica e, portanto, se alterarmos Object isso vai refletir nos nossos objetos, não importa o momento que alteramos Object. Por exemplo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">propriedade</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">nome</span><span class="o">:</span> <span class="s1">&#39;Thiago&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">sobrenome</span><span class="o">:</span> <span class="s1">&#39;Temple&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">dizOla</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;Ola&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nb">Object</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">naoRelacionado</span> <span class="o">=</span> <span class="s1">&#39;eu nao devia estar aqui&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span><span class="p">(</span><span class="nx">propriedade</span> <span class="k">in</span> <span class="nx">pessoa</span><span class="p">){</span>
</span><span class='line'>    <span class="nb">document</span><span class="p">.</span><span class="nx">writeln</span><span class="p">(</span><span class="nx">propriedade</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//exibe: nome sobrenome dizOla naoRelacionado</span>
</span></code></pre></td></tr></table></div></figure>


<p>No código acima eu defini um objeto chamado pessoa e depois disso eu adicionei um atributo chamado naoRelacionado à Object. Mesmo assim esse atributo foi exibido dentro loop for in. Isso pode vir a ser um problema quando alteramos o prototype de Object em outra parte do código que não esta relacionado ao código que estamos fazendo.</p>

<p>No caso do loop for in, podemos resolver isso com o método <strong>hasOwnProperty</strong>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">for</span><span class="p">(</span><span class="nx">propriedade</span> <span class="k">in</span> <span class="nx">pessoa</span><span class="p">){</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="nx">pessoa</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">propriedade</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">document</span><span class="p">.</span><span class="nx">writeln</span><span class="p">(</span><span class="nx">propriedade</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//exibe: nome sobrenome dizOla</span>
</span></code></pre></td></tr></table></div></figure>


<p>O método hasOwnProperty verifica se a propriedade foi definida no objeto em questão.</p>

<p>É isso ai.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Inversão de Controle com Castle Windsor e ASP.NET MVC]]></title>
    <link href="http://templecoding.com/blog/2013/03/07/inversao-de-controle-com-castle-windsor-e-asp-net-mvc/"/>
    <updated>2013-03-07T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2013/03/07/inversao-de-controle-com-castle-windsor-e-asp-net-mvc</id>
    <content type="html"><![CDATA[<iframe src="http://www.youtube.com/embed/zRoYsC6TkRE" frameborder="0" width="640" height="360"></iframe>


<h2>Inversão de Controle com Castle Windsor e ASP.NET MVC</h2>


<p>Demonstração usando ASP.NET MVC e Castle Windsor como container de inversão de controle.</p>

<p><a href="https://github.com/vintem/demoiocwindsor" target="_blank">O código está disponível no GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Construtores de Arrays do JavaScript]]></title>
    <link href="http://templecoding.com/blog/2013/02/18/construtores-de-arrays-do-javascript/"/>
    <updated>2013-02-18T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2013/02/18/construtores-de-arrays-do-javascript</id>
    <content type="html"><![CDATA[<p>Bom, o ano começou, lá se foi o carnaval e agora sim podemos dizer que o ano começou. Pelo menos aqui no blog.</p>

<p>Bora falar um pouco mais de JavaScript e o que existe de estranho com os <strong>construtores de Arrays do JavaScript</strong>.</p>

<div style="margin: 5px 0px; border: #f48432 1px dashed; padding: 5px;">

<strong>Sofrendo menos com JavaScript</strong>
Esse post faz parte de uma série, confira os outros já feitos:
<ol>
    <li><a href="http://templecoding.com/blog/2012/10/25/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/05/elevao-em-javascript/">Elevação em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/12/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/21/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/28/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
    <li><a href="http://templecoding.com/blog/2012/12/05/funes-de-callback-no-javascript/">Funções de callback</a></li>
    <li><a href="http://templecoding.com/blog/2012/12/14/tratamento-de-excecoes-em-javascript/">Tratamento de exceções em JavaScript</a></li>
    <li>Construtores de Arrays</li>
    <li><a href="http://templecoding.com/blog/2013/03/11/loops-for-in-no-javascript/">Loops for in</a></li>
</ol>
</div>


<h2>Construtores de Arrays do JavaScript</h2>


<p>No JavaScript podemos construir um Array da seguinte forma:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="s2">&quot;texto&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span> <span class="c1">// 1</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// texto</span>
</span></code></pre></td></tr></table></div></figure>


<p>Quando passamos uma string ou outro tipo de objeto para o construtor de uma Array, o JavaScript cria uma array com um item e atribui o valor passado para esse item.</p>

<p>Agora vamos dar uma olhada em outro exemplo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="c1">// 3</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// undefined</span>
</span></code></pre></td></tr></table></div></figure>


<p>Quando passamos um número inteiro para o construtor ele cria um array com o número de elementos informados e, todos os elementos criados não tem um valor atribuído a eles, por isso o undefined.</p>

<p>Um terceiro exemplo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="mf">3.2</span><span class="p">);</span> <span class="c1">// RangeError: invalid array length</span>
</span></code></pre></td></tr></table></div></figure>


<p>Quando passamos um número decimal para o construtor, ele obviamente não cria um array decimal, mas também não cria um array com um só elemento e com o valor passado, o JavaScript retorna um erro para esse comando.</p>

<h2>Uma prática um pouco melhor</h2>


<p>A melhor forma de criar arrays no JavaScript é usando o construtor implícito dele, por exemplo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;texto&quot;</span><span class="p">];</span> <span class="c1">// Cria um elemento e atribui o valor a ele</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span> <span class="c1">// Cria um array com 3 elementos e com os valores 1, 2 e 3</span>
</span></code></pre></td></tr></table></div></figure>


<p>Um problema simples de resolver esse, não é?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Validação com jQuery Validation]]></title>
    <link href="http://templecoding.com/blog/2012/12/19/validacao-com-jquery-validation/"/>
    <updated>2012-12-19T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/12/19/validacao-com-jquery-validation</id>
    <content type="html"><![CDATA[<iframe src="http://www.youtube.com/embed/4AzSUHxW2Ww" frameborder="0" width="640" height="360"></iframe>


<h2>Validação com jQuery Validation</h2>


<p>O jQuery validation é um plugin para fazer validações de formulários. Nesse video mostro como fazer algumas validações como:</p>

<ul>
    <li>campos obrigatórios</li>
    <li>customizações de mensagens</li>
    <li>validações de tipos de dados específicos como data, email e números</li>
    <li>validações remotas usando ajax</li>
    <li>globalização usando o plugin Globalize</li>
</ul>


<h2>Links</h2>


<ul>
    <li> <a href="http://docs.jquery.com/Plugins/Validation">jQuery validation</a></li>
    <li><a href="https://github.com/jquery/globalize">Globalize</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tratamento de exceções em JavaScript]]></title>
    <link href="http://templecoding.com/blog/2012/12/14/tratamento-de-excecoes-em-javascript/"/>
    <updated>2012-12-14T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/12/14/tratamento-de-excecoes-em-javascript</id>
    <content type="html"><![CDATA[<p>Sim, existe tratamento de exceções em JavaScript. Não é uma funcionalidade muito conhecida e, por isso talvez, não muito utilizada. Mas existem os blocos try/catch dentro do JavaScript e o comando throw. E funciona de uma forma bem similiar ao C#.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">comErro</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">throw</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;CustomError&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;Um erro muito grave para ser tratado&#39;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">try</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">comErro</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39; - &#39;</span> <span class="o">+</span> <span class="nx">e</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span> <span class="c1">//CustomError - Um erro muito grave para ser tratado</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<div style="margin: 5px 0px; border: #f48432 1px dashed; padding: 5px;">

<strong>Sofrendo menos com JavaScript</strong>
Esse post faz parte de uma série, confira os outros já feitos:
<ol>
    <li><a href="http://templecoding.com/blog/2012/10/25/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/05/elevao-em-javascript/">Elevação em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/12/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/21/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/28/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
    <li><a href="http://templecoding.com/blog/2012/12/05/funes-de-callback-no-javascript/">Funções de callback</a></li>
    <li>Tratamento de exceções em JavaScript</li>
    <li><a href="http://templecoding.com/blog/2013/02/18/construtores-de-arrays-do-javascript/">Construtores de Arrays</a></li>
    <li><a href="http://templecoding.com/blog/2013/03/11/loops-for-in-no-javascript/">Loops for in</a></li>
</ol>
</div>


<p>Apesar do JavaScript não ser tipado, existe uma convenção que diz que todo objeto de erro deve conter ao menos duas propriedades: name e message. Acho que os nomes das propriedades são auto-explicatórios.</p>

<p>Obviamente, nada nos impede de adicionar outras propriedades com mais detalhes sobre o erro.</p>

<h2>Tipos de erro do JavaScript</h2>


<p>Por padrão o JavaScript tem internamente seis tipos diferentes de erro que ele pode gerar.</p>

<table width="400" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="100">EvalError</td>
<td valign="top" width="300">Usado quando a função eval() é usada de uma maneira incorreta</td>
</tr>
<tr>
<td valign="top" width="100">RangeError</td>
<td valign="top" width="300">Usado quando uma variável numérica excede uma faixa de valores permitida</td>
</tr>
<tr>
<td valign="top" width="100">ReferenceError</td>
<td valign="top" width="300">Usado quando é feita uma referência invalida à um objeto</td>
</tr>
<tr>
<td valign="top" width="100">SyntaxError</td>
<td valign="top" width="300">Usado quando existe um erro de sintaxe</td>
</tr>
<tr>
<td valign="top" width="100">TypeError</td>
<td valign="top" width="300">Usado quando o tipo da variável não é o mesmo que o esperado</td>
</tr>
<tr>
<td valign="top" width="100">URIError</td>
<td valign="top" width="300">Usado quando as funções encodeURI() e decodeURI() são usadas de uma maneira incorreta.</td>
</tr>
</tbody>
</table>


<p>Isso serve apenas como referência, como mostrei no exemplo anterior, podemos criar os nossos próprios tipos de erro sem problemas.</p>

<h2>Construtores de objetos de erro</h2>


<p>Por fim, o JavaScript também tem alguns construtores para os objetos que podemos usar para retornar um erro, por exemplo, eu poderia reescrever a exemplo acima da seguinte forma:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">comErro</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Um erro muito grave para ser tratado&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">error</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;CustomError&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">try</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">comErro</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39; - &#39;</span> <span class="o">+</span> <span class="nx">e</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span> <span class="c1">//CustomError - Um erro muito grave para ser tratado</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Esse código gera exatamente o mesmo resultado que antes, o único detalhe que quero ressaltar é que se eu não tivesse feito:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">error</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;CustomError&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>o nome do erro seria Error.</p>

<p>Como o objeto Error, temos também um construtor para cada tipo de erro do JavaScript: EvalError, TypeError, ReferenceError, etc.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ajax com jQuery]]></title>
    <link href="http://templecoding.com/blog/2012/12/07/ajax-com-jquery/"/>
    <updated>2012-12-07T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/12/07/ajax-com-jquery</id>
    <content type="html"><![CDATA[<iframe src="http://www.youtube.com/embed/he2k0FZBHq8" frameborder="0" width="640" height="360"></iframe>


<h2>Ajax com jQuery</h2>


<p>Existem diversas formas de fazer ajax com jQuery. O jQuery é muito versátil e poderoso, mas também é capaz de tornar algumas atividades que antes eram tediosas em códigos simples e curtos, ainda mais com a ajuda de alguns plugins.</p>

<h2>Links</h2>


<p><a href="http://bit.ly/TWU2u6">Documentação ajax do jQuery</a>
<a href="http://www.malsup.com/jquery/form/">jQuery Form Plugin</a>
<a href="https://github.com/CodeSeven/toastr">Toastr Plugin</a>
<a href="http://code.google.com/p/jquery-loadmask/">jQuery loadmask plugin</a></p>

<h2>Código fonte</h2>


<p><a href="https://github.com/vintem/TodoDemo">O código está disponível no meu GitHub.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Funções de callback no JavaScript]]></title>
    <link href="http://templecoding.com/blog/2012/12/05/funes-de-callback-no-javascript/"/>
    <updated>2012-12-05T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/12/05/funes-de-callback-no-javascript</id>
    <content type="html"><![CDATA[<h2>O que são funções de callback?</h2>


<p>Uma função no JavaScript é um objeto, isso quer dizer que a gente pode passar uma função como parâmetro para outra função. Quando passamos uma função como parâmetro para outra, a função passada como parâmetro é uma função de callback.</p>

<div style="margin: 5px 0px; border: #f48432 1px dashed; padding: 5px;">

<strong>Sofrendo menos com JavaScript</strong>
Esse post faz parte de uma série, confira os outros já feitos:
<ol>
    <li><a href="http://templecoding.com/blog/2012/10/25/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/05/elevao-em-javascript/">Elevação em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/12/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/21/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/28/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
    <li>Funções de callback</li>
    <li><a href="http://templecoding.com/blog/2012/12/14/tratamento-de-excecoes-em-javascript/">Tratamento de exceções em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2013/02/18/construtores-de-arrays-do-javascript/">Construtores de Arrays</a></li>
    <li><a href="http://templecoding.com/blog/2013/03/11/loops-for-in-no-javascript/">Loops for in</a></li>
</ol>
</div>


<p>Por exemplo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">nome</span><span class="p">,</span> <span class="nx">dizerOla</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">dizerOla</span><span class="p">(</span><span class="nx">nome</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">olaNoConsole</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">nome</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nome</span><span class="p">);</span> <span class="c1">// </span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">pessoa</span><span class="p">(</span><span class="s1">&#39;Thiago&#39;</span><span class="p">,</span> <span class="nx">olaNoConsole</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>No código acima, eu defini uma função chamada pessoa e outra olaNoConsole. A função pessoa recebe uma string com um nome e uma função de callback que ela vai usar para fazer uma saudação. Repare que, quando passo a função olaNoConsole como parâmetro, eu não utilizo parêntesis. Os parêntesis executam a função, então nesse momento que eu não quero executar a função, eu não os utilizo.
A função de callback pode ser também uma função anônima como no exemplo abaixo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">nome</span><span class="p">,</span> <span class="nx">dizerOla</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">dizerOla</span><span class="p">(</span><span class="nx">nome</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">pessoa</span><span class="p">(</span><span class="s1">&#39;Thiago&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">nome</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;Ola &#39;</span> <span class="o">+</span> <span class="nx">nome</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>A mesma função pessoa agora recebendo uma função anônima que faz um alert como saudação.</p>

<h2>Por quê?</h2>


<p>Por que fazer uso de funções de callback? Acho que o exemplo acima deixa claro que a principal vantagem é o reuso sem causar acoplamento. No caso a função pessoa nunca sabe como é feita a saudação, tudo o que ela sabe é que tem que chamar a função de callback passando um parâmetro. Foi possível trocar a saudação de console para alert sem alterar a função pessoa.</p>

<p>Um exemplo um pouco mais útil é quando fazemos loops de elementos, por exemplo, vamos supor que eu queira consultar todos os meus campos texto na página, fazer alguma coisa com cada um deles e no fim retornar a lista de campos.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">listaCampos</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algo bem complexo com cada campo</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">campos</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Depois disso eu decido que eu quero que cada campo tenha uma borda vermelha, porque eu quero destacar esses campos. Eu poderia pegar o retorno dessa função, fazer um for em cada item de novo e adicionar a borda.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nx">listaCampos</span><span class="p">();</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">campos</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&quot;style&quot;</span><span class="p">,</span> <span class="s2">&quot;border: 1px solid red&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>O problema com essa solução é que eu fiz dois loops, um quando peguei os campos e um quando quis deixá-los com a borda vermelha. É possível ser mais simples (e mais rápido) do que isso, eu poderia alterar dentro do for original da função listaCampos e adicionar a linha para deixar os campos com a borda vermelha.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">listaCampos</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algo bem complexo com cada campo</span>
</span><span class='line'>        <span class="nx">campos</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&quot;style&quot;</span><span class="p">,</span> <span class="s2">&quot;border: 1px solid red&quot;</span><span class="p">);</span>
</span><span class='line'><span class="err"> </span>   <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">campos</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>O problema dessa segunda opção é que se eu quiser usar essa função listaCampos em outra parte no meu código, eu sempre vou ter os campos com a borda vermelha. E nem sempre eu quero vermelho, pode ser que em outro ponto eu queria azul! Aí entra o callback.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">campoVermelho</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">campo</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">campo</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&quot;style&quot;</span><span class="p">,</span> <span class="s2">&quot;border: 1px solid red&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">listaCampos</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">!==</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">callback</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algo bem complexo com cada campo</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">callback</span><span class="p">(</span><span class="nx">campos</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">campos</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">listaCampos</span><span class="p">(</span><span class="nx">campoVermelho</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>No código acima, a primeira coisa que eu fiz foi criar a função de callback que espera um campo como parâmetro e faz com que a borda desse campo fique vermelha. Depois, na função listaCampos eu alterei a função para que ela receba um parâmetro, que vai ser uma função de callback.</p>

<p>Em seguida eu testo para ver se uma função foi realmente passada (já que no JavaScript os parâmetros não são obrigatórios). Dentro do loop, se a função de callback foi passada como parâmetro, eu a executo.</p>

<p>Nesse caso agora se eu quisesse que os campos tivessem a borda azul era só criar uma outra função que fizesse isso e passar como parâmetro para a função listaCampos. A função listaCampos continua sendo genérica e pode ser utilizada por outras. Melhor que isso, é uma função que faz uma coisa só e não está com a funcionalidade acoplada a ela.</p>

<h2>Funções de callback e escopo</h2>


<p>Dito isso, agora vem a parte um pouco mais complicada que é a parte do escopo com as funções de callback. Imagine que ao invés de passar uma função, eu tenho um objeto e eu passo um método desse objeto como callback para a função listaCampos.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">listaCampos</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nx">documente</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">!==</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">callback</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algo bem complexo com cada campo</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">callback</span><span class="p">(</span><span class="nx">campos</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">campos</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">customCampo</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;cor&#39;</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;defineCor&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">campo</span><span class="p">){</span>
</span><span class='line'>        <span class="nx">campo</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;style&#39;</span><span class="p">,</span> <span class="s1">&#39;border: 1px solid &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">cor</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">listaCampos</span><span class="p">(</span><span class="nx">customCampo</span><span class="p">.</span><span class="nx">defineCor</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>No exemplo acima, o objeto customCampo tem um método defineCor que eu passo como callback para a função listaCampos. O problema é que o método defineCor usa this para fazer acesso ao valor da propriedade cor. Mas, a função listaCampos faz parte do objeto global e portanto nesse momento this vai fazer acesso ao objeto global também.</p>

<p>A solução para esse caso é sempre que passar uma função de callback, passar também o objeto que será o contexto da função de callback.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">listaCampos</span><span class="p">(</span><span class="nx">customCampo</span><span class="p">.</span><span class="nx">defineCor</span><span class="p">,</span> <span class="nx">customCampo</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>E aí eu preciso modificar também a função listaCampos</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">listaCampos</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="nx">ctx</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nx">documente</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">!==</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">callback</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algo bem complexo com cada campo</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">callback</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">campos</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">campos</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Isso resolve o problema, mas quando chamamos a função listaCampos temos que informar duas vezes o objeto customCampo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">listaCampos</span><span class="p">(</span><span class="nx">customCampo</span><span class="p">.</span><span class="nx">defineCor</span><span class="p">,</span> <span class="nx">customCampo</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Existe uma forma um pouco mais elegante para isso, a gente pode chamar a função listaCampos dessa forma:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">listaCampos</span><span class="p">(</span><span class="s1">&#39;defineCor&#39;</span><span class="p">,</span> <span class="nx">customCampo</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>E aí alteramos a função listaCampos para:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">listaCampos</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="nx">ctx</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">campos</span> <span class="o">=</span> <span class="nx">documente</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalItens</span> <span class="o">=</span> <span class="nx">campos</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">callback</span> <span class="o">=</span> <span class="nx">ctx</span><span class="p">[</span><span class="nx">callback</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">!==</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">callback</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&amp;</span><span class="nx">lt</span><span class="p">;</span> <span class="nx">totalItens</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// algo bem complexo com cada campo</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">callback</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">campos</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">campos</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">customCampo</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;cor&#39;</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;defineCor&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">campo</span><span class="p">){</span>
</span><span class='line'>        <span class="nx">campo</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;style&#39;</span><span class="p">,</span> <span class="s1">&#39;border: 1px solid &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">cor</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Um pouco mais elegante.</p>

<p>Por hoje é só, espero que tenha sido útil!<!--:--></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Se você tem ou quer ter um blog, você precisa ler esse livro]]></title>
    <link href="http://templecoding.com/blog/2012/12/03/analise-do-livro-technical-blogging/"/>
    <updated>2012-12-03T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/12/03/analise-do-livro-technical-blogging</id>
    <content type="html"><![CDATA[<p>Eu terminei de ler há alguns dias e resolvi fazer uma análise do livro <a href="http://www.amazon.com/gp/product/1934356883/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356883&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">Technical Blogging: </a><a href="http://www.amazon.com/gp/product/1934356883/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356883&amp;linkCode=as2&amp;tag=tempcodi0f-20" rel="attachment wp-att-1024" target="_blank"><img class="alignright" src="http://templecoding.com/images/2012/11/actb_xlargecover.jpg" title="Technica Blogging" ></a><a href="http://www.amazon.com/gp/product/1934356883/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356883&amp;linkCode=as2&amp;tag=tempcodi0f-20" target="_blank">Turn Your Expertise into a Remarkable Online Presence</a> por <a href="http://antoniocangiano.com/" target="_blank">Antonio Cangiano</a>. Ainda estou digerindo tudo que aprendi nesse livro e já pondo em prática <del>algumas</del> várias coisas.</p>

<p>É um dos livros com a maior quantidade de dicas praticas que já li. Diversas dicas e ideias de uso imediato. Para quem usa, ou planeja usar, o WordPress como plataforma é ainda mais útil. O livro apresenta vários plug-ins que vão facilitar a vida na hora de escrever, ajudar a trazer mais performance para o site, trazer mais facilidade e valor para os usuários que vão ler o blog.</p>

<h2>Produzindo conteúdo</h2>


<p>Os capitulos 5 e 6 &ldquo;Creating Remarkable Content&rdquo; e &ldquo;Producing Content Regularly&rdquo; são ótimos para dar ideias e abrir a mente para a produção de conteúdo diversificado e com regularidade.</p>

<h2>Promovendo seu blog</h2>


<p>As dicas para promover o blog do capitulo 7 foram extremamente valiosas. Eu sempre tive pra mim que <a href="https://pt.wikipedia.org/wiki/Otimiza%C3%A7%C3%A3o_para_motores_de_busca">SEO</a> era uma daquelas coisas irrelevantes, que simplesmente funciona e pronto, bom, não é exatamente assim. Além disso, eu passei a olhar as estatísticas de visita do site de uma outra forma.</p>

<h2>Para empresas e blogs em grupo</h2>


<p>Se você faz um blog para sua empresa ou grupo, essa parte também não foi esquecida, embora, para blogs como esse isso não faça tanta diferença.</p>

<p>Para concluir essa breve análise do livro Technical Blogging; esse foi um livro que eu comprei sem esperar muita coisa dele, achando que não ia tirar muito proveito. Me enganei. Eu comecei a ler e não parei enquanto não terminei. Ótimo, eu recomendo.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Seletores jQuery]]></title>
    <link href="http://templecoding.com/blog/2012/11/30/seletores-jquery/"/>
    <updated>2012-11-30T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/11/30/seletores-jquery</id>
    <content type="html"><![CDATA[<iframe src="http://www.youtube.com/embed/aY3aVX1mDGY" frameborder="0" width="640" height="360"></iframe>


<h2>Seletores jQuery</h2>


<p>Para selecionar elementos do DOM o jQuery faz uso dos seletores do CSS e também possui alguns seletores próprios. Nesse video eu mostro alguns exemplos desses seletores, de forma individual e combinando tanto seletores CSS como seletores jQuery.</p>

<h2>Links</h2>


<p><a href="http://bit.ly/113M34I" target="_blank">Documentação dos seletores jQuery</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Escopo no JavaScript: esse this não é daqui]]></title>
    <link href="http://templecoding.com/blog/2012/11/28/escopo-no-javascript/"/>
    <updated>2012-11-28T00:00:00-05:00</updated>
    <id>http://templecoding.com/blog/2012/11/28/escopo-no-javascript</id>
    <content type="html"><![CDATA[<p>Existem duas questões importantes com relação ao escopo no JavaScript.  Declaração de variáveis e o valor de this.</p>

<div style="margin: 5px 0px; border: #f48432 1px dashed; padding: 5px;"><strong>Sofrendo menos com JavaScript</strong>
Esse post faz parte de uma série, confira os outros já feitos:
<ol>
    <li><a href="http://templecoding.com/blog/2012/10/25/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/05/elevao-em-javascript/">Elevação em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/12/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
    <li><a href="http://templecoding.com/blog/2012/11/21/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
    <li>Escopo no JavaScript: esse this não é daqui</li>
    <li><a href="http://templecoding.com/blog/2012/12/05/funes-de-callback-no-javascript/">Funções de callback</a></li>
    <li><a href="http://templecoding.com/blog/2012/12/14/tratamento-de-excecoes-em-javascript/">Tratamento de exceções em JavaScript</a></li>
    <li><a href="http://templecoding.com/blog/2013/02/18/construtores-de-arrays-do-javascript/">Construtores de Arrays</a></li>
    <li><a href="http://templecoding.com/blog/2013/03/11/loops-for-in-no-javascript/">Loops for in</a></li>
</ol>
</div>


<p>A primeira parte é fácil, eu já falei um pouco disso quando falei de <a href="http://templecoding.com/blog/2012/10/25/declarao-de-variveis-com-javascript/">declaração de variáveis</a>. Toda variável declarada com a palavra chave var tem o escopo da função em que foi declarada. Portanto, na função abaixo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">func1</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// qualquer coisa aqui </span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span> <span class="c1">// 10 </span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>A variável i vai ser 10 no fim do método, porque dentro de um método, não importa onde a variável é declarada, ela sempre faz parte do escopo da função. E claro, não pode ser acessada fora da função.</p>

<p>Agora o this é um pouco mais complicado. O this sempre faz referência ao objeto que a função faz parte. Por exemplo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;nome&#39;</span><span class="o">:</span> <span class="s1">&#39;Thiago&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;getNome&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Olá, &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">nome</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">pessoa</span><span class="p">.</span><span class="nx">getNome</span><span class="p">();</span> <span class="c1">// Olá, Thiago</span>
</span></code></pre></td></tr></table></div></figure>


<p>No exemplo acima, eu declaro um objeto e atribuo à variável pessoa. E getNome é definido com uma função, portanto essa função é um método desse objeto. Dessa forma o contexto de this dentro desse método é o objeto em que ele foi definido e chamada de getNome funciona como o esperado.</p>

<p>Já no exemplo abaixo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;nome&#39;</span><span class="o">:</span> <span class="s1">&#39;Thiago&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;getNome&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">fx</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Olá, &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">nome</span><span class="p">);</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>        <span class="nx">fx</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">pessoa</span><span class="p">.</span><span class="nx">getNome</span><span class="p">();</span> <span class="c1">// Olá, undefined</span>
</span></code></pre></td></tr></table></div></figure>


<p>Dentro do método, fx é apenas uma variável que recebe uma função, não é um método que faz parte de um objeto, por isso, this nesse caso faz referência ao escopo global, que no caso do browser, quer dizer o objeto window.</p>

<h2>Trocando o escopo de uma função</h2>


<p>A última coisa que eu quero dizer sobre o escopo e this é que no JavaScript nós podemos alterar a referência this. Veja o exemplo abaixo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">dizOla</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Ola, &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">nome</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">pessoa</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;nome&#39;</span><span class="o">:</span> <span class="s1">&#39;Thiago Temple&#39;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">dizOla</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">pessoa</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>A função dizOla nao faz parte de nenhum objeto, portanto this dentro daquela função faz referencia ao objeto window. Mas, quando executo a função usando o método call, eu passo o objeto pessoa como parâmetro. Nesse momento estou dizendo para a função dizOla usar o objeto pessoa como contexto.</p>

<p>Alterar o escopo no JavaScript é uma característica muito importante e muito utilizada, porque é uma forma bem simples e eficaz de fazer reuso de funções.</p>

<p>É isso aí por hoje. Até a próxima!</p>
]]></content>
  </entry>
  
</feed>
