<?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>Profissionais TI - Pra quem respira informação &#187; Klaus Peter Laube</title>
	<atom:link href="http://www.profissionaisti.com.br/author/klaus-peter-laube/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.profissionaisti.com.br</link>
	<description>Pra quem respira informação</description>
	<lastBuildDate>Sun, 12 Feb 2012 12:27:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Assegure a qualidade do seu código Python &#8211; pep8</title>
		<link>http://www.profissionaisti.com.br/2011/08/assegure-a-qualidade-do-seu-codigo-python-pep8/</link>
		<comments>http://www.profissionaisti.com.br/2011/08/assegure-a-qualidade-do-seu-codigo-python-pep8/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 16:04:11 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Qualidade]]></category>
		<category><![CDATA[pep8]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=19170</guid>
		<description><![CDATA[Convenções de código! Já tive a oportunidade de escrever sobre elas no Profissionais TI. Benção ou maldição? Há quem goste, há quem ache uma perda de tempo&#8230; Acredito muito que a organização e a qualidade do código são benéficas para qualquer projeto, principalmente para aqueles que possuem alta rotatividade de profissionais. Padrões de projetos, padrões estruturais [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Convenções de código! Já tive a oportunidade de <a title="Codifique como um verdadeiro Pythonista" href="http://www.profissionaisti.com.br/2009/06/codifique-como-um-verdadeiro-pythonista/">escrever sobre elas no <em>Profissionais TI</em></a>. Benção ou maldição? Há quem goste, há quem ache uma perda de tempo&#8230;</p>
<p style="text-align: justify;">Acredito muito que a organização e a qualidade do código são benéficas para qualquer projeto, principalmente para aqueles que possuem alta rotatividade de profissionais. Padrões de projetos, padrões estruturais e de escrita facilitam a &#8220;assimilação&#8221; do que já foi produzido, facilita a manutenção e &#8220;orienta&#8221; as novas produções.</p>
<p style="text-align: justify;">Se você tem problemas em decorar convenções e boas práticas, não desanime! O <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a> </em>possui algumas ferramentas &#8220;bacanudas&#8221; que vão te auxiliar a deixar o <em>software </em>mais próximo do &#8220;estado da arte&#8221;, seja garantindo as convenções de código, seja avaliando a qualidade do mesmo.</p>
<h3 style="text-align: justify;">Python Enhancement Proposals</h3>
<p style="text-align: justify;">As &#8220;<em>PEPs</em>&#8220; (<em>Python Enhancement Proposal</em>) são documentos que geralmente abordam alguma nova funcionalidade da linguagem, propósitos, procedimentos ou ambiente. Em suma, são &#8220;<em>guidelines</em>&#8221; que te orientam num melhor uso da linguagem e suas funcionalidades, bem como podem ajudar em questões como arquitetura, ambiente ou processos de sua aplicação.</p>
<p style="text-align: justify;">Para saber mais sobre <em>PEP</em>s<em>, </em><a title="PEP1 - PEP Purpose and Guidelines" href="http://www.python.org/dev/peps/pep-0001/">acesse a </a><em><a title="PEP1 - PEP Purpose and Guidelines" href="http://www.python.org/dev/peps/pep-0001/">PEP 1</a> </em>que é justamente um documento explicando o que são e o que fazem as <em>Python Enhancement Proposals</em>.</p>
<h3 style="text-align: justify;">pep8</h3>
<p style="text-align: justify;">O <strong><em>pep8 </em></strong>é uma ferramenta simples (e muito eficaz) que analisa o seu código <em>Python </em>segundo as convenções de código descritas na <em><a title="PEP 8 - Style Guide for Python Code" href="http://www.python.org/dev/peps/pep-0008/">PEP 8</a></em>.</p>
<p style="text-align: justify;">Vamos analisar o código do <em><a title="Repositório no GitHub do site do Django no Brasil" href="https://github.com/djangobrasil/djangobrasil.org">Django Brasil</a> </em>(você não sabia? O <em>site </em>é <em>open source</em>!), mais especificamente o arquivo <em><strong>models.py </strong></em>da <em>app blog</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pep8 src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span>models.py
&nbsp;
src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span>models.py:<span style="color: #000000;">42</span>:<span style="color: #000000;">65</span>: W291 trailing whitespace
src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span>models.py:<span style="color: #000000;">62</span>:<span style="color: #000000;">1</span>: E302 expected <span style="color: #000000;">2</span> blank lines, found <span style="color: #000000;">1</span>
src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span>models.py:<span style="color: #000000;">105</span>:<span style="color: #000000;">80</span>: E501 line too long <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">89</span> characters<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Como podemos ver, a ferramenta nos mostra a linha e coluna onde o problema foi encontrado, apresentando uma breve descrição da incoerência que estamos cometendo em relação às recomendações da <em>PEP 8</em>.</p>
<p style="text-align: justify;">Para obter uma resposta mais &#8220;<em>verbose</em>&#8220;, podemos passar alguns parâmetros para o <em><strong>pep8</strong></em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pep8 src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span>models.py <span style="color: #660033;">--show-source</span> <span style="color: #660033;">--show-pep8</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span>models.py:<span style="color: #000000;">105</span>:<span style="color: #000000;">80</span>: E501 line too long <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">89</span> characters<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #ff0000;">'/weblog/%s/%s/'</span> <span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>self.pub_date.strftime<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'%Y/%m/%d'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>.lower<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, self.slug<span style="color: #7a0874; font-weight: bold;">&#41;</span>
                                                                               ^
  Limit all lines to a maximum of <span style="color: #000000;">79</span> characters.
&nbsp;
  There are still many devices around that are limited to <span style="color: #000000;">80</span> character
  lines; plus, limiting windows to <span style="color: #000000;">80</span> characters makes it possible to have
  several windows side-by-side.  The default wrapping on such devices looks
  ugly.  Therefore, please limit all lines to a maximum of <span style="color: #000000;">79</span> characters.
  For flowing long blocks of text <span style="color: #7a0874; font-weight: bold;">&#40;</span>docstrings or comments<span style="color: #7a0874; font-weight: bold;">&#41;</span>, limiting the
  length to <span style="color: #000000;">72</span> characters is recommended.</pre></div></div>

<p style="text-align: justify;">Viu só?! Dessa forma podemos aprender sobre a <em>PEP 8 </em>enquanto &#8220;ferimos&#8221; as convenções de código em nossos projetos <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p style="text-align: justify;">Para finalizar, podemos contar as ocorrências de problemas com a <em>PEP 8</em> em determinada região do projeto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pep8 src<span style="color: #000000; font-weight: bold;">/</span>djangobrasil<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>blog<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #660033;">--statistics</span> <span style="color: #660033;">-qq</span> <span style="color: #660033;">--filename</span>=<span style="color: #000000; font-weight: bold;">*</span>.py
&nbsp;
<span style="color: #000000;">1</span>       E225 missing whitespace around operator
<span style="color: #000000;">7</span>       E302 expected <span style="color: #000000;">2</span> blank lines, found <span style="color: #000000;">1</span>
<span style="color: #000000;">1</span>       E303 too many blank lines <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">11</span>      E501 line too long <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">89</span> characters<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">4</span>       W291 trailing whitespace
<span style="color: #000000;">2</span>       W391 blank line at end of <span style="color: #c20cb9; font-weight: bold;">file</span></pre></div></div>

<p style="text-align: justify;">Nenhum problema muito grave de convenções de código na <em>app blog </em>do <em>DjangoBrasil </em> <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;"><strong>Confira: </strong><em><a title="Repositório no GitHub do pep8" href="https://github.com/jcrocholl/pep8/" target="_blank">pep8 &#8211; Python style guide checker</a>.</em></p>
<h3 style="text-align: justify;">Referências</h3>
<ul style="text-align: justify;">
<li><a title="Conheça os tipos de PEPs e quais os seus propósitos" href="http://www.python.org/dev/peps/" target="_blank"><em>Python.org - Index of Python Enhancement Proposals (PEPs)</em></a></li>
<li><a title="Saiba o que é, o que faz, e como é feita uma PEP" href="http://www.python.org/dev/peps/pep-0001/" target="_blank"><em>Python.org - PEP 1: Purpose and Guidelines</em></a></li>
<li><a title="Conheça as convenções de código Python" href="http://www.python.org/dev/peps/pep-0008/" target="_blank"><em>Python.org &#8211; PEP 8: Style Guide for Python Code</em></a></li>
<li><a title="Artigo do Viva o Linux que é uma adaptação para o Português da PEP 8" href="http://www.vivaolinux.com.br/artigo/PEP-8-Guia-de-estilo-para-codigo-Python" target="_blank"><em>Viva o Linux &#8211; PEP 8</em>: Guia de estilo para código <em>Python</em></a></li>
<li><a title="Repositório no GitHub do projeto pep8" href="https://github.com/jcrocholl/pep8/" target="_blank"><em>GitHub &#8211; pep8</em></a></li>
</ul>
<p style="text-align: justify;">Nos próximos <em>posts</em>, vamos dar uma pincelada no <em>pylint</em>, <em>pyflakes </em>e <em>clone digger</em>.</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Assegure a qualidade do seu código Python – pep8" href="http://www.klauslaube.com.br/2011/08/assegure-qualidade-seu-codigo-python-pep/" target="_blank">Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/08/assegure-a-qualidade-do-seu-codigo-python-pep8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Decorators em Python</title>
		<link>http://www.profissionaisti.com.br/2011/08/decorators-em-python/</link>
		<comments>http://www.profissionaisti.com.br/2011/08/decorators-em-python/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 21:58:30 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[decorator]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=18778</guid>
		<description><![CDATA[E na mesma linha dos closures, eu passei a saber realmente o que são decorators depois de utilizar a framework Django. Se você está trabalhando com Orientação a Objetos e até agora não se deparou com este recurso, te garanto que um dia você precisará dele&#8230; afinal, é um dos Design Patterns mais bacanas (e [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">E na mesma linha dos <em><a title="Afinal, o que são Closures?" href="http://www.profissionaisti.com.br/2011/06/afinal-o-que-sao-closures/">closures</a></em>, eu passei a saber realmente o que são <em>decorators </em>depois de utilizar a <em>framework <a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a></em>. Se você está trabalhando com Orientação a Objetos e até agora não se deparou com este recurso, te garanto que um dia você precisará dele&#8230; afinal, é um dos <em><a title="Conheça os Design Patterns" href="http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software">Design Patterns</a> </em>mais bacanas (e úteis) que já vi.</p>
<p style="text-align: justify;">Vamos lá &#8220;decorar&#8221; nossos métodos <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a></em>!</p>
<h3 style="text-align: justify;">Decoradores? <em>Really?</em></h3>
<p style="text-align: justify;">Eu não saberia explicar de uma forma melhor do que foi explicado pela <em><a title="Leia mais sobre o pattern Decorator" href="http://pt.wikipedia.org/wiki/Decorator">Wikipedia</a>, </em>o que é o padrão <em>decorator</em>:</p>
<ul style="text-align: justify;">
<li><strong>Intenção:</strong> Acrescentar responsabilidades a um objeto dinamicamente. Prover alternativa flexível ao uso de subclasses para se estender a funcionalidade de uma classe;</li>
<li><strong>Motivação:</strong> Objeto usado possui as funcionalidades básicas, mas é necessário adicionar funcionalidades adicionais a ele que podem ocorrer antes ou depois da funcionalidade básica. Funcionalidades devem ser adicionadas em instancias individuais e não na classe;</li>
<li><strong>Consequências:</strong> Mais flexibilidade do que herança.</li>
</ul>
<p style="text-align: justify;">Encontramos na <a title="Wiki oficial da linguagem Python" href="http://wiki.python.org/moin/FrontPage"><em>Wiki</em> do </a><em><a title="Wiki oficial da linguagem Python" href="http://wiki.python.org/moin/FrontPage">Python</a> </em>uma explicação mais objetiva e esclarecedora:</p>
<blockquote>
<p lang="text">Decorators alteram dinamicamente a funcionalidade de uma função, método ou classe, sem uso direto de subclasses ou alterando o código-fonte da função &#8220;decorada&#8221;.</p>
</blockquote>
<h3 style="text-align: justify;">O uso de <em>decorators </em>em <em>Python</em></h3>
<p style="text-align: justify;">O <em>Python </em>começou a dar suporte a <em>decorators </em>a partir da <strong>versão 2.4</strong>.</p>
<p style="text-align: justify;">Você terá a sua disposição alguns decoradores <em>built-in</em> e também poderá criar os seus próprios sem muito dificuldade. É possível identificar um <em>decorator </em>através do caractere <strong>@</strong>, por exemplo, a instrução abaixo declara o método <strong>say_hello </strong>da classe <strong>People </strong>como estático:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> People:
    @<span style="color: #008000;">staticmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> say_hello<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Hello!'</span></pre></div></div>

<p style="text-align: justify;">Vale notar que podemos reproduzir o comportamento acima sem utilizar a sintaxe especial de <em>decorators </em>(mas não deixamos de utilizar o conceito):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> People:
    <span style="color: #ff7700;font-weight:bold;">def</span> say_hello<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Hello!'</span>
    say_hello = <span style="color: #008000;">staticmethod</span><span style="color: black;">&#40;</span>say_hello<span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Quer conhecer mais sobre <em>decorators </em>em <em>Python</em>? Leia a <em><a title="Leia mais sobre a PEP318" href="http://www.python.org/dev/peps/pep-0318/" target="_blank">PEP 318 &#8211; Decorators for functions and methods</a></em>.</p>
<h3 style="text-align: justify;">Um pouco de prática</h3>
<p style="text-align: justify;">Vamos por a mão na massa e criar o nosso próprio <em>decorator</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># meu_decorator.py</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> meu_decorador<span style="color: black;">&#40;</span>alvo<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> wrapper<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Chamando a funcao &quot;%s&quot;'</span> <span style="color: #66cc66;">%</span> alvo.__name__
        <span style="color: #ff7700;font-weight:bold;">return</span> alvo<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> wrapper
&nbsp;
@meu_decorador
<span style="color: #ff7700;font-weight:bold;">def</span> meu_alvo<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Eu sou um alvo!'</span>
&nbsp;
meu_alvo<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Chamando o script acima, teremos o seguinte resultado:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ python meu_decorator.py
&nbsp;
Chamando a funcao <span style="color: #ff0000;">&quot;meu_alvo&quot;</span>
Eu sou um alvo<span style="color: #000000; font-weight: bold;">!</span></pre></div></div>

<p style="text-align: justify;">Vou tentar seguir um fluxo que deixe claro o que o procedimento está realizando.</p>
<p style="text-align: justify;">O comportamento da função <em><strong>meu_alvo </strong></em>é muito simples: imprimir <strong><em>&#8220;Eu sou um alvo!&#8221; </em></strong>na tela. Mas o <strong><em>@meu_decorador </em></strong>está lá para complicar a nossa vida <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p style="text-align: justify;">Com a chamada de <em><strong>@meu_decorador </strong></em>logo acima de <em><strong>meu_alvo</strong></em>, fica claro que na verdade estamos passando <strong><em>meu_alvo </em></strong>como um parâmetro (<strong><em>alvo</em></strong>) para o método <strong><em>meu_decorador</em></strong>, encontrado logo no início do arquivo. Note que o método retorna <strong><em>wrapper </em></strong>sem os parênteses no final (que caracterizam uma chamada de função), ele está retornando apenas a referência ao método <strong><em>wrapper</em></strong>, que será de fato &#8220;executado&#8221; externamente.</p>
<p style="text-align: justify;">Dentro da função <strong><em>wrapper </em></strong>temos a impressão da string <em><strong>&#8216;Chamando a funcao &#8220;meu_alvo&#8221;&#8216; </strong></em>e a execução de <em><strong>meu_alvo</strong></em>. Isto deve-se ao fato de que <strong><em>alvo </em></strong>nada mais é que uma referência a função <strong><em>meu_alvo</em></strong>, que passamos como argumento para <strong><em>meu_decorador </em></strong>através do <strong><em>@meu_decorador </em></strong>logo acima da função <strong><em>meu_alvo</em></strong>, certo?</p>
<p style="text-align: justify;">Então resumindo isso tudo, o resultado final é que <strong><em>meu_alvo() </em></strong>no final do arquivo na verdade é a execução da referência a <strong><em>wrapper</em></strong>, ou seja, é o mesmo que ler &#8220;<strong><em>wrapper()</em></strong>&#8220;. Ele fará o <em><strong>print </strong></em>e posteriormente retornará o resultado de <em><strong>meu_alvo</strong></em>, que nada mais é que a impressão de <em><strong>&#8220;Eu sou um alvo!&#8221;</strong></em>.</p>
<p style="text-align: justify;">Bacana não? Aqui vai mais um para deixar as coisas um pouco mais claras&#8230; vamos simular o esquema de roteamento de uma <em>framework Web</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">rotas = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> rota<span style="color: black;">&#40;</span>endereco<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> wrapper<span style="color: black;">&#40;</span>fn<span style="color: black;">&#41;</span>:
        rotas.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>endereco, fn<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> wrapper
&nbsp;
@rota<span style="color: black;">&#40;</span><span style="color: #483d8b;">'/index/'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> home_view<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'Pagina inicial'</span>
&nbsp;
@rota<span style="color: black;">&#40;</span><span style="color: #483d8b;">'/contato/'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> contato_view<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'Pagina de contato'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> rotas<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># Pagina inicial</span>
<span style="color: #ff7700;font-weight:bold;">print</span> rotas<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># Pagina de contato</span>
<span style="color: #ff7700;font-weight:bold;">print</span> rotas          <span style="color: #808080; font-style: italic;"># [('/index/', &lt; function home_view at 0xb736580c &gt;),</span>
                     <span style="color: #808080; font-style: italic;">#  ('/contato/', &lt; function contato_view at 0xb7365b8c &gt;)]</span></pre></div></div>

<h3 style="text-align: justify;">Referências</h3>
<ul style="text-align: justify;">
<li><a title="Walter Cruz em um excelente post sobre Decorators em Python" href="http://devlog.waltercruz.com/python_decorators" target="_blank">Devlog &#8211; @decorators</a></li>
<li><a title="Uma introdução rápida aos decorators em Python. Muito bom!" href="http://www.fiveminutes.eu/a-quick-introduction-to-python-decorators/" target="_blank">Five Minutes &#8211; A quick introduction to Python decorators</a></li>
<li><a title="Padrões de Projetos em Python." href="http://www.python.org/workshops/1997-10/proceedings/savikko.html" target="_blank">Python.org &#8211; Design Patterns in Python</a></li>
<li><a title="Decorators em Python, direto da Wiki oficial do Python" href="http://wiki.python.org/moin/PythonDecorators" target="_blank">Python.org &#8211; Python Decorators</a></li>
<li><a title="Decorators em Python não precisam ser assustadores. Um ótimo artigo." href="http://www.siafoo.net/article/68" target="_blank">Siafoo &#8211; Python Decorators Don&#8217;t Have to be (that) Scary</a></li>
<li><a title="Leia mais na Wikipedia sobre Decorators" href="http://pt.wikipedia.org/wiki/Decorator">Wikipedia &#8211; Decorator</a></li>
</ul>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Decorators em Python" href="http://www.klauslaube.com.br/2011/08/decorators-em-python/" target="_blank">Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/08/decorators-em-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ferramentas de testes em Django &#8211; Parte 2</title>
		<link>http://www.profissionaisti.com.br/2011/08/ferramentas-de-testes-em-django-parte-2/</link>
		<comments>http://www.profissionaisti.com.br/2011/08/ferramentas-de-testes-em-django-parte-2/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 11:14:14 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=18777</guid>
		<description><![CDATA[No post anterior, conhecemos as ferramentas default para construção de testes automatizados em Django. Acontece que você pode &#8220;sair um pouco da caixa&#8221; e usufruir de ferramentas &#8220;third-party&#8220;, que enriquecerão o seu ambiente de desenvolvimento e lhe trarão maior segurança em seus testes de software. splinter &#8211; Testando a sua aplicação com um navegador É [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignleft size-full wp-image-18780" style="margin-left: 5px; margin-right: 5px;" title="boneco-testes" src="http://www.profissionaisti.com.br/wp-content/uploads/2011/08/boneco-testes.jpg" alt="" width="154" height="108" />No <a title="Ferramentas de testes em Django - Parte 1" href="http://www.klauslaube.com.br/2011/07/ferramentas-de-testes-em-django-parte-1/"><em>post </em>anterior</a>, conhecemos as ferramentas <em>default </em>para construção de testes automatizados em <em><a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a></em>. Acontece que você pode &#8220;sair um pouco da caixa&#8221; e usufruir de ferramentas &#8220;<em>third-party</em>&#8220;, que enriquecerão o seu ambiente de desenvolvimento e lhe trarão maior segurança em seus <a title="Leia mais sobre testes" href="http://www.profissionaisti.com.br/tag/testes/">testes de <em>software</em></a>.</p>
<h3 style="text-align: justify;"><em>splinter</em> &#8211; Testando a sua aplicação com um navegador</h3>
<p style="text-align: justify;">É perfeitamente possível criar testes de aceitação em<em> Django </em>com a <em><a title="Testando aplicações web com test client em Django" href="https://docs.djangoproject.com/en/dev/topics/testing/#module-django.test.client">TestClient</a> </em>e <em><a title="Faça parser XML e HTML com lxml" href="http://lxml.de/">lxml</a></em>. Mas vamos ser sinceros, é deveras trabalhoso &#8220;parsear&#8221; os resultados das suas <em>views</em>.</p>
<p style="text-align: justify;">Com a <em><a title="Visite a documentação oficial da Splinter" href="http://splinter.cobrateam.info/">Splinter</a></em>, uma ferramenta para testes de aplicações <em>web</em>, você pode automatizar ações executadas por navegadores, como visitar uma página, preencher um formulário ou clicar em um <em>link</em>; tudo isso sem preocupar-se com <em>parsing</em>, nós, <em>DOM</em>, nem nada do tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> splinter.<span style="color: black;">browser</span> <span style="color: #ff7700;font-weight:bold;">import</span> Browser
browser = Browser<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># Visitar uma URL</span>
url = <span style="color: #483d8b;">&quot;http://search.twitter.com&quot;</span>
browser.<span style="color: black;">visit</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>
browser.<span style="color: black;">fill</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'q'</span>, <span style="color: #483d8b;">&quot;#cobrateam&quot;</span><span style="color: black;">&#41;</span> 
&nbsp;
<span style="color: #808080; font-style: italic;"># Procurar e clicar no botão 'search'</span>
button = browser.<span style="color: black;">find_by_css</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;#searchButton input&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">first</span> 
&nbsp;
<span style="color: #808080; font-style: italic;"># Interagir com os elementos</span>
button.<span style="color: black;">click</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> browser.<span style="color: black;">is_text_present</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;No results for #cobrateam&quot;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;nobody likes us =(&quot;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;we're popular =)&quot;</span></pre></div></div>

<p style="text-align: justify;">O que eu acho mais bacana nesta ferramenta são os seletores, facilitam muito na hora de checar resultados e comportamentos.</p>
<p style="text-align: justify;">A comunidade em volta desta ferramenta está em constante crescimento e atividade. Portanto, caso você queira contribuir com o projeto, vá agora mesmo para o <a title="Repositório da Splinter no GitHub" href="https://github.com/cobrateam/splinter">repositório no <em>GitHub </em>e colabore</a>.</p>
<h3 style="text-align: justify;"><em>nose</em> &#8211; Caçando testes em seu projeto (<em>Python</em>)</h3>
<p style="text-align: justify;">E quando queremos fugir da regra? Aposto que chegará um momento em que a estrutura de diretórios padrão, necessária para a execução dos seus testes em <em>Django</em>, não te satisfará mais. O que fazer neste caso? Simples, recorra ao <em>Nose</em>!</p>
<p style="text-align: justify;">O <em><a title="Nose - is nicer testing for Python" href="http://somethingaboutorange.com/mrl/projects/nose/1.0.0/">Nose</a> </em>estende os recursos da <em>unittest </em>e facilita a escrita e carregamento dos testes em projetos <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a></em>. De uma forma mais detalhada, ele percorre o seu projeto (ou uma determinada região de seu escolha) executando subclasses da <em>unittest.TestCase </em>ou funções que contenham &#8220;<em>test&#8221;</em>. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># test_subclasse.py</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">unittest</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SubclasseTest<span style="color: black;">&#40;</span><span style="color: #dc143c;">unittest</span>.<span style="color: black;">TestCase</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> test_um_eh_verdadeiro<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">assertTrue</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># test_funcao.py</span>
<span style="color: #ff7700;font-weight:bold;">def</span> test_zero_eh_falso<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">assert</span> <span style="color: #ff4500;">0</span> == <span style="color: #008000;">False</span></pre></div></div>

<p style="text-align: justify;">Ao executar o comando <em><strong>nosetests </strong></em>o <em>nose </em>se encarregará de procurar e carregar os testes:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ nosetests
..
<span style="color: #660033;">----------------------------------------------------------------------</span>
Ran <span style="color: #000000;">2</span> tests <span style="color: #000000; font-weight: bold;">in</span> 0.005s
&nbsp;
OK</pre></div></div>

<p style="text-align: justify;">É claro que existe uma &#8220;mágica&#8221; aí. Na verdade o <em>nose </em>pesquisará por arquivos <em>Python </em>com &#8220;<em>test</em>&#8221; em seu nome, por funções com &#8220;<em>test</em>&#8221; em seu enunciado, e por classes<em> </em>com métodos &#8220;<em>test</em>&#8221; em sua declaração. Ele age mesmo como um &#8220;<em>runner</em>&#8220;, tendo a capacidade de lidar com testes escritos com <em>unittest </em>ou não.</p>
<p style="text-align: justify;">Essa é só a ponta do <em>iceberg</em>. É possível construir <em>plugins </em>para o <em>nose</em>, permitindo melhorar ainda mais o seu ambiente de testes (como por exemplo, permitir que o <a title="Conheça o nosepipe" href="http://pypi.python.org/pypi/nosepipe/"><em>nose </em>funcione em <em>subprocess </em>separados</a>).</p>
<p style="text-align: justify;"><strong>Caçando testes em seu projeto (<em>Django</em>)</strong></p>
<p style="text-align: justify;">Para facilitar ainda mais a escrita de testes em <em>Django </em>existem <em>plugins </em>como o <em><a title="Utilize o nose em seus projetos Django" href="http://pypi.python.org/pypi/django-nose">django-nose</a></em>, que permite que você substitua o <em>Test Runner </em>padrão da <em>framework </em>por um específico que utiliza o <em>nose</em>, unindo assim a facilidade e &#8220;<em>add-ons</em>&#8221; do <em>nose </em>com o ambiente de testes do <em>Django</em>.</p>
<h3 style="text-align: justify;"><em>lettuce</em> - <em>BDD</em> em <em>Django</em></h3>
<p style="text-align: justify;">E se você estava se perguntando sobre <em><a title="Leia mais sobre BDD" href="http://www.profissionaisti.com.br/2010/01/bdd-desenvolvimento-orientado-a-comportamento/">BDD</a> </em>em <em>Django</em>, eu apresento a <em><a title="Saiba mais sobre a lettuce" href="http://lettuce.it/intro/overview.html#intro-overview">Lettuce</a></em>!</p>
<p style="text-align: justify;">Esta ferramenta, baseada na <em><a title="Cucumber - Making BDD fun" href="http://cukes.info/">Cucumber</a></em>, permite com que você escreva estórias utilizando linguagem ubíqua, mais próxima da área de negócios do que da área técnica, e automatize a validação delas.</p>
<p style="text-align: justify;">O mais bacana é que ela já vem preparada para o <em>Django</em>, permitindo que a gente execute os testes de comportamento de forma fácil e rápida:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Feature: Rocking with lettuce and django
&nbsp;
    Scenario: Simple Hello World
        Given I access the url &quot;/&quot;
        Then I see the header &quot;Hello World&quot;
&nbsp;
    Scenario: Hello + capitalized name
        Given I access the url &quot;/some-name&quot;
        Then I see the header &quot;Hello Some Name&quot;</pre></div></div>

<p style="text-align: justify;" lang="python">Estória escrita, vamos escrever o <em>script Python </em>que validará se está tudo de acordo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> lettuce <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> lxml <span style="color: #ff7700;font-weight:bold;">import</span> html
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: #dc143c;">test</span>.<span style="color: black;">client</span> <span style="color: #ff7700;font-weight:bold;">import</span> Client
&nbsp;
@before.<span style="color: #008000;">all</span>
<span style="color: #ff7700;font-weight:bold;">def</span> set_browser<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    world.<span style="color: black;">browser</span> = Client<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
@step<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'I access the url &quot;(.*)&quot;'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> access_url<span style="color: black;">&#40;</span>step, url<span style="color: black;">&#41;</span>:
    response = world.<span style="color: black;">browser</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>
    world.<span style="color: black;">dom</span> = html.<span style="color: black;">fromstring</span><span style="color: black;">&#40;</span>response.<span style="color: black;">content</span><span style="color: black;">&#41;</span>
&nbsp;
@step<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'I see the header &quot;(.*)&quot;'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> see_header<span style="color: black;">&#40;</span>step, text<span style="color: black;">&#41;</span>:
    header = world.<span style="color: black;">dom</span>.<span style="color: black;">cssselect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'h1'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">assert</span> header.<span style="color: black;">text</span> == text</pre></div></div>

<p style="text-align: justify;">Basta executá-lo da seguinte maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ python manage.py harvest</pre></div></div>

<p style="text-align: justify;"><a title="Django + Lettuce, uma dupla interessante!" href="http://lettuce.it/recipes/django-lxml.html#recipes-django-lxml">Confira mais informações sobre como utilizar o <em>lettuce </em>com <em>Django</em></a>.</p>
<h3 style="text-align: justify;"><em>fudge</em> &#8211; Ajude o <em>Python </em>a mentir</h3>
<p style="text-align: justify;">O <em><a title="Fudge, criando objetos mentirosos" href="http://farmdev.com/projects/fudge/">Fudge</a></em> é um módulo <em>Python </em>que auxilia na construção de objetos &#8220;dublês&#8221; (<a title="Mocks não são Stubs" href="http://www.infoq.com/br/articles/mocks-Arent-Stubs"><em>mocks </em>e <em>stubs</em></a>), que permitem escrever testes sem necessariamente possuir um serviço ativo ou um objeto construído.</p>
<p style="text-align: justify;">Um caso comum: Você está construindo uma <em>API </em>que autentica via <em>OAuth </em>ao<em> Twitter </em>e está utilizando testes para guiar o seu desenvolvimento. Não é interessante que nossos testes sejam dependentes da disponibilidade do serviço do <em>Twitter</em>, portanto, escrevemos um &#8220;objeto mentiroso&#8221;, que simulará este serviço, aceitando uma entrada e gerando um saída:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> fudge
@fudge.<span style="color: black;">patch</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'oauthtwitter.OAuthApi'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #dc143c;">test</span><span style="color: black;">&#40;</span>FakeOAuthApi<span style="color: black;">&#41;</span>:
        <span style="color: black;">&#40;</span>FakeOAuthApi.<span style="color: black;">expects_call</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            .<span style="color: black;">with_args</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>, <span style="color: #483d8b;">''</span>,
                         <span style="color: #483d8b;">''</span>, <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>
            .<span style="color: black;">returns_fake</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            .<span style="color: black;">expects</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'UpdateStatus'</span><span style="color: black;">&#41;</span>.<span style="color: black;">with_arg_count</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
post_msg_to_twitter<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;hey there fellow testing freaks!&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Pronto! Sabendo que valores serão passados, e quais os resultados, podemos simular o comportamento daquele serviço. Prático, não?</p>
<h3 style="text-align: justify;">Considerações finais</h3>
<p style="text-align: justify;">Estas são as ferramentas que eu costumo utilizar em meus projetos <em>Python/Django</em>. É claro que existem outras, na verdade existem várias. Tenha em mente que a ferramenta é apenas um meio de garantir, através de testes, que você está guiando a sua aplicação para o lugar certo. Os testes automatizados no final servem para garantir que ela ainda segue este caminho, que contribuições realizadas tardiamente não &#8220;quebraram&#8221; o comportamento que você escreveu no início do desenvolvimento.</p>
<p style="text-align: justify;">Tenho a intenção de escrever um <em>post </em>mais prático sobre testes e <em>Django</em>. Fiquem no aguardo <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">E você? Tem alguma ferramenta para recomendar? Utilize os comentários abaixo para compartilhá-la.</p>
<h3 style="text-align: justify;">Referências</h3>
<ul style="text-align: justify;">
<li><em><a title="Leia sobre Django, BDD, Lettuce e Splinter" href="http://cilliano.com/blog/2011/02/07/django-bdd-with-lettuce-and-splinter/" target="_blank">CillianO &#8211; Django Full Stack Testing and BDD with Lettuce and Splinter</a></em></li>
<li><em><a title="Não sabe o que é BDD? Conheça neste artigo de Danilo Sato" href="http://www.dtsato.com/blog/work/introduzindo_desenvolvimento_orientado_comportamento_bdd/">Danilo Sato &#8211; Introduzindo Desenvolvimento Orientado por Comportamento (BDD)</a></em></li>
<li><em><a title="Visite o repositório do django-nose no GitHub" href="https://github.com/jbalogh/django-nose">django-nose &#8211; GitHub repository</a></em></li>
<li><em><a title="Documentação oficial do Fudge" href="http://farmdev.com/projects/fudge/using-fudge.html#fudging-a-web-service">Fudge &#8211; Using Fudge</a></em></li>
<li><em><a title="Testes em Python passam a ser mais fáceis com nose" href="http://jpz-log.info/archives/2010/06/08/nose-testing-in-python-made-easy/">JPz&#8217;log &#8211; nose: Testing in Python made easy</a></em></li>
<li><em><a title="Aprenda a escrever testes Python com o Nose" href="http://somethingaboutorange.com/mrl/projects/nose/1.0.0/writing_tests.html">Nose &#8211; Writing tests</a></em></li>
<li><em><a title="Conheça o projeto Splinter, e envolva-se" href="http://splinter.cobrateam.info/">Splinter &#8211; Test framework for web applications</a></em></li>
</ul>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Ferramentas de testes em Django - Parte 2" href="http://www.klauslaube.com.br/2011/07/ferramentas-de-testes-em-django-parte-2/" target="_blank">Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/08/ferramentas-de-testes-em-django-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ferramentas de testes em Django &#8211; Parte 1</title>
		<link>http://www.profissionaisti.com.br/2011/08/ferramentas-de-testes-em-django-parte-1/</link>
		<comments>http://www.profissionaisti.com.br/2011/08/ferramentas-de-testes-em-django-parte-1/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 15:44:55 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=18776</guid>
		<description><![CDATA[Dando continuidade à série de posts sobre Django, vou indicar algumas ferramentas de testes para que você também possa deixar com que os testes guiem o desenvolvimento de suas aplicações. Afinal, testar é preciso &#160; Testar em Django é possível? Sem dúvida nenhuma! Mas não espere que o framework adeque-se a você, você precisa ter [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignleft size-full wp-image-18779" style="margin-left: 5px; margin-right: 5px;" title="gm_test_500_2-300x189" src="http://www.profissionaisti.com.br/wp-content/uploads/2011/08/gm_test_500_2-300x189.jpg" alt="" width="180" height="113" />Dando continuidade à série de <em>posts </em>sobre <em><a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a></em>, vou indicar algumas ferramentas<em> </em>de testes para que você também possa deixar com que os <a title="TDD: Desenvolvimento Orientado a Testes" href="http://www.profissionaisti.com.br/2009/11/tdd-desenvolvimento-orientado-a-testes/">testes guiem o desenvolvimento de suas aplicações</a>.</p>
<p style="text-align: justify;">Afinal, testar é preciso <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">&nbsp;</p>
<h3 style="text-align: justify;">Testar em <em>Django</em> é possível?</h3>
<p style="text-align: justify;">Sem dúvida nenhuma! Mas não espere que o <em>framework </em>adeque-se a você, você precisa ter a iniciativa de tentar compreender as melhores maneiras para escrever testes em <em>Django</em>.</p>
<p style="text-align: justify;">Por exemplo, se você tem por hábito isolar os modelos para <a title="Leia mais sobre testes" href="http://www.profissionaisti.com.br/tag/testes/">testá-los</a> de forma unitária, pode passar por certa dor de cabeça com o <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a></em>/<em><a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a></em>. Não que seja impossível, mas o comportamento <em>default </em>do <em>framework</em> é criar uma base de dados &#8220;<em>fake</em>&#8221; para você não precisar ter este trabalho.</p>
<p style="text-align: justify;">Enfim, talvez a forma de <strong>utilizar</strong> estas ferramentas <strong>caiba em um outro <em>post</em></strong>, o objetivo deste é <strong>apenas apresentá-las</strong>.</p>
<h3 style="text-align: justify;"><em>unittest</em> &#8211; Testando unidades através de classes</h3>
<p style="text-align: justify;">A <em><a title="unittest — Unit testing framework" href="http://docs.python.org/library/unittest.html" target="_blank">unittest</a> </em>é uma biblioteca padrão do <em>Python </em>que ajuda (e muito) a escrever testes automatizados com a linguagem.</p>
<p style="text-align: justify;">Os testes são escritos através de classes, onde utilizamos os esquemas de <em><a title="Veja a lista de asserts da unittest" href="http://docs.python.org/library/unittest.html#assert-methods" target="_blank">assertions</a></em> para garantir o comportamento do código testado (nenhuma novidade até aqui). Para quem utiliza testes unitários no <em>Java</em> não vai sentir grandes mudanças na abordagem, já que a <em>unittest </em>é inspirada na <em><a title="Leia mais sobre a JUnit" href="http://javafree.uol.com.br/wiki/JUnit" target="_blank">JUnit</a></em><em> </em>(sendo muitas vezes até chamada de <em>PyUnit</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">unittest</span>
<span style="color: #ff7700;font-weight:bold;">from</span> myapp.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Animal
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> AnimalTestCase<span style="color: black;">&#40;</span><span style="color: #dc143c;">unittest</span>.<span style="color: black;">TestCase</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">lion</span> = Animal.<span style="color: black;">objects</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>name=<span style="color: #483d8b;">&quot;lion&quot;</span>, sound=<span style="color: #483d8b;">&quot;roar&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cat</span> = Animal.<span style="color: black;">objects</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>name=<span style="color: #483d8b;">&quot;cat&quot;</span>, sound=<span style="color: #483d8b;">&quot;meow&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> testSpeaking<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEquals</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">lion</span>.<span style="color: black;">speak</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'The lion says &quot;roar&quot;'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEquals</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cat</span>.<span style="color: black;">speak</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'The cat says &quot;meow&quot;'</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">O <em>test runner</em> padrão do <em>Django</em> irá procurar por subclasses de <em>unittest.TestCase </em>nos arquivos <em>models.py </em>e <em>tests.py</em>. A suíte de testes tenta facilitar ao máximo a sua vida&#8230; execute a seguinte instrução e confira se a sua aplicação está <em>ok </em>ou não:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ python manage.py <span style="color: #7a0874; font-weight: bold;">test</span></pre></div></div>

<p style="text-align: justify;"><strong>Peraí que não acabou! Apresentando a <em>TestCase</em></strong></p>
<p style="text-align: justify;">Testar aplicações <em>Web </em>com a<em> unittest </em>pode ser dureza. Pensando nisso o <em>Django </em>disponibiliza a <em>TestCase</em>, que estende a <em>unittest</em> adicionando funcionalidades como carregamento de <em>fixtures</em>, roteamento de <em>urls </em>e um <em>client</em> para fazer requisições <em>Web </em>e testar as suas <em>views </em>(o <em>TestClient</em>, detalhado mais abaixo).</p>
<h3 style="text-align: justify;"><em>doctest</em> &#8211; Testando através de <em>docstrings</em></h3>
<p style="text-align: justify;">Admito que escrever documentação de <em>software </em>não é o meu forte&#8230; mas com <em>doctests </em>pode-se documentar métodos ao mesmo tempo em que escreve-se testes!</p>
<p style="text-align: justify;">A <em><a title="Leia mais sobre a doctest" href="http://docs.python.org/library/doctest.html" target="_blank">doctest</a> </em>é uma biblioteca padrão do <em>Python </em>que procura e interpreta <em>docstrings </em>na aplicação. A sintaxe nesses trechos de <em><a title="Entenda o que é uma docstring" href="http://www.python.org/dev/peps/pep-0257/">docstrings</a> </em>é diferenciada, simulando um interpretador interativo do <em>Python</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># models.py</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Animal<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    An animal that knows how to make noise
&nbsp;
    # Create some animals
    &gt;&gt;&gt; lion = Animal.objects.create(name=&quot;lion&quot;, sound=&quot;roar&quot;)
    &gt;&gt;&gt; cat = Animal.objects.create(name=&quot;cat&quot;, sound=&quot;meow&quot;)
&nbsp;
    # Make 'em speak
    &gt;&gt;&gt; lion.speak()
    'The lion says &quot;roar&quot;'
    &gt;&gt;&gt; cat.speak()
    'The cat says &quot;meow&quot;'
    &quot;&quot;&quot;</span>
    name = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">20</span><span style="color: black;">&#41;</span>
    sound = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">20</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> speak<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'The %s says &quot;%s&quot;'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">name</span>, <span style="color: #008000;">self</span>.<span style="color: black;">sound</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Assim como com a <em>unittest</em>, o <em>test runner </em>padrão do <em>Django </em>procurará por ocorrências de <em>docstests </em>em <em>models.py </em>e <em>tests.py</em>.</p>
<h3 style="text-align: justify;"><em>Django Test Client</em> &#8211; Testando a sua aplicação como se fosse um navegador</h3>
<p style="text-align: justify;">E como fazer para testar requisições <em>Web</em>? Por exemplo, você não quer testar a sua <em>view </em>de forma isolada, quer testar desde a parte de roteamento ao comportamento com o banco de dados, como se você se estivesse realmente visitando a página. Neste caso entra a <em><a title="Testando aplicações Django com requisições Web falsas" href="https://docs.djangoproject.com/en/dev/topics/testing/#module-django.test.client">test client</a></em>.</p>
<p style="text-align: justify;">Toda a classe <em>TestCase </em>possui uma instância da <em>Django Test Client</em>. Então escrever testes com requisições à sua aplicação fica muito simples utilizando classes:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: #dc143c;">test</span> <span style="color: #ff7700;font-weight:bold;">import</span> TestCase
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SimpleTest<span style="color: black;">&#40;</span>TestCase<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> test_details<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        response = <span style="color: #008000;">self</span>.<span style="color: black;">client</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/customer/details/'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>response.<span style="color: black;">status_code</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_index<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        response = <span style="color: #008000;">self</span>.<span style="color: black;">client</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/customer/index/'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>response.<span style="color: black;">status_code</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">É perfeitamente possível utilizar a <em>test client </em>em <em>doctests </em>também:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;
&gt;&gt;&gt; from django.test.client import Client
&gt;&gt;&gt; c = Client()
&gt;&gt;&gt; response = c.post('/login/', {'username': 'john',
...        'password': 'smith'})
&gt;&gt;&gt; response.status_code
200
&quot;&quot;&quot;</span></pre></div></div>

<h3 style="text-align: justify;">Considerações finais</h3>
<p style="text-align: justify;">Particularmente, tive a oportunidade de implementar testes unitários já no início do meu aprendizado em <em>Django</em>. Deixar os testes te guiarem é uma prática excelente!</p>
<p style="text-align: justify;">Tudo parte do bom senso, óbvio. Nenhum processo ou ferramenta deveria substituir o &#8220;<em>feeling</em>&#8221; do profissional&#8230; também não é muito sadio ser extremamente &#8220;<em>by the book</em>&#8220;. Mas se puder utilizar testes para guiar o seu desenvolvimento, use-os!</p>
<p style="text-align: justify;">Na segunda parte deste <em>post</em> pretendo apresentar algumas ferramentas que irão turbinar ainda mais o seu desenvolvimento orientado a testes.</p>
<p style="text-align: justify;">Até lá!</p>
<h3 style="text-align: justify;">Referências</h3>
<ul style="text-align: justify;">
<li><a title="Leia direto da fonte como escrever testes em Django" href="https://docs.djangoproject.com/en/1.1/topics/testing/#writing-unit-tests"><em>Django Documentation &#8211; Writing unit tests</em></a></li>
<li><a title="Leia direto da fonte sobre como escrever testes com docstrings" href="https://docs.djangoproject.com/en/1.1/topics/testing/#writing-doctests"><em>Django Documentation &#8211; Writing doctests</em></a></li>
<li><em><a title="Entenda a diferença entre unittest do Python e o TestCase do Django" href="https://docs.djangoproject.com/en/1.1/topics/testing/#testcase">Django Documentation &#8211; TestCase</a></em></li>
<li><em><a title="Leia sobre a unittest direto da documentação do Python" href="http://docs.python.org/library/unittest.html">Python Documentation &#8211; unittest: Unit testing framework</a></em></li>
<li><em><a title="Aprenda a testar a sua primeira aplicação em Django" href="http://dougalmatthews.com/articles/2010/jan/20/testing-your-first-django-app/">Dougal Matthews &#8211; Testing your first Django app</a></em></li>
<li><a title="O Konrad apresenta algumas ferramentas muito boas para testes com Django" href="&amp; kokoko.fluxionary.net/testing-django-part-1-nose"><em>Konrad&#8217;s Kode, Konfigs &amp; Konstructions &#8211; Testing Django</em></a></li>
<li><a title="Aprenda Django de uma forma divertida com o Marinho" href="http://www.marinhobrandao.com/blog/programacao-dirigida-a-testes-no-django/">Marinho Brandão &#8211; Programação dirigida a testes no <em>Django</em></a></li>
</ul>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Ferramentas de testes em Django - Parte 1" href="http://www.klauslaube.com.br/2011/07/ferramentas-de-testes-em-django-parte-1/" target="_blank">Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/08/ferramentas-de-testes-em-django-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python/Django: Quando usar gettext e gettext_lazy?</title>
		<link>http://www.profissionaisti.com.br/2011/06/pythondjango-quando-usar-gettext-e-gettext_lazy/</link>
		<comments>http://www.profissionaisti.com.br/2011/06/pythondjango-quando-usar-gettext-e-gettext_lazy/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 16:00:07 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Papinho de TI]]></category>
		<category><![CDATA[Dica]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=17349</guid>
		<description><![CDATA[Olá pessoas! Para vocês que desenvolvem em Python e Django preocupando-se com internacionalização, já devem ter feito a seguinte pergunta: Quando usar gettext e gettext_lazy? Acredito que antes de responder esta pergunta, temos que responder outra questão pertinente: Devo utilizar gettext ou ugettext? gettext vs ugettext Essas duas funções seguem o mesmo princípio dos métodos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Olá pessoas!</p>
<p style="text-align: justify;">Para vocês que desenvolvem em <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a> </em>e<em> <a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a> </em>preocupando-se com internacionalização, já devem ter feito a seguinte pergunta: <em>Quando usar gettext e gettext_lazy? </em></p>
<p style="text-align: justify;">Acredito que antes de responder esta pergunta, temos que responder outra questão pertinente: <em>Devo utilizar gettext ou ugettext?<br />
</em></p>
<h3 style="text-align: justify;"><em>gettext </em>vs <em>ugettext</em></h3>
<p style="text-align: justify;">Essas duas funções seguem o mesmo princípio dos métodos mágicos <em>__str__ </em>e <em>__unicode__</em>. Onde <em>gettext </em>retornará um texto traduzido como uma <em>string </em>&#8220;comum&#8221;, e <em>ugettext </em>retornará um texto traduzido como uma <em>string Unicode</em>.</p>
<p style="text-align: justify;">Como nosso idioma nativo abusa do uso de caracteres especiais, aconselho sempre que possível a utilização do <em>ugettext</em>. Na verdade, é uma forma de garantir sucesso na tradução de qualquer idioma sem quebrar a cabeça com <em>encoding</em> (já que o <em>Unicode </em>tem uma ampla tabela  de caracteres).</p>
<p style="text-align: justify;">Além disso, passe a mensagem como <em>Unicode </em>para a função sempre que necessário:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">texto_traduzido = ugettext<span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'Descrição do produto em estoque'</span><span style="color: black;">&#41;</span></pre></div></div>

<h3 style="text-align: justify;"><em>ugettext </em>vs <em>ugettext_lazy</em></h3>
<p style="text-align: justify;">A principal diferença entre <em>ugettext </em>e <em>ugettext_lazy </em>é que o último é literalmente um preguiçoso. Ele faz uma referência para a <em>string </em>(e não necessariamente para a tradução), fazendo com que a operação seja executada apenas quando a renderização da <em>string </em>é necessária (ao contrário de <em>ugettext </em>que é processado assim que a expressão é interpretada).</p>
<p style="text-align: justify;">Confuso? Talvez o <em><a title="Aprendendo Django no Planeta Terra - O mesmo site em vários idiomas" href="http://www.aprendendodjango.com/o-mesmo-site-em-varios-idiomas/" target="_blank">Marinho Brandão</a> </em>possa ser mais claro:</p>
<pre>A função <strong>"ugettext_lazy()"</strong> é <strong>preguiçosa</strong>. Isso significa que a 
tradução é feita somente quando ela é requisitada, o que é
relativamente melhor para o caso de classes de modelo, pois elas
são constantemente utilizadas sem que a tradução de um termo seja
necessário de fato.

Por outro lado a função <strong>"ugettext()"</strong> traduz a string
instantaneamente, o que é melhor para casos como o de formulários
dinâmicos e <em>views</em>, pois eles não são usados de maneira tão constante
quanto classes de modelo.</pre>
<p style="text-align: justify;">Então&#8230; utilize <em>ugettext_lazy </em>nos campos e meta-informações dos modelos (onde a tradução pode ser feita sob demanda), e <em>ugettext </em>em métodos, funções e <em>views </em>(onde a tradução tem quer ser &#8220;instantânea&#8221;).</p>
<h3 style="text-align: justify;">Referências</h3>
<ul style="text-align: justify;">
<li><em><a title="gettext - Multilingual internationalization services" href="http://docs.python.org/library/gettext.html" target="_blank">Python Documentation &#8211; gettext</a></em></li>
<li><em><a title="Django Docs - Lazy Translation" href="https://docs.djangoproject.com/en/dev/topics/i18n/internationalization/#lazy-translation" target="_blank">Django Documentation &#8211; Internationalization</a></em></li>
<li><em><a title="The Django Book - i18n" href="http://www.djangobook.com/en/1.0/chapter18/" target="_blank">The Django Book &#8211; Internationalization</a></em></li>
<li><a title="Aprendendo Django - O mesmo site em vários idiomas" href="http://www.aprendendodjango.com/o-mesmo-site-em-varios-idiomas/" target="_blank">Aprendendo <em>Django </em>no Planeta Terra &#8211; O mesmo site em vários idiomas</a></li>
</ul>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Quando usar gettext e gettext_lazy?" href="http://www.klauslaube.com.br/2011/06/quando-usar-gettext-gettext_lazy/">Blog Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/06/pythondjango-quando-usar-gettext-e-gettext_lazy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Afinal, o que são Closures?</title>
		<link>http://www.profissionaisti.com.br/2011/06/afinal-o-que-sao-closures/</link>
		<comments>http://www.profissionaisti.com.br/2011/06/afinal-o-que-sao-closures/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 17:27:21 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Closures]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=17348</guid>
		<description><![CDATA[Olá pessoas! Sabem aqueles conceitos, que a gente sempre utiliza e chega alguém com um nome &#8220;pomposo&#8221; para a parada (que você nunca ouviu falar)? Isso aconteceu comigo com closures. What (the hell) are closures? Entendi o conceito de closures enquanto estudava Ruby. Na verdade, fica a dica&#8230; se você quer aprender Orientação a Objetos, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Olá pessoas!</p>
<p style="text-align: justify;">Sabem aqueles conceitos, que a gente sempre utiliza e chega alguém com um nome &#8220;pomposo&#8221; para a parada (que você nunca ouviu falar)? Isso aconteceu comigo com <em>closures</em>.</p>
<h3 style="text-align: justify;">What (the hell) are closures?</h3>
<p style="text-align: justify;">Entendi o conceito de <em>closures </em>enquanto estudava <em>Ruby</em>. Na verdade, fica a dica&#8230; se você quer aprender Orientação a Objetos, aprenda linguagens dinâmicas como <em>Ruby</em>, <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a></em> e até mesmo <em><a title="Leia mais sobre PHP" href="http://www.profissionaisti.com.br/tag/php/">PHP</a></em>. Depois parta para linguagens mais &#8220;<em>hardcore</em>&#8221; como <em>Java </em>e <em>C++</em>.</p>
<p style="text-align: justify;">Vamos deixar a <em><a title="Leia sobre closure no Wikipedia" href="http://pt.wikipedia.org/wiki/Closure" target="_blank">Wikipedia</a> </em>nos explicar o que é uma <em>closure</em>:</p>
<blockquote><p>Uma closure ocorre normalmente quando uma função é declarada dentro do corpo de outra, e a função interior referencia variáveis locais da função exterior. Em tempo de execução, quando a função exterior é executada, então uma closure é formada, que consiste do código da função interior e referências para quaisquer variáveis no escopo da função exterior que a closure necessita.</p></blockquote>
<p style="text-align: justify;">Ok&#8230; sou a favor das pessoas que dizem que é difícil compreender alguns conceitos apenas por parágrafos formados por palavras bem escritas.  Vamos ao exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> digaSeuNome <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> nome <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> msg <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Olá &quot;</span> <span style="color: #339933;">+</span> nome <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;. Seja bem-vindo!&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> exibeMensagem <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span> msg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    exibeMensagem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
digaSeuNome<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;João&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #006600; font-style: italic;">// Olá João. Seja bem-vindo!</span></pre></div></div>

<p style="text-align: justify;">Temos uma função definida dentro de outra função. A função interna utiliza de parâmetros e variáveis da função externa&#8230;  basicamente, este é o conceito de <em>closure</em>.</p>
<p style="text-align: justify;">Não achou muito útil? Dê uma olhada no exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> FabricaDeUsuarios <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> id <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> criaUsuario <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> nome <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        id<span style="color: #339933;">++;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
            id<span style="color: #339933;">:</span> id<span style="color: #339933;">,</span>
            nome<span style="color: #339933;">:</span> nome
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">return</span> criaUsuario<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> novoUsuario <span style="color: #339933;">=</span> FabricaDeUsuarios<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> joao <span style="color: #339933;">=</span> novoUsuario<span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;João&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> jose <span style="color: #339933;">=</span> novoUsuario<span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;José&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>joao.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #006600; font-style: italic;">// 1</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>jose.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #006600; font-style: italic;">// 2</span></pre></div></div>

<p style="text-align: justify;">Utilizamos o conceito de <em>closure</em> no exemplo acima. Abusamos do contexto da linguagem, onde, mesmo que estejamos &#8220;chamando&#8221; a função fora do escopo de <em>FabricaDeUsuarios</em>, na verdade <em>novoUsuario </em>trata-se de uma referência a função <em>criaUsuario</em>. Logo, ainda estaremos utilizando os recursos do contexto de <em>FabricaDeUsuarios</em>.</p>
<h3 style="text-align: justify;">Referências</h3>
<ul style="text-align: justify;">
<li><em><a title="Alguns exemplos de closures com Javascript" href="http://www.javascriptkit.com/javatutors/closures.shtml" target="_blank">Javascript Closures &#8211; They&#8217;re not magic</a></em></li>
<li><em><a title="Leia sobre Closures em Javascript" href="http://blog.morrisjohns.com/javascript_closures_for_dummies">Morris Johns &#8211; Javascript Closures for Dummies</a></em></li>
<li><em><a title="Leia sobre Closures no guia Javascript da Mozilla" href="https://developer.mozilla.org/en/JavaScript/Guide/Closures">Mozilla Developer Network &#8211; Closures</a></em></li>
<li><a title="Closures em Ruby" href="http://devlog.waltercruz.com/closures">Walter Cruz &#8211; <em>Closures</em></a></li>
</ul>
<p style="text-align: justify;">E você&#8230; tem algum exemplo bacana sobre <em>closures</em>? Não deixe de comentar.</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Afinal, o que são Closures?" href="http://www.klauslaube.com.br/2011/05/afinal-sao-closures/" target="_blank">Blog Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/06/afinal-o-que-sao-closures/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como versionar projetos Django com o Mercurial &#8211; Parte 3</title>
		<link>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-3/</link>
		<comments>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-3/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 16:26:53 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[Versionamento]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=17408</guid>
		<description><![CDATA[Olá pessoas! Dando continuidade a micro-série &#8220;Como versionar projetos Django com o Mercurial&#8221; (confira a parte 1 e a parte 2), vamos finalizar com um exemplo prático de um projeto Django usando o  Mercurial. Começando&#8230; Vamos reutilizar a estrutura dos posts anteriores. Para isso, inicie um projeto com o virtualenv: $ cd ~/Projetos/ $ virtualenv DjangoComHG [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Olá pessoas!</p>
<p style="text-align: justify;">Dando continuidade a micro-série &#8220;<em>Como versionar projetos Django com o Mercurial</em>&#8221; (confira a <a title="Como versionar projetos Django com o Mercurial - Parte 1" href="http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-1/">parte 1</a> e a <a title="Como versionar projetos Django com o Mercurial - Parte 2" href="http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-2/">parte 2</a>), vamos finalizar com um exemplo prático de um projeto <em><a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a> </em>usando o  <em><a title="Leia mais sobre Mercurial" href="http://www.profissionaisti.com.br/tag/mercurial/">Mercurial</a></em>.</p>
<h2 style="text-align: justify;">Começando&#8230;</h2>
<p style="text-align: justify;">Vamos reutilizar a estrutura dos <em>posts </em>anteriores. Para isso, inicie um projeto com o <em>virtualenv</em>:</p>
<pre>$ cd ~/Projetos/
$ virtualenv DjangoComHG --no-site-packages
$ cd DjangoComHG/</pre>
<p style="text-align: justify;">Vamos aproveitar os procedimentos descritos na <a title="Aprenda a como criar um repositório Mercurial no Bitbucket" href="http://www.klauslaube.com.br/2011/05/como-versionar-projetos-django-mercurial-%E2%80%93-parte-2/">parte 2</a> deste <em>post</em>. Caso você ainda não tenha criado um repositório no <em><a title="Versione e compartilhe código com o Mercurial" href="http://www.bitbucket.org/">Bitbucket</a></em>, essa é uma boa oportunidade.</p>
<pre style="text-align: left;"><span style="color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace; font-size: 15px; line-height: 21px; white-space: pre;">$ hg clone &lt;caminho&gt; django_com_hg
</span></pre>
<p style="text-align: justify;">Não esqueça de mudar o <strong>caminho</strong> para o <strong>endereço do seu repositório</strong>.</p>
<h2 style="text-align: justify;">Instalando o <em>Django</em></h2>
<p style="text-align: justify;">Com o <em>virtualenv </em>ativado, vamos instalar o <em>Django </em>apenas para o nosso ambiente virtual através do <em>pip</em>:</p>
<pre>$ source bin/activate
$ pip install django</pre>
<p style="text-align: justify;">Só para ter certeza que ele instalou o <em>Django </em>dentro do nosso ambiente virtual, vamos abrir o terminal do <em>Python </em>e digitar as seguintes instruções:</p>
<pre>$ import django
$ django.__path__</pre>
<p style="text-align: justify;">Você deverá obter como resposta uma <em>string </em>semelhante a esta:</p>
<pre>$HOME/Projetos/DjangoComHG/lib/python2.6/site-packages/django/</pre>
<h2 style="text-align: justify;">Iniciando um projeto</h2>
<p style="text-align: justify;">Vamos fazer uma pequena brincadeira de troca de nomes de pastas, para que possamos criar o nosso projeto <em>Django </em>com o mesmo nome do repositório <em>Mercurial</em>:</p>
<pre>$ mv post_django_com_hg post_django_com_hg.bk</pre>
<p style="text-align: justify;">Agora mandamos o <em>django-admin.py</em> iniciar o projeto:</p>
<pre>$ django-admin.py startproject post_django_com_hg</pre>
<p style="text-align: justify;">Movemos os arquivos do nosso repositório para dentro de <em>post_django_com_hg</em>:</p>
<pre>$ mv post_django_com_hg.bk/* post_django_com_hg/
$ mv post_django_com_hg.bk/.hg post_django_com_hg/
$ mv post_django_com_hg.bk/.hgignore post_django_com_hg/</pre>
<p style="text-align: justify;">Entre no diretório <em>post_django_com_hg </em>e dê um <em><strong>hg status</strong></em>. Os arquivos base do <em>Django </em>não estão no projeto. Vamos adicioná-los, comitá-los e dar um <strong><em>push </em></strong>deles para o repositório <em>Mercurial </em>no <em>Bitbucket</em>:</p>
<pre>$ hg add .
$ hg commit -m "Projeto Django iniciado"
$ hg push</pre>
<p style="text-align: justify;">Nos <em>changesets </em>do repositório, veremos a contribuição enviada:</p>
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_17409" class="wp-caption aligncenter" style="width: 602px;">
<dt class="wp-caption-dt"><a href="http://www.profissionaisti.com.br/wp-content/uploads/2011/06/post-django-hg-bitbucket-changeset.png"><img class="size-full wp-image-17409 " title="post-django-hg-bitbucket-changeset" src="http://www.profissionaisti.com.br/wp-content/uploads/2011/06/post-django-hg-bitbucket-changeset.png" alt="" width="592" height="174" /></a></dt>
<dd class="wp-caption-dd">Changeset no Bitbucket</dd>
</dl>
</div>
<p style="text-align: justify;">Pronto! Basicamente, para termos o <em>Mercurial </em>versionando um projeto <em>Django</em>, são estes os procedimentos&#8230; mas eu sei como deixar a coisa ainda mais interessante <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2 style="text-align: justify;">Hora de congelar!</h2>
<p style="text-align: justify;">Digamos que você tenha um colaborador envolvido com o projeto. Quer dizer que ele vai ter que criar um <em>virtualenv</em>, clonar o repositório e instalar as dependências do projeto? A resposta é &#8220;sim&#8221; &#8211; Mas podemos facilitar esta última parte através do <em>pip</em>:</p>
<pre>$ pip freeze
Django==1.3
wsgiref==0.1.2</pre>
<p style="text-align: justify;">O comando <em><strong>pip freeze </strong></em>vai coletar os pacotes <em>Python </em>instalados (nesse nosso caso, dentro do nosso ambiente virtual através do <em>virtualenv</em>) e exibir para a gente em formato de lista. Com isso, podemos criar um arquivo que armazene as dependências do nosso projeto:</p>
<pre>$ pip freeze &gt; requirements.txt</pre>
<p style="text-align: justify;">Vamos desativar o ambiente atual, criar um novo e instalar as dependências listadas nesta arquivo <strong><em>requirements.txt </em></strong>neste novo ambiente:</p>
<pre>$ deactivate
$ cd ~/Projetos/
$ virtualenv DjangoComHG-2 --no-site-packages
$ source DjangoComHG-2/bin/activate
$ pip install -r DjangoComHG/post_django_com_hg/requirements.txt</pre>
<p style="text-align: justify;">Veja a mágica acontecendo&#8230; o <em>pip </em>instalará todas as dependências contidas em<strong><em> requirements.txt </em></strong>em nosso novo ambiente virtual.</p>
<p style="text-align: justify;">Podemos resumir os comandos acima em:</p>
<pre>$ pip install -E DjangoComHG-2 -r DjangoComHG/post_django_com_hg/requirements.txt</pre>
<p style="text-align: justify;"><span style="font-size: 20px; font-weight: bold;">Versionando dependências do projeto</span></p>
<p style="text-align: justify;">Logo o <strong><em>requirements.txt </em></strong>sendo um arquivo de texto, pode ser facilmente versionado pelo <em>Mercurial</em>:</p>
<pre>$ cd ~/Projetos/DjangoComHG/post_django_com_hg
$ hg add requirements.txt
$ hg commit -m "Adicionado arquivo de dependências do pip"
$ hg push</pre>
<p style="text-align: justify;">Finalmente, temos um <a title="Confira o exemplo deste post no Bitbucket" href="https://bitbucket.org/kplaube/post-django-com-hg/" target="_blank">projeto <em>Django </em>versionado com <em>Mercurial</em>, disponível no <em>Bitbucket</em></a>, e com dependências facilmente gerenciáveis através do <em>pip </em>em conjunto com o <em>virtualenv</em>.</p>
<p style="text-align: justify;">E você&#8230; utiliza controle de versão com o <em>Django </em>de uma outra forma? Conte-nos através dos comentários abaixo.</p>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Como versionar projetos Django com o Mercurial - Parte 3" href="http://www.klauslaube.com.br/2011/06/como-versionar-projetos-django-mercurial-parte-3/" target="_blank">Blog Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como versionar projetos Django com o Mercurial &#8211; Parte 2</title>
		<link>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-2/</link>
		<comments>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-2/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 13:18:10 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[Versionamento]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=17346</guid>
		<description><![CDATA[Dando continuidade ao post Como versionar projetos Django com o Mercurial, vamos dar uma pincelada nos funcionamentos básicos do Mercurial. hg? Mas não era Mercurial? Mercury em português significa mercúrio (nenhuma novidade até aqui), que é um elemento químico com o símbolo Hg e o número atômico 80 (assim disse a Wikipedia (:  ).  É [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dando continuidade ao post <em><a title="Leia a primeira parte deste post" href="http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-1/">Como versionar projetos Django com o Mercurial</a></em>, vamos dar uma pincelada nos funcionamentos básicos do <em>Mercurial</em>.</p>
<h2 style="text-align: justify;"><em>hg</em>? Mas não era <em>Mercurial</em>?</h2>
<p style="text-align: justify;"><em>Mercury </em>em português significa mercúrio (nenhuma novidade até aqui), que é um elemento químico com o símbolo <em>Hg</em> e o número atômico 80 (assim disse a <em><a title="Leia mais sobre o elemento químico Mercúrio" href="http://en.wikipedia.org/wiki/Mercury_(element)" target="_blank">Wikipedia</a> </em>(:  ).  É devido a isso que você utilizará o <em>Mercurial </em>em linha de comando através de comandos iniciados por <em><strong>hg</strong></em>.</p>
<p style="text-align: justify;">Antes de iniciarmos, vamos dizer ao <em>Mercurial </em>quem nós somos. Abra o arquivo <em><strong>.hgrc </strong></em>do seu <em>home</em>:</p>
<pre>$ vim ~/.hgrc</pre>
<p style="text-align: justify;">É fundamental que nossos <em>commits </em>estejam marcados com nosso nome, e um <em>e-mail </em>para contato. Vamos escrever estas duas informações neste arquivo:</p>
<pre>[ui]
username = seu nome &lt;seuemail@provedor.com&gt;</pre>
<p style="text-align: justify;">Salve o arquivo&#8230; e estamos prontos para iniciar.</p>
<h2 style="text-align: justify;">Primeiros passos&#8230;</h2>
<p style="text-align: justify;">Os passos que vou exemplificar aqui não são muito diferentes dos que você encontrará na <a title="Visite a página oficial do projeto Mercurial" href="http://mercurial.selenic.com/" target="_blank">página oficial do <em>Mercurial</em></a>. Preguiça minha? Talvez&#8230; mas você verá que usar o <em>Mercurial </em>é extremamente simples! As dificuldades são as exceções do dia-à-dia.</p>
<p style="text-align: justify;">Para deixar o exemplo mais interessante, vamos utilizar o <em>virtualenv</em>. Dúvidas? Confira o <em>post </em><em><a title="Construa projetos isolados do seu sistema com virtualenv" href="http://www.profissionaisti.com.br/2011/04/python-django-e-virtualenv/">Python, Django e virtualenv</a></em> e visualize aonde pretendemos chegar:</p>
<pre>$ cd ˜/Projetos/
$ virtualenv DjangoComHG --no-site-packages
$ cd DjangoComHG</pre>
<p style="text-align: justify;">Agora sim, vamos criar um projeto através da seguinte expressão:</p>
<pre>$ hg init django-com-hg</pre>
<p style="text-align: justify;">Projeto criado&#8230; vamos partir para as tarefas mais comuns no <em>Mercurial</em>.</p>
<h2 style="text-align: justify;">Altere, adicione e &#8220;comite&#8221;</h2>
<p style="text-align: justify;">O <em>Mercurial </em>é <em><a title="Leia mais sobre Distributed Version Control System" href="http://en.wikipedia.org/wiki/Distributed_revision_control" target="_blank">DVCS</a></em>, isto quer dizer que, quando você clonar um repositório remoto você terá uma cópia exata dele em seu computador. Logo, as alterações que você &#8220;persistir&#8221; estarão disponíveis apenas na sua cópia local. Pode parecer um pouco confuso, mas com o tempo faz todo o sentido.</p>
<p style="text-align: justify;">Para o primeiro <em>commit </em>(persistir nossas alterações localmente) escreva um arquivo <em>.hgignore </em>(<a title="Entenda para que serve o arquivo .hgignore" href="http://mercurial.selenic.com/wiki/.hgignore" target="_blank">saiba mais do que se trata</a>) e um arquivo <em>README</em>:</p>
<pre>$ cd django-com-hg/
$ ls -a

.hg     .hgignore     README</pre>
<p style="text-align: justify;">A pasta <em>.hg </em>na verdade é quem vai identificar e armazenar todas as informações do nosso projeto. Sem ela, você deixa de ter o controle sobre as versões dos arquivos e subpastas do projeto.</p>
<p style="text-align: justify;">Execute o comando <strong><em>hg status </em></strong>e veja o que aparece&#8230; acredito que o resultado seja auto-sugestivo. O <em>Mercurial </em>ainda não sabe o que fazer com os arquivos no projeto, portanto diremos a ele que queremos versionar estes arquivos:</p>
<pre>$ hg add .hgignore README</pre>
<p style="text-align: justify;">Uma nova execução do <strong><em>hg status </em></strong>vai apontar que os arquivos foram marcados para adição, porém, ainda não foram adicionados. Você vai confirmar está operação através do comando <em>commit</em>:</p>
<pre>$ hg commit -m "Primeiro commit com .hgignore"</pre>
<p style="text-align: justify;">O parâmetro <strong><em>-m </em></strong>serve para passarmos uma mensagem de descrição do <em>commit </em>que estamos fazendo. Isto facilita na leitura do <em>log </em>de <em>commits </em>realizados:</p>
<pre>$ hg log</pre>
<p style="text-align: justify;">Estes serão os comandos que provavelmente você usará constantemente enquanto desenvolve.</p>
<h2 style="text-align: justify;">Compartilhando as suas produções</h2>
<p style="text-align: justify;">Se você ainda não tem uma conta no <em><a title="Bitbucket, compartilhe o seu código" href="http://bitbucket.org">Bitbucket</a></em>, essa é uma grande oportunidade para fazer uma.</p>
<p style="text-align: justify;">Vamos criar um repositório para praticarmos o comando <em><strong>push. </strong></em>No<em> Bitbucket</em>:</p>
<ul style="text-align: justify;">
<li>Eu vou dar o nome de &#8220;<em>post-django-com-hg</em>&#8221; ao repositório, fique a vontade para dar o nome que você desejar;</li>
<li>Escolha o <em>Python </em>como linguagem;</li>
<li>Coloque uma pequena descrição;</li>
<li>Eu vou marcar a opção <em>Issue tracking</em>, caso haja algum problema com o código e vocês queiram sugerir melhorias.</li>
</ul>
<p style="text-align: justify;"><a title="Confira o repositório criado no Bitbucket" href="https://bitbucket.org/kplaube/post-django-com-hg">Confira o resultado</a>.</p>
<p style="text-align: justify;">No repositório local vamos utilizar o comando <em><strong>push </strong></em>com o endereço do repositório no <em>Bitbucket</em>. Isso enviará todas as alterações que persistidas em nosso repositório local para o repositório remoto, mesclando-as com as contribuições de outros usuários envolvidos no projeto:</p>
<pre>$ hg push https://bitbucket.org/kplaube/post-django-com-hg</pre>
<p style="text-align: justify;"><strong>Lembre-se</strong> de mudar o endereço acima para o endereço do seu repositório no <em>Bitbucket. </em>Visite a página do seu repositório e veja o que aconteceu&#8230; bacana, não?</p>
<p style="text-align: justify;">Mas dessa forma, teremos que sempre executar o comando <strong><em>push </em></strong>informando o endereço do repositório. Vamos deixar esta tarefa mais simples editando o arquivo <strong><em>hgrc </em></strong>dentro da pasta <em>.hg</em> do projeto:</p>
<pre>$ cd ~/Projetos/DjangoComHG/django-com-hg/
$ vim .hg/hgrc</pre>
<p style="text-align: justify;">Coloque o seguinte:</p>
<pre>[paths]
default = https://kplaube@bitbucket.org/kplaube/post-django-com-hg</pre>
<p style="text-align: justify;"><strong>Lembre-se </strong>de mudar o endereço acima para o endereço do seu repositório no <em>Bitbucket</em>.</p>
<p style="text-align: justify;">Pronto! Quando você for &#8220;pushear&#8221; não precisará mais informar o endereço do repositório remoto.</p>
<p style="text-align: justify;">Altere alguns arquivos&#8230; <em>commit</em>. Adicione alguns arquivos&#8230; <em>commit</em>. Ao final do dia, dê um <em>push </em>e deixe o resto da equipe saber o que você fez <img src='http://www.profissionaisti.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2 style="text-align: justify;">Referências</h2>
<ul style="text-align: justify;">
<li><a title="Mercurial, work easier, work faster" href="http://mercurial.selenic.com/">Site oficial do projeto <em>Mercurial</em></a></li>
<li><a title="Leia mais sobre Mercurial na Wikipedia" href="http://en.wikipedia.org/wiki/Mercurial" target="_blank">Artigo na <em>Wikipedia </em>sobre <em>Mercurial</em></a></li>
<li><a title="Leia mais sobre Mercúrio no Wikipedia" href="http://en.wikipedia.org/wiki/Mercury_(element)" target="_blank">Artigo na <em>Wikipedia </em>sobre Mercúrio (o elemento químico)</a></li>
<li><a title="Excelente post sobre Mercurial, TI e gerência de projetos" href="http://tocadoelfo.blogspot.com/2011/03/mercurial-hg-controlando-as-versoes-do.html" target="_blank"><em>Mercurial Hg</em> &#8211; Controlando as Versões do seu <em>Software</em></a></li>
<li><em><a title="Excelente e-book de Bryan O'Sullivan sobre Mercurial" href="http://hgbook.red-bean.com/read/" target="_blank">Mercurial: The Definitive Guide</a></em></li>
</ul>
<p style="text-align: justify;">No próximo <em>post</em>, vamos concluir a trilogia mostrando uma forma bacana de utilizar o <em>Mercurial </em>para versionar seus projetos <em>Django</em>.</p>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Como versionar projetos Django com Mercurial - Parte 2" href="http://www.klauslaube.com.br/2011/05/como-versionar-projetos-django-mercurial-%e2%80%93-parte-2/" target="_blank">Blog Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como versionar projetos Django com o Mercurial &#8211; Parte 1</title>
		<link>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-1/</link>
		<comments>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-1/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 17:52:09 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[mercurial]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=17345</guid>
		<description><![CDATA[Olá pessoas! Se você está começando em Django, e nunca utilizou uma ferramenta de controle de versão (as vezes por trauma do SVN ou por simples desinteresse) esta será uma grande oportunidade para você conhecer o Mercurial, e saber a forma que venho utilizando para versionar meus projetos Django. Peraí! Por que não Git? Sem [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Olá pessoas!</p>
<p style="text-align: justify;">Se você está começando em <em><a title="Leia mais sobre Django" href="http://www.profissionaisti.com.br/tag/django/">Django</a></em>, e nunca utilizou uma ferramenta de controle de versão (as vezes por trauma do <em><a title="Jogar Pedra em Gato Morto: por que Subversion não presta" href="http://akitaonrails.com/2007/09/22/jogar-pedra-em-gato-morto-por-que-subversion-no-presta">SVN</a> </em>ou por <a title="Wikipedia, Sistema de Controle de Versão" href="http://pt.wikipedia.org/wiki/Sistema_de_controle_de_vers%C3%A3o">simples desinteresse</a>) esta será uma grande oportunidade para você conhecer o <em><a title="Bitbucket: Hospede e versione softwares com Mercurial" href="http://www.profissionaisti.com.br/2009/06/bitbucket-hospede-e-versione-softwares-com-mercurial/">Mercurial</a></em>, e saber a forma que venho utilizando para versionar meus projetos <em>Django.<br />
</em></p>
<h3 style="text-align: justify;">Peraí! Por que não <em>Git</em>?</h3>
<p style="text-align: justify;"><img class="alignleft size-full wp-image-17383" style="margin: 10px;" title="git-logo" src="http://www.profissionaisti.com.br/wp-content/uploads/2011/06/git-logo.png" alt="" width="97" height="188" />Sem dúvida o <em><a title="Git é a estrela do momento tratando-se de DVCS" href="http://git-scm.com/">Git</a> </em>é a ferramenta do momento em se tratando de controle de versões, e vem sendo muito utilizada por rubistas e pythonistas (eu incluso nessa última galera).</p>
<p style="text-align: justify;">Por que não falar de <em>Git </em>aqui? Simples! Você vai ouvir falar sobre <em>Git </em>em todo o lugar. O<em> Google </em>vai te trazer toneladas de informações sobre <em>Git</em>. Você vai &#8220;ouvir&#8221; o pessoal falando que <a title="Por que Git é Melhor que X" href="http://pt.whygitisbetterthanx.com/"><em>Git </em>é melhor do que qualquer outra ferramenta</a>. Você vai até enjoar de tanto ouvir falar sobre <em>Git</em>.</p>
<p style="text-align: justify;">O <em>Mercurial </em>foi o primeiro <em><a title="DVCS - Distributed Version Control System" href="http://en.wikipedia.org/wiki/Distributed_revision_control" target="_blank">DVCS</a> </em>que utilizei (de verdade). <strong>Na minha opinião</strong>, ele é mais simples que o <em>Git</em>, é feito em <em>Python</em>, e me atende no desenvolvimento dos meus projetos pessoais.</p>
<p style="text-align: justify;">Concordo com o pessoal que diz que o <em>Git </em>é bom, e concordo com o pessoal que fala que o <em>Mercurial </em>é bom. É perfeitamente possível utilizar estas duas <strong>ferramentas</strong>, não precisamos ser radicais e iniciar um <em>flame </em>em cima deste assunto. A opção é melhor que não ter opção&#8230;</p>
<h3 style="text-align: justify;"><em>GitHub</em> x <em>Bitbucket</em></h3>
<p style="text-align: justify;"><a href="http://www.profissionaisti.com.br/wp-content/uploads/2011/06/bitbucket_and_github.png"><img class="alignleft size-full wp-image-17384" style="margin: 10px;" title="bitbucket_and_github" src="http://www.profissionaisti.com.br/wp-content/uploads/2011/06/bitbucket_and_github.png" alt="" width="132" height="132" /></a>Agora uma coisa eu não posso deixar de concordar: O <em><a title="GitHub, Social coding" href="https://github.com/" target="_blank">GitHub</a> </em>é (na minha opinião) melhor que o <em><a title="Alternativa com Mercurial ao GitHub" href="https://bitbucket.org/" target="_blank">Bitbucket</a></em>.</p>
<p style="text-align: justify;">Ambos são repositórios de código na nuvem, o primeiro usando <em>Git</em> e o segundo usando <em>Mercurial</em>. O detalhe é que o <em>Git </em>tem algumas funções mais apuradas que o <em>Bitbucket</em>, principalmente as funcionalidades que tornam a ferramenta muito mais &#8220;social&#8221;.</p>
<p style="text-align: justify;">Embora o <em>Bitbucket </em>recentemente tenha sido adquirido pela <em>Atlassian </em>e tenha recebido uma forte injencão de melhorias&#8230; o <em>GitHub </em>ainda é, para mim, a melhor forma de compartilhar código que existe no momento.</p>
<p style="text-align: justify;">Venho utilizando o <em>Bitbucket </em>pela opção de poder manter repositórios de código &#8220;fechados&#8221;. Coisa que com o &#8220;rival&#8221; só é possível através de uma conta paga.</p>
<p style="text-align: justify;">Mais uma vez&#8230; é perfeitamente possível viver utilizando as duas <strong>ferramentas</strong>.</p>
<p style="text-align: justify;">Na próxima parte deste <em>post </em>vamos abordar o básico do <em>Mercurial</em>, e também pretendo mostrar como <a title="Como organizar seus projetos Django" href="http://www.profissionaisti.com.br/2011/04/como-organizar-seus-projetos-django/">organizo os meus projetos <em>Django</em></a> &#8220;versionando-os&#8221; com o <em>Mercurial </em>e <em>Bitbucket</em>.</p>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Como versionar projetos Django com o Mercurial - Parte 1" href="http://www.klauslaube.com.br/2011/05/como-versionar-projetos-django-mercurial-parte/">Blog Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/06/como-versionar-projetos-django-com-o-mercurial-parte-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fazendo Javascript OO de forma fácil</title>
		<link>http://www.profissionaisti.com.br/2011/06/fazendo-javascript-oo-de-forma-facil/</link>
		<comments>http://www.profissionaisti.com.br/2011/06/fazendo-javascript-oo-de-forma-facil/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 12:56:44 +0000</pubDate>
		<dc:creator>Klaus Peter Laube</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=17347</guid>
		<description><![CDATA[Essa é uma dica valiosa para o pessoal que quer escrever um Javascript mais &#8220;bonito&#8221;. Embora a linguagem (em sua essência) seja Orientada a Objetos, temos que admitir que ela foge um pouco do convencional através do estilo de escrita prototype. Quero dizer que, é possível utilizarmos conceitos como encapsulamento, herança, atributos e métodos públicos e [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignleft size-full wp-image-17385" style="margin: 10px;" title="javascript" src="http://www.profissionaisti.com.br/wp-content/uploads/2011/06/javascript.png" alt="" width="128" height="128" />Essa é uma dica valiosa para o pessoal que quer escrever um <em><a title="Leia mais sobre Javascript" href="http://www.profissionaisti.com.br/tag/javascript/">Javascript</a></em> mais &#8220;bonito&#8221;.</p>
<p style="text-align: justify;">Embora a linguagem<em> </em>(em sua essência) seja Orientada a Objetos, temos que admitir que ela foge um pouco do convencional através do estilo de escrita <em>prototype</em>. Quero dizer que, é possível utilizarmos conceitos como encapsulamento, herança, atributos e métodos públicos e privados, etc. Mas de uma maneira um pouco diferente se comparada a linguagens como <em><a title="Leia mais sobre Python" href="http://www.profissionaisti.com.br/tag/python/">Python</a> </em>ou <em><a title="Leia mais sobre PHP" href="http://www.profissionaisti.com.br/tag/php/">PHP</a></em>.</p>
<h3 style="text-align: justify;">Encapsular para conquistar!</h3>
<p style="text-align: justify;">A linguagem é composta por alguns objetos muito utilizados no cotidiano, como os objetos <em>Array</em>, <em>Math </em>e <em>String</em>. Estes (e outros <a title="Veja outros objetos globais da linguagem" href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects">objetos de </a><em><a title="Veja outros objetos globais da linguagem" href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects">core</a></em>) são instâncias do objeto <em>Object</em>, que você pode representar através da seguinte expressão:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> meuObjeto <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>meuObjeto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// object</span>
<span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>Math<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #006600; font-style: italic;">// object</span></pre></div></div>

<p style="text-align: justify;">Você encontrará uma forma (muito bacana por sinal) de construir objetos através de expressões como essas:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> fooBar <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Posso funcionar como um inicializador!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    _private<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tipo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Testando chamada &quot;</span> <span style="color: #339933;">+</span> tipo <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    eggs<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Eggs.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fooBar._private<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;interna&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    spam<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Spam: &quot;</span> <span style="color: #339933;">+</span> msg <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
fooBar.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                 <span style="color: #006600; font-style: italic;">// Posso funcionar como um inicializador!</span>
fooBar.<span style="color: #660066;">eggs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                 <span style="color: #006600; font-style: italic;">// Eggs. // Testando chamada interna</span>
fooBar._private<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;externa&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #006600; font-style: italic;">// Testando chamada externa</span>
fooBar.<span style="color: #660066;">spam</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Eggs and Spam&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// Spam: Eggs and Spam</span></pre></div></div>

<p style="text-align: justify;">Pode-se observar que é uma prática válida para organizar código através de <em>namespaces</em>.</p>
<p style="text-align: justify;"><strong>Referência: </strong><em><a title="Um bom artigo da Rebecca Murphey sobre como organizar seus scripts através de Objects" href="http://blog.rebeccamurphey.com/2009/10/15/using-objects-to-organize-your-code/">Using Objects to organize your code</a></em></p>
<h3 style="text-align: justify;">Função ou Classe?</h3>
<p style="text-align: justify;">Já utilizei algumas vezes o modelo acima&#8230; mas devo dizer que sou adepto a uma outra forma de construirmos classes em <em>Javascript</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Pessoa <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Pessoa instanciada!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                      <span style="color: #006600; font-style: italic;">// Pessoa instanciada!</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>Pessoa<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #006600; font-style: italic;">// function</span>
<span style="color: #003366; font-weight: bold;">var</span> pessoa1 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #006600; font-style: italic;">// Pessoa instanciada!</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>pessoa1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// object</span></pre></div></div>

<p style="text-align: justify;">No exemplo acima, podemos reparar que seguindo o comportamento normal de uma função, não há surpresas na execução da expressão <em>Pessoa</em>. Porém, quando adicionamos o operador <strong><em>new </em></strong>na frente, o <em>Javascript </em>cria uma instância do tipo <em>Pessoa. </em>Basicamente é como se a expressão <em>function </em>fosse &#8220;multiuso&#8221;, sendo útil para definir funções e classes.</p>
<p style="text-align: justify;">O mais legal disso é que, como você já deve ter reparado, com o uso do <em><strong>new </strong></em>ganhamos de graça um <em>constructor</em> (ou inicializador, como preferir) em nossa classe <em>Pessoa</em>.</p>
<p style="text-align: justify;"><strong>Referência: </strong><em><a title="Excelente artigo da Mozilla ensinando a como representar estados da Orientação a Objetos com Javascript" href="https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript">Introduction to Object-Oriented Javascript</a></em></p>
<h3 style="text-align: justify;">Métodos, propriedades e um pouco de confusão</h3>
<p style="text-align: justify;">Do <em>constructor</em> em diante, já me deparei com algumas vertentes de implementações do <em>Javascript</em>. Já encontrei algumas <a title="Object-Oriented JavaScript, how to achieve public properties/fields" href="http://jquery-howto.blogspot.com/2009/01/object-oriented-javascript-how-to_21.html" target="_blank">bem simples</a>, outras <a title="Correct OOP for Javascript" href="http://www.coolpage.com/developer/javascript/Correct%20OOP%20for%20Javascript.html">um pouco mais complicadas</a>&#8230; vou mostrar aqui a que eu acredito ser a mais usual. Não tenho propriedade para dizer se é o  modo certo ou mais elegante, apenas é o modo que incorpora características de <em>OOP </em>que melhor me atendeu:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Linguagem <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>nome<span style="color: #339933;">,</span> versao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">versao</span> <span style="color: #339933;">=</span> versao<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Acima temos a construção da classe <em>Linguagem</em>. Em seu <em>constructor</em> aproveitamos para setar alguns atributos, como <em>nome </em>e <em>versao</em>, que são passados imediatamente na hora de instanciá-la.</p>
<p style="text-align: justify;">Para criar um método para esta classe, vamos recorrer ao <em>prototype </em>do <em>Javascript</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Linguagem.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">descricaoCompleta</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; vr. &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">versao</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Resumidamente, estamos adicionando um método de instância na estrutura da classe. Fazemos isso adicionando uma função ao <em>prototype </em>da classe. Dessa forma o método terá acesso as propriedades do objeto na hora que for instanciado.</p>
<p style="text-align: justify;">Se tentarmos executar a expressão <em>Linguagem.descricaoCompleta</em>, iremos nos deparar com um erro de método inexistente. Mas, se instanciarmos a classe veremos que o método está acessível:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> python <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Linguagem<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Python&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;2.7&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>python<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                      <span style="color: #006600; font-style: italic;">// Linguagem</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>python.<span style="color: #660066;">descricaoCompleta</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// Python vr.2.7</span></pre></div></div>

<p style="text-align: justify;">Acima utilizamos o conceito de métodos e atributos de instância. Através do modelo <em>Object Literal</em> podemos ter um comportamento parecido com o conceito de métodos de classe:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Linguagem <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>nome<span style="color: #339933;">,</span> versao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">versao</span> <span style="color: #339933;">=</span> versao<span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// Chamando um método que está fora do prototype da classe</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">meuId</span> <span style="color: #339933;">=</span> Linguagem.<span style="color: #660066;">incId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Adicionando uma propriedade através de Object Literal</span>
Linguagem.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Adicionando um método através de Object Literal</span>
Linguagem.<span style="color: #660066;">incId</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span><span style="color: #339933;">++;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> javascript <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Linguagem<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Javascript&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;1.5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>javascript<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        <span style="color: #006600; font-style: italic;">// Linguagem</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>javascript.<span style="color: #660066;">meuId</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// 1</span></pre></div></div>

<p style="text-align: justify;" lang="javascript">Esta forma de criar classes e objetos em <em>Javascript </em>é executada com muito sucesso na biblioteca <em><a title="RGraph: HTML5 canvas graph library based on the HTML5 canvas tag " href="http://www.rgraph.net/">RGraph</a></em>.</p>
<p style="text-align: justify;" lang="javascript"><strong>Referências: </strong><em><a title="Excelente artigo mostrando os conceitos de OOP aplicados ao Javascript" href="http://weblog.bocoup.com/javascript-is-object-oriented-programming">Javascript is Object Oriented Programming</a></em></p>
<h3 style="text-align: justify;">Herdar é preciso</h3>
<p style="text-align: justify;">Para entender como criar heranças com o <em>prototype </em>do <em>Javascript</em>, vamos primeiramente criar um tipo chamado <em>Framework</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Framework <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>nomeFramework<span style="color: #339933;">,</span> nome<span style="color: #339933;">,</span> versao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">versao</span> <span style="color: #339933;">=</span> versao<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nomeFramework</span> <span style="color: #339933;">=</span> nomeFramework<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">No caso acima, iremos sobrescrever o comportamento do <em>constructor</em> da classe <em>Linguagem</em>.</p>
<p style="text-align: justify;">E é aqui que a mágica acontece&#8230; instanciamos o tipo <em>Linguagem </em>no <em>prototype </em>da classe <em>Framework</em>. Isto fará com que o tipo <em>Framework </em>possua todas as propriedades de <em>Linguagem</em>. Depois corrigimos o <em>constructor</em>, apontando ele novamente para <em>Framework</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Cria herança com Linguagem</span>
Framework.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Linguagem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Corrige o ponteiro do constructor para Framework (está apontando para Linguagem)</span>
Framework.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">=</span> Framework<span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Vamos adicionar um método exclusivo da classe <em>Framework</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Framework.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">feitoEm</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nomeFramework</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; é feito em &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Instanciamos algumas vezes a classe <em>Framework</em>, e teremos o comportamento esperado de uma herança:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> django <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Framework<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Django&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;Python&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;2.7&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>django<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                      <span style="color: #006600; font-style: italic;">// Framework</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>django.<span style="color: #660066;">descricaoCompleta</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// Python vr.2.7</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>django.<span style="color: #660066;">feitoEm</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>            <span style="color: #006600; font-style: italic;">// Django é feito em Python</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> jquery <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Framework<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;jQuery&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;Javascript&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;1.5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>jquery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                      <span style="color: #006600; font-style: italic;">// Framework</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>jquery.<span style="color: #660066;">descricaoCompleta</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// jQuery vr.1.5</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>jquery.<span style="color: #660066;">feitoEm</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>            <span style="color: #006600; font-style: italic;">// jQuery é feito em Javascript</span></pre></div></div>

<p style="text-align: justify;">Existem algumas <em>frameworks </em>(como a <em><a title="MooTools, a compact javascript framework" href="http://mootools.net/" target="_blank">Mootools</a></em>) que facilitam a criação de classes e heranças em <em>Javascript</em>.</p>
<p style="text-align: justify;">O exemplo completo está disponível para <em>download </em>em: <a title="Código do exemplo no GitHub" href="http://github.com/kplaube/post-javascript-oop" target="_blank">http://github.com/kplaube/post-javascript-oop</a></p>
<p style="text-align: justify;">Até a próxima&#8230;</p>
<p style="text-align: justify;"><strong>Fonte: </strong><a title="Fazendo Javascript OOP de forma fácil" href="http://www.klauslaube.com.br/2011/05/fazendo-javascript-oo-de-forma-facil/" target="_blank">Blog Klaus Laube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2011/06/fazendo-javascript-oo-de-forma-facil/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

