<?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>Objectzilla &#187; tipagem</title>
	<atom:link href="http://www.objectzilla.com.br/tag/tipagem/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.objectzilla.com.br</link>
	<description>por Leonardo Veríssimo</description>
	<lastBuildDate>Sat, 05 Jun 2010 18:58:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Filho de feio inteligente com gostosa burra</title>
		<link>http://www.objectzilla.com.br/2009/02/10/filho-de-feio-inteligente-com-gostosa-burra/</link>
		<comments>http://www.objectzilla.com.br/2009/02/10/filho-de-feio-inteligente-com-gostosa-burra/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 01:06:26 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[dinâmica]]></category>
		<category><![CDATA[estática]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[tipagem]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=123</guid>
		<description><![CDATA[Seguinte, na segunda-feira (09/fev), eu vi um PDF sobre uma experimentação de tipagem estática em Python. Não que eu esteja duvidando da capacidade dos caras que fizeram a apresentação, até porque, mexer com linguagens não é para qualquer um, mas sei lá, o fato de muita gente ter dado um &#8220;up&#8221; no Reddit implica que [...]]]></description>
			<content:encoded><![CDATA[<p>Seguinte, na segunda-feira (09/fev), eu vi um PDF sobre uma <a href="http://wiki.jvmlangsummit.com/pdf/28_Siek_gradual.pdf">experimentação de tipagem estática em Python</a>. Não que eu esteja duvidando da capacidade dos caras que fizeram a apresentação, até porque, mexer com linguagens não é para qualquer um, mas sei lá, o fato de muita gente ter dado um &#8220;up&#8221; no Reddit implica que muita gente sonha com uma linguagem cuja tipagem é tanto estática quanto dinâmica.</p>
<p>Isso me preocupa, sabia? A impressão que dá é que as pessoas sonham com uma espécie de uma linguagem meio-termo, que acabasse com as guerras nerdísticas e que fosse a única que reinaria soberana sobre todos as outras. E uma que fosse estática e dinâmica, <em>ao mesmo tempo</em>, seria a candidata ideal. Infelizmente, tenho que te contar a triste realidade: tipagem estática e dinâmica são antagônicas, tipo água e vinho.</p>
<p>Você já programou em C++? Então, quem conhece o troço sabe que existem vários paradigmas conflitantes entre si. Um paradigma é a programação procedural com conteineres STL, outro é a programação orientada a objetos e outro é programação por templates. Todos bem diferentes, e cuja mistureba só pode ser feita com bastante cuidado por gente que não tem amor à própria vida. Sim, é realmente complicado programar em templates e depois tentar usar OO, é complicado usar o paradigma C quando boa parte do código já está com a sintaxe do C++. E eu desconfio que a mesma coisa pode ocorrer com essas linguagens que misturam tipagem estática e tipagem dinâmica. Vamos fazem uma experimentação com Groovy? Primeiro: o que acontece quando compilamos (com groovyc) o seguinte trecho?</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// recebe um objeto de tipo indefinido</span>
<span style="color: #000000; font-weight: bold;">def</span> imprima<span style="color: #66cc66;">&#40;</span>valor<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #993399;">println</span> valor
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// objeto de tipo &quot;String&quot; numa referência de tipo &quot;String&quot;</span>
<span style="color: #aaaadd; font-weight: bold;">String</span> msg <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Olá&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// objeto de tipo &quot;String&quot; passado para parâmetro sem tipo</span>
imprima msg</pre></div></div>

<p>Sucesso, é perfeitamente possível passar um objeto qualquer numa referência sem tipo.</p>
<p>Mas, e se invertermos, assim?</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// recebe um objeto de tipo &quot;String&quot;</span>
<span style="color: #000000; font-weight: bold;">def</span> imprima<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">String</span> valor<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #993399;">println</span> valor
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// objeto de tipo &quot;String&quot; numa referência sem tipo</span>
msg <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Olá&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// objeto de tipo &quot;String&quot; passado para parâmetro de tipo &quot;String&quot;</span>
imprima msg</pre></div></div>

<p>Sucesso também, o compilador não reclama quando uma referência String recebe um objeto de uma referência sem tipo. E se chutarmos o balde, definindo a função imprime() recebendo um int?</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// recebe um objeto de tipo &quot;int&quot;</span>
<span style="color: #000000; font-weight: bold;">def</span> imprima<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> valor<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #993399;">println</span> valor
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// objeto de tipo &quot;String&quot; numa referência de tipo &quot;String&quot;</span>
<span style="color: #aaaadd; font-weight: bold;">String</span> msg <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Olá&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// objeto de tipo &quot;int&quot; passado para parâmetro de tipo &quot;String&quot;</span>
imprima msg</pre></div></div>

<p>Acha que dá erro de compilação? Dá nada! Compila <strong>com sucesso</strong> também! Não existem casos específicos para isso. Em Groovy, os tipos não são decididos em tempos de compilação. Erros de tipos só são descobertos quando você <em>executa o código</em> com tipagem divergente.</p>
<p>Não tenho nada contra linguagens de tipagens estáticas, nem de dinâmicas. Só acho que cada um deve estar no seu quadrado. Muito se fala que, com linguagens &#8220;mistas&#8221;, como Groovy, se obtém os benefícios da tipagem estática com os benefícios da tipagem dinâmica. Será mesmo? Vamos pensar: Em minha opinião, a vantagem da tipagem estática é a possibilidade de reduzir erros causados por atribuições errôneas, impossibilitanto até mesmo e existência do código executável; a desvantagem é que os tipos estáticos causam um engessamento da aplicação (a famosa dúvida: &#8220;como trocar a classe, uma vez que as referências são da classe antiga?&#8221;), e cuja solução (criação de classes abstratas e de interfaces) precisa ser feita no começo do desenvolvimento.</p>
<p>A vantagem da tipagem dinâmica (de novo, em minha opinião) é possibilitar um código mais flexível pois, como as referências não se comprometem com tipos, uma nova classe com os mesmos contratos de uma antiga sempre será substituível por esta. A desvantagem é que, principalmente com APIs públicas ou com equipes dispersas, torna-se mais difícil definir um contrato dos métodos e classes.</p>
<p>Veja, Groovy não tem <em>aquela vantagem</em> de uma linguagem estática. Se você retornar, em uma função, um valor de tipo diferente, é possível quebrar o código em algum outro lugar e você nem perceber. Significa que precisará de uma grande suíte (e de uma forte cultura) de testes unitários, como qualquer linguagem dinâmica.</p>
<p>E também não tem aquela vantagem de uma linguagem dinâmica. Tipos não são garantias de que métodos obedeçam estritamente um contrato. Em linguagens &#8220;puramente&#8221; dinâmicas, como não há tipos nas referências, é permitido uma certa flexibilidade do que se pode ou não pode aceitar. Exemplo, em Ruby, poderia ter métodos que recebem valores válidos, não importando seu tipo.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># classe hipotética Triângulo</span>
<span style="color:#008000; font-style:italic;"># válido</span>
t = Triangulo.<span style="color:#9900CC;">new</span> <span style="color:#ff3333; font-weight:bold;">:tipo</span><span style="color:#006600; font-weight:bold;">=&gt;</span>:retangulo
&nbsp;
<span style="color:#008000; font-style:italic;"># válido também, por que não?</span>
t = Triangulo.<span style="color:#9900CC;">new</span> <span style="color:#996600;">&quot;tipo&quot;</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;retangulo&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># válido</span>
t.<span style="color:#9900CC;">hipotenusa</span> <span style="color:#006666;">10</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># válido, por que não?</span>
t.<span style="color:#9900CC;">hipotenusa</span> <span style="color:#996600;">&quot;10&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># opa! erro! O método lança exceção!</span>
t.<span style="color:#9900CC;">cateto_oposto</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">4</span></pre></div></div>

<p>Tá vendo, os métodos podem tanto receber String quanto números, o importante é o valor resultante ser um número natural. O pensamento da tipagem limita essas espertezas, pois fica-se o tempo todo imaginando: &#8220;Não! Esse método tem que receber uma &#8216;classe X&#8217;!&#8221; (Pior que o indivíduo se esquece até da diferença entre objeto e classe.). Como Groovy não vai incentivar ninguém a abandonar os tipos em tudo quanto é canto, também não se receberá os benefícios das linguagens dinâmicas.</p>
<p>Então, pra amarrar com o título acima. Sou da opinião de que Groovy é ruim&#8230; não, corrigindo&#8230; de que Groovy <strong>é a pior linguagem do mundo</strong> porque, ao unir o feio inteligente (a tipagem estática) com a gostosa burra (a tipagem dinâmica), não se deu origem a um filho bonito e inteligente, como era de se esperar.</p>
<p>Foi pior, o filho é feio e burro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/02/10/filho-de-feio-inteligente-com-gostosa-burra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
