<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Temple Coding</title>
	<atom:link href="http://templecoding.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://templecoding.com</link>
	<description>código, tecnologia e outras nerdices</description>
	<lastBuildDate>Mon, 20 May 2013 03:23:22 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>ASP.NET MVC Model Binding</title>
		<link>http://templecoding.com/asp-net-mvc-model-binding/</link>
		<comments>http://templecoding.com/asp-net-mvc-model-binding/#comments</comments>
		<pubDate>Mon, 20 May 2013 03:23:22 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[VideoCast]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[entity framework]]></category>
		<category><![CDATA[windsor]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1255</guid>
		<description><![CDATA[ASP.NET MVC Model Binding 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. Por fim, mostro como criar um Model Binder Provider que retorna um <a class="more-link" href="http://templecoding.com/asp-net-mvc-model-binding/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://www.youtube.com/embed/szF_fULctj4" frameborder="0" width="640" height="360"></iframe></p>
<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:encoded>
			<wfw:commentRss>http://templecoding.com/asp-net-mvc-model-binding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript is Sexy &#8211; dica rápida</title>
		<link>http://templecoding.com/javascript-is-sexy-dica-rapida/</link>
		<comments>http://templecoding.com/javascript-is-sexy-dica-rapida/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 20:27:42 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[Leitura]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1246</guid>
		<description><![CDATA[Uma dica bem rápida. Hoje (não sei exatamente como), fui parar nesse site JavaScript is Sexy. E achei o site excelente, com vários &#8220;roadmaps&#8221; para aprender assuntos diferentes mas relacionados ao JavaScript. Por exemplo, tem um bom roadmap para aprender <a class="more-link" href="http://templecoding.com/javascript-is-sexy-dica-rapida/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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 &#8220;roadmaps&#8221; 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:encoded>
			<wfw:commentRss>http://templecoding.com/javascript-is-sexy-dica-rapida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrar é traduzir, não é reproduzir</title>
		<link>http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/</link>
		<comments>http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/#comments</comments>
		<pubDate>Thu, 21 Mar 2013 14:13:29 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[integracaoes]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1222</guid>
		<description><![CDATA[Eu trabalho fazendo integrações de aplicações web com o SAP há alguns anos já. E existem &#8220;alguns padrões&#8221; (vou chamar de padrões), que existem no SAP que são bem particulares à esse ERP. Só para ambientar aqueles que não conhecem <a class="more-link" href="http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eu trabalho fazendo integrações de aplicações web com o SAP há alguns anos já. E existem &#8220;alguns padrões&#8221; (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><a href="http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/system_integration/" rel="attachment wp-att-1231"><img class="alignleft size-full wp-image-1231" title="system_integration" src="http://templecoding.com/wp-content/uploads/2013/03/system_integration.jpeg" alt="" width="240" height="150" /></a>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><a href="http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/sap_return/" rel="attachment wp-att-1224"><img class="aligncenter  wp-image-1224" title="sap_return" src="http://templecoding.com/wp-content/uploads/2013/03/sap_return.png" alt="Retorno de erros no SAP" width="446" height="319" /></a></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><a href="http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/nomes_sap/" rel="attachment wp-att-1223"><img class="aligncenter size-full wp-image-1223" title="Nomenclatura_SAP" src="http://templecoding.com/wp-content/uploads/2013/03/nomes_sap.png" alt="Nomenclatura no SAP" width="247" height="434" /></a></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.<a href="http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/images_boo/" rel="attachment wp-att-1232"><img class="alignright size-full wp-image-1232" title="images_boo" src="http://templecoding.com/wp-content/uploads/2013/03/images_boo.jpeg" alt="" width="255" height="197" /></a></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><a href="http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/slip/" rel="attachment wp-att-1230"><img class="aligncenter size-full wp-image-1230" title="slip" src="http://templecoding.com/wp-content/uploads/2013/03/slip.png" alt="" width="249" height="263" /></a>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:encoded>
			<wfw:commentRss>http://templecoding.com/integrar-e-traduzir-nao-e-reproduzir/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Loops for in no JavaScript</title>
		<link>http://templecoding.com/loops-for-in-no-javascript/</link>
		<comments>http://templecoding.com/loops-for-in-no-javascript/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 17:52:15 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1197</guid>
		<description><![CDATA[O JavaScript tem o suporte nativo a loops do tipo for in e, ele funciona de uma forma muito semelhante ao foreach do C# (por exemplo), mas temos que tomar alguns cuidados, por que como tudo no JavaScript, sempre temos <a class="more-link" href="http://templecoding.com/loops-for-in-no-javascript/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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;">
<p><strong>Sofrendo menos com JavaScript</strong><br />
Esse post faz parte de uma série, confira os outros já feitos:</p>
<ol>
<li><a href="http://templecoding.com/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
<li><a href="http://templecoding.com/elevao-em-javascript/">Elevação em JavaScript</a></li>
<li><a href="http://templecoding.com/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
<li><a href="http://templecoding.com/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
<li><a href="http://templecoding.com/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
<li><a href="http://templecoding.com/funcoes-de-callback-no-javascript/">Funções de callback</a></li>
<li><a href="http://templecoding.com/tratamento-de-excecoes-em-javascript/">Tratamento de exceções em JavaScript</a></li>
<li><a href="http://templecoding.com/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>
<pre class="brush: js; ruler: true; smart-tabs: false;">var propriedade;
var pessoa = {
    nome: 'Thiago',
    sobrenome: 'Temple',
    dizOla: function() {
        alert('Ola');
    }
};
for(propriedade in pessoa){
    document.writeln(propriedade);
}
//exibe: nome sobrenome dizOla</pre>
<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>
<pre class="brush: js; ruler: true; smart-tabs: false;">for(propriedade in pessoa){
    if (typeof pessoa[propriedade] !== 'function') {
        document.writeln(propriedade);
    };
}
//exibe: nome sobrenome</pre>
<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>
<pre class="brush: js; ruler: true; smart-tabs: false;">var propriedade;
var pessoa = {
    nome: 'Thiago',
    sobrenome: 'Temple',
    dizOla: function() {
        alert('Ola');
    }
};

Object.prototype.naoRelacionado = 'eu nao devia estar aqui';

for(propriedade in pessoa){
    document.writeln(propriedade);
}

//exibe: nome sobrenome dizOla naoRelacionado</pre>
<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>
<pre class="brush: js; ruler: true; smart-tabs: false;">for(propriedade in pessoa){
    if(pessoa.hasOwnProperty(propriedade)) {
        document.writeln(propriedade);
    }
}

//exibe: nome sobrenome dizOla</pre>
<p>O método hasOwnProperty verifica se a propriedade foi definida no objeto em questão.</p>
<p>É isso ai.</p>
]]></content:encoded>
			<wfw:commentRss>http://templecoding.com/loops-for-in-no-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inversão de Controle com Castle Windsor e ASP.NET MVC</title>
		<link>http://templecoding.com/inversao-de-controle-com-castle-windsor-e-asp-net-mvc/</link>
		<comments>http://templecoding.com/inversao-de-controle-com-castle-windsor-e-asp-net-mvc/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 15:03:44 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[VideoCast]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[windsor]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1191</guid>
		<description><![CDATA[Demonstração usando ASP.NET MVC e Castle Windsor como container de inversão de controle. <a class="more-link" href="http://templecoding.com/inversao-de-controle-com-castle-windsor-e-asp-net-mvc/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://www.youtube.com/embed/zRoYsC6TkRE" frameborder="0" width="640" height="360"></iframe></p>
<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:encoded>
			<wfw:commentRss>http://templecoding.com/inversao-de-controle-com-castle-windsor-e-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Construtores de Arrays do JavaScript</title>
		<link>http://templecoding.com/construtores-de-arrays-do-javascript/</link>
		<comments>http://templecoding.com/construtores-de-arrays-do-javascript/#comments</comments>
		<pubDate>Mon, 18 Feb 2013 15:48:57 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1171</guid>
		<description><![CDATA[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. Bora falar um pouco mais de JavaScript e o que existe de estranho com os construtores de <a class="more-link" href="http://templecoding.com/construtores-de-arrays-do-javascript/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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. <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://templecoding.com/wp-content/uploads/2013/02/wlEmoticon-smile.png" alt="Alegre" /></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;">
<p><strong>Sofrendo menos com JavaScript</strong><br />
Esse post faz parte de uma série, confira os outros já feitos:</p>
<ol>
<li><a href="http://templecoding.com/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
<li><a href="http://templecoding.com/elevao-em-javascript/">Elevação em JavaScript</a></li>
<li><a href="http://templecoding.com/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
<li><a href="http://templecoding.com/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
<li><a href="http://templecoding.com/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
<li><a href="http://templecoding.com/funcoes-de-callback-no-javascript/">Funções de callback</a></li>
<li><a href="http://templecoding.com/tratamento-de-excecoes-em-javascript/">Tratamento de exceções em JavaScript</a></li>
<li>Construtores de Arrays</li>
<li><a href="http://templecoding.com/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>
<pre class="brush: js;">var a = new Array("texto");
console.log(a.length); // 1
console.log(a[0]); // texto</pre>
<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>
<pre class="brush: js;">var a = new Array(3);
console.log(a.length) // 3
console.log(a[0]); // undefined</pre>
<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>
<pre class="brush: js;">var a = new Array(3.2); // RangeError: invalid array length</pre>
<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>
<pre class="brush: js;">var a = ["texto"]; // Cria um elemento e atribui o valor a ele

var b = [1, 2, 3]; // Cria um array com 3 elementos e com os valores 1, 2 e 3</pre>
<p>Um problema simples de resolver esse, não é?</p>
]]></content:encoded>
			<wfw:commentRss>http://templecoding.com/construtores-de-arrays-do-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validação com jQuery Validation</title>
		<link>http://templecoding.com/validacao-com-jquery-validation/</link>
		<comments>http://templecoding.com/validacao-com-jquery-validation/#comments</comments>
		<pubDate>Wed, 19 Dec 2012 09:00:02 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[VideoCast]]></category>
		<category><![CDATA[globalize]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[validacao]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1135</guid>
		<description><![CDATA[Validação com jQuery Validation O jQuery validation é um plugin para fazer validações de formulários. Nesse video mostro como fazer algumas validações como: campos obrigatórios customizações de mensagens validações de tipos de dados específicos como data, email e números validações <a class="more-link" href="http://templecoding.com/validacao-com-jquery-validation/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:pt--><iframe src="http://www.youtube.com/embed/4AzSUHxW2Ww" frameborder="0" width="640" height="360"></iframe></p>
<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>
<p><!--:--><!--:en--></p>
<p><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://templecoding.com/validacao-com-jquery-validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tratamento de exceções em JavaScript</title>
		<link>http://templecoding.com/tratamento-de-excecoes-em-javascript/</link>
		<comments>http://templecoding.com/tratamento-de-excecoes-em-javascript/#comments</comments>
		<pubDate>Fri, 14 Dec 2012 15:34:33 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1113</guid>
		<description><![CDATA[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 <a class="more-link" href="http://templecoding.com/tratamento-de-excecoes-em-javascript/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:pt-->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>
<pre class="brush: js; ruler: true; smart-tabs: false;">var comErro = function() {
    throw {
        name: 'CustomError',
        message: 'Um erro muito grave para ser tratado'
    };
};

try {
    comErro();
}
catch(e) {
    console.log(e.name + ' - ' + e.message); //CustomError - Um erro muito grave para ser tratado
}</pre>
<div style="margin: 5px 0px; border: #f48432 1px dashed; padding: 5px;">
<p><strong>Sofrendo menos com JavaScript</strong><br />
Esse post faz parte de uma série, confira os outros já feitos:</p>
<ol>
<li><a href="http://templecoding.com/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
<li><a href="http://templecoding.com/elevao-em-javascript/">Elevação em JavaScript</a></li>
<li><a href="http://templecoding.com/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
<li><a href="http://templecoding.com/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
<li><a href="http://templecoding.com/escopo-no-javascript/">Escopo no JavaScript: esse this não é daqui</a></li>
<li><a href="http://templecoding.com/funcoes-de-callback-no-javascript/">Funções de callback</a></li>
<li>Tratamento de exceções em JavaScript</li>
<li><a href="http://templecoding.com/construtores-de-arrays-do-javascript/">Construtores de Arrays</a></li>
<li><a href="http://templecoding.com/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>
<pre class="brush: js; ruler: true; smart-tabs: false;">var comErro = function() {
    var error = new Error('Um erro muito grave para ser tratado');
    error.name = 'CustomError';
    throw error;
};

try {
    comErro();
}
catch(e) {
    console.log(e.name + ' - ' + e.message); //CustomError - Um erro muito grave para ser tratado
}</pre>
<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>
<pre class="brush: js; ruler: true; smart-tabs: false;">error.name = 'CustomError';</pre>
<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:encoded>
			<wfw:commentRss>http://templecoding.com/tratamento-de-excecoes-em-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax com jQuery</title>
		<link>http://templecoding.com/ajax-com-jquery/</link>
		<comments>http://templecoding.com/ajax-com-jquery/#comments</comments>
		<pubDate>Fri, 07 Dec 2012 05:01:40 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[VideoCast]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1104</guid>
		<description><![CDATA[Ajax com jQuery 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 <a class="more-link" href="http://templecoding.com/ajax-com-jquery/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:pt--><iframe src="http://www.youtube.com/embed/he2k0FZBHq8" frameborder="0" width="640" height="360"></iframe></p>
<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><br />
<a href="http://www.malsup.com/jquery/form/">jQuery Form Plugin</a><br />
<a href="https://github.com/CodeSeven/toastr">Toastr Plugin</a><br />
<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><!--:--><!--:en--></p>
<p><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://templecoding.com/ajax-com-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funções de callback no JavaScript</title>
		<link>http://templecoding.com/funes-de-callback-no-javascript/</link>
		<comments>http://templecoding.com/funes-de-callback-no-javascript/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 10:00:45 +0000</pubDate>
		<dc:creator>vintem</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://templecoding.com/?p=1068</guid>
		<description><![CDATA[O que são funções de callback? 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 <a class="more-link" href="http://templecoding.com/funes-de-callback-no-javascript/">...Continue lendo...<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:pt--></p>
<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;">
<p><strong>Sofrendo menos com JavaScript</strong><br />
Esse post faz parte de uma série, confira os outros já feitos:</p>
<ol>
<li><a href="http://templecoding.com/declarao-de-variveis-com-javascript/">Declaração de variáveis com JavaScript</a></li>
<li><a href="http://templecoding.com/elevao-em-javascript/">Elevação em JavaScript</a></li>
<li><a href="http://templecoding.com/converter-numeros-em-javascript-e-uma-droga/">Converter números em JavaScript é uma droga</a></li>
<li><a href="http://templecoding.com/javascript-ponto-virgula/">JavaScript e o problema com o ponto e vírgula</a></li>
<li><a href="http://templecoding.com/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/tratamento-excecoes-javascript/">Tratamento de exceções em JavaScript</a></li>
<li><a href="http://templecoding.com/construtores-de-arrays-do-javascript/">Construtores de Arrays</a></li>
<li><a href="http://templecoding.com/loops-for-in-no-javascript/">Loops for in</a></li>
</ol>
</div>
<p>Por exemplo:</p>
<pre class="brush: js;">var pessoa = function(nome, dizerOla) {
    dizerOla(nome);
};
var olaNoConsole = function(nome) {
    console.log(nome); // 
}
pessoa('Thiago', olaNoConsole);</pre>
<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.<br />
A função de callback pode ser também uma função anônima como no exemplo abaixo:</p>
<pre class="brush: js;">var pessoa = function(nome, dizerOla) {
    dizerOla(nome);
};
pessoa('Thiago', function(nome) {
    alert('Ola ' + nome);
});</pre>
<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>
<pre class="brush: js;">var listaCampos = function() {
    var campos = document.getElementsByTagName("input");
    var totalItens = campos.length, i;
    for (i = 0; i &lt; totalItens; i++) { 
        // algo bem complexo com cada campo
    }
    return campos;
};</pre>
<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>
<pre class="brush: js;">var campos = listaCampos();
var totalItens = campos.length, i;
for (i = 0; i &lt; totalItens; i++) { 
    campos[i].setAttribute("style", "border: 1px solid red");
}</pre>
<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>
<pre class="brush: js;">var listaCampos = function() {
    var campos = document.getElementsByTagName("input");
    var totalItens = campos.length, i;
    for (i = 0; i &lt; totalItens; i++) { 
        // algo bem complexo com cada campo
        campos[i].setAttribute("style", "border: 1px solid red");
    }
    return campos;
};</pre>
<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>
<pre class="brush: js;">var campoVermelho = function(campo) {
    campo.setAttribute("style", "border: 1px solid red");
};

var listaCampos = function(callback) {
    var campos = document.getElementsByTagName("input");
    var totalItens = campos.length, i;

    if (typeof callback !== 'function') {
        callback = false;
    }

    for (i = 0; i &lt; totalItens; i++) { 
        // algo bem complexo com cada campo
        if(callback) {
            callback(campos[i]);
        }
    }
    return campos;
};

listaCampos(campoVermelho);</pre>
<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>
<pre class="brush: js;">var listaCampos = function(callback) {
    var campos = documente.getElementsByTagName("input");
    var totalItens = campos.length, i;

    if (typeof callback !== 'function') {
        callback = false;
    }

    for (i = 0; i &lt; totalItens; i++) {
        // algo bem complexo com cada campo
        if(callback) {
            callback(campos[i]);
        }
    }

    return campos;
};

var customCampo = {
    'cor': 'red',
    'defineCor': function(campo){
        campo.setAttribute('style', 'border: 1px solid ' + this.cor);
    }
};

listaCampos(customCampo.defineCor);</pre>
<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>
<pre class="brush: js;">listaCampos(customCampo.defineCor, customCampo);</pre>
<p>E aí eu preciso modificar também a função listaCampos</p>
<pre class="brush: js; highlight: [1, 11, 12];">var listaCampos = function(callback, ctx) {
    var campos = documente.getElementsByTagName("input");
    var totalItens = campos.length, i;

    if (typeof callback !== 'function') {
        callback = false;
    }

    for (i = 0; i &lt; totalItens; i++) {
        // algo bem complexo com cada campo
        if(typeof callback === 'function') {
            callback.call(ctx, campos[i]);
        }
    }

    return campos;
};</pre>
<p>Isso resolve o problema, mas quando chamamos a função listaCampos temos que informar duas vezes o objeto customCampo:</p>
<pre class="brush: js;">listaCampos(customCampo.defineCor, customCampo);</pre>
<p>Existe uma forma um pouco mais elegante para isso, a gente pode chamar a função listaCampos dessa forma:</p>
<pre class="brush: js;">listaCampos('defineCor', customCampo);</pre>
<p>E aí alteramos a função listaCampos para:</p>
<pre class="brush: js; highlight: [5, 6, 7];">var listaCampos = function(callback, ctx) {
    var campos = documente.getElementsByTagName("input");
    var totalItens = campos.length, i;

    if (typeof callback === 'string') {
        callback = ctx[callback];
    }

    if (typeof callback !== 'function') {
        callback = false;
    }

    for (i = 0; i &lt; totalItens; i++) {
        // algo bem complexo com cada campo

        if(typeof callback === 'function') {
            callback.call(ctx, campos[i]);
        }
    }

    return campos;
};

var customCampo = {
    'cor': 'red',
    'defineCor': function(campo){
        campo.setAttribute('style', 'border: 1px solid ' + this.cor);
    }
};</pre>
<p>Um pouco mais elegante.</p>
<p>Por hoje é só, espero que tenha sido útil!<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://templecoding.com/funes-de-callback-no-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk
Object Caching 966/1100 objects using disk

 Served from: vintem.com.br @ 2013-05-23 10:57:56 by W3 Total Cache -->