<?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>Blog de desenvolvimento da Milfont Consulting, Client e Server-side &#187; Orientação a Objetos</title>
	<atom:link href="http://www.milfont.org/tech/category/linguagens/orientacao-a-objetos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.milfont.org/tech</link>
	<description>Blog da Comunidade Milfont Consulting, uma empresa especializada em desenvolvimento Web, principalmente Javascript, node.js e muito Javascript.</description>
	<lastBuildDate>Thu, 26 Jan 2012 11:30:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Orientação a Objetos em Javascript</title>
		<link>http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/</link>
		<comments>http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 12:35:29 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=1364</guid>
		<description><![CDATA[Post indexador sobre o que escrevi sobre OO em Javascript nesse blog apenas para guardar como referência rápida de consulta, estou revisando todos os posts para verificar o que falta escrever. Name Binding Herança no javascript Overloading e overriding no Javascript]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-vertical"><script type="text/javascript">
			<!-- 
				tweetmeme_url = "http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/";
				tweetmeme_source = "tweetmeme";
				tweetmeme_style = "";
				
			//-->
			</script>
                        <script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div></div><p>Post indexador sobre o que escrevi sobre OO em <a href="http://www.milfont.org/tech/javascript/">Javascript</a> nesse blog apenas para guardar como referência rápida de consulta, estou revisando todos os posts para verificar o que falta escrever.</p>
<p><a href="http://www.milfont.org/tech/2007/10/01/early-vs-late-binding/">Name Binding</a></p>
<p><a href="http://www.milfont.org/tech/2008/01/05/heranca-no-javascript/">Herança no javascript</a></p>
<p><a href="http://www.milfont.org/tech/2007/10/01/overloading-e-overriding-no-javascript/">Overloading e overriding</a> no Javascript</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2011/06/26/orientacao-a-objetos-em-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transparência inédita na saúde pública</title>
		<link>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/</link>
		<comments>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 11:13:01 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[crowds]]></category>
		<category><![CDATA[DWR]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Model 3]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[crowd]]></category>
		<category><![CDATA[governo]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[reverse ajax]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=872</guid>
		<description><![CDATA[É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará. O governo do estado inaugurou essa semana &#8220;A Conta do Paciente&#8220;, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse [...]]]></description>
			<content:encoded><![CDATA[<p>É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará.</p>
<p>O governo do estado <a href="http://diariodonordeste.globo.com/materia.asp?codigo=745869">inaugurou essa semana</a> &#8220;<a href="http://www.ceara.gov.br/noticias/pacientes-poderao-saber-custos-dos-tratamentos">A Conta do Paciente</a>&#8220;, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse tipo de atuação aproxima o governo da agilidade que a sociedade cobra em relação à transparência nas contas públicas, antes era quase impossível saber o custo real por paciente. Fora que a secretaria vai saber precisamente e em tempo real os custos por unidade, além de facilitar a tomada de decisões que podem salvar vidas.</p>
<p>Esse formulário detalhado com a conta do paciente é possível graças ao <a href="http://pt.wikipedia.org/wiki/Erp">ERP</a> especialista em gestão hospitalar pública da empresa Insystem, nosso cliente e parceiro. A Insytem acreditou em nosso trabalho e é um dos maiores Cases, senão o melhor.</p>
<p>O ERP foi construído 100% com base em <a href="http://www.milfont.org/tech/tag/tdd/">TDD</a> em Java usando DWR, Hibernate e  Spring basicamente. Alguns requisitos necessários de usabilidade utilizam Reverse Ajax com DWR. O sistema é totalmente ajax e utiliza o <a href="http://www.milfont.org/tech/2009/06/29/introducao-ao-ext/">Extjs</a> seguindo a filosofia <a href="http://www.milfont.org/tech/2008/09/08/mvc-model-3-e-camadas/">model 3</a>. Fizemos <a href="http://www.milfont.org/tech/2009/07/02/extjs-e-dwr/">algumas customizações</a> no Extjs para se integrar ao DWR de forma transparente.</p>
<p>Fomos ágeis desde o primeiro momento, mas nunca nos preocupamos em implantação de processo, metodologia ou qualquer coisa que o foco não fosse software saudável. XP foi algo natural, valores e princípios foram assimilados desde o primeiro dia, mas foi e é o software funcionando e livre de erros [o mais livre possível] que nos moveu.</p>
<p>Destaque para o <a href="http://javaneses.wordpress.com/">Felipe Andrade</a>, funcionário da Insystem que se tornou especialista em Extjs com DWR e hoje domina e é talvez o maior conhecedor da união desses Frameworks no estado.</p>
<p>Agradecimentos especiais aos diretores Evando Chaves e Marcelo Meirelles que investiram nessa solução e tiveram a sagacidade de sair na frente da concorrência entendendo que software funcionando é mais importante do que processos bonitos e pomposos, afinal o barco não chega na frente por causa do tambor e sim dos remadores. A Insystem está de parabéns por ter enfrentado todas as correntes contrárias e ter chegado a essa vitória investindo e apostando no fator humano como responsável para a vitória.</p>
<p>Esse é um Case que entrou para a história, estamos procurando outra solução semelhante na saúde pública do Brasil e até agora não encontramos nada.</p>
<p>Orgulhoso por participar dessa conquista.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2010/03/07/transparencia-inedita-na-saude-publica/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Palestra Test Driven Development</title>
		<link>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/</link>
		<comments>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 10:58:46 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[xpce]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[Agilismo]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[behaviour driven development]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=600</guid>
		<description><![CDATA[Palestra realizada no evento do grupo XPCE em 28/03/2009. Test Driven Development View more presentations from Christiano Milfont.]]></description>
			<content:encoded><![CDATA[<p>Palestra realizada no evento do grupo <a href="http://groups.google.com.br/group/xpce">XPCE</a> em <a href="../2009/03/27/primeiro-encontro-xpce-mudancas-na-grade/">28/03/2009</a>.</p>
<div id="__ss_1216427" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Test Driven Development" href="http://www.slideshare.net/cmilfont/test-driven-development-1216427?type=presentation">Test Driven Development</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testdrivendevelopment-rev2-090329051331-phpapp01&amp;stripped_title=test-driven-development-1216427" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testdrivendevelopment-rev2-090329051331-phpapp01&amp;stripped_title=test-driven-development-1216427" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/cmilfont">Christiano Milfont</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/03/29/palestra-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criteria na JPA 2.0: Public Review!</title>
		<link>http://www.milfont.org/tech/2008/12/11/criteria-na-jpa-20-public-review/</link>
		<comments>http://www.milfont.org/tech/2008/12/11/criteria-na-jpa-20-public-review/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 15:13:53 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Criteria]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=450</guid>
		<description><![CDATA[Na &#8220;Public Review&#8221; da JSR317 &#8211; que trata da JPA 2.0 &#8211; foi adicionado suporte a Criteria API na especificação. Pode ser que em menos de dois anos possamos evoluir nessa especificação e usar menos as implementações, minha esperança é que melhorem pelo menos até a versão final, programada para o início de 2009. Como [...]]]></description>
			<content:encoded><![CDATA[<p>Na &#8220;<a href="http://jcp.org/aboutJava/communityprocess/pr/jsr317/index.html">Public Review</a>&#8221; da <a href="http://jcp.org/en/jsr/detail?id=317">JSR317</a> &#8211; que trata da JPA 2.0 &#8211; foi adicionado suporte a <a href="http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#querycriteria">Criteria API</a> na especificação. Pode ser que em menos de dois anos possamos evoluir nessa especificação e usar menos as implementações, minha esperança é que melhorem pelo menos até a versão final, programada para o início de 2009.</p>
<p>Como sempre criaram uma nomenclatura totalmente diferente para entidades da API, dificultando o entendimento da comunidade com anos de uso da única implementação que possuía essa API: <a href="http://www.hibernate.org/">Hibernate</a>. Comparem a <a href="http://www.milfont.org/docs/hibernate-3.2/doc/api/">API de Criteria do Hibernate</a> com a <a href="http://jcp.org/aboutJava/communityprocess/pr/jsr317/index.html">API de Criteria da Spec</a>. Ok, podemos aceitar isso, política&#8230;</p>
<p>Faltou muita coisa ainda, mas parece que estão trabalhando para melhorar até a versão final, pelo visto DELETE_ORPHAN vai sair de alguma forma:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Target<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>METHOD, FIELD<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> @Retention<span style="color: #009900;">&#40;</span>RUNTIME<span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> OneToMany <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">Class</span> targetEntity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #000066; font-weight: bold;">void</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">;</span>
    CascadeType<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> cascade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    FetchType fetch<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> LAZY<span style="color: #339933;">;</span>
    <span style="color: #003399;">String</span> mappedBy<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>   
    <span style="color: #000066; font-weight: bold;">boolean</span> orphanRemoval<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nota para os leitores:</p>
<blockquote><p>Open Issue: We also discussed the alternative of introducing a separate annotation for the orphanRemoval functionality and the alternative of introducing a REMOVE_ORPHAN cascade<br />
option. We would welcome feedback on the form that this metadata should take.</p></blockquote>
<p>Não encontrei nada sobre como manipular as estratégias de fetching &#8211; que é primordial &#8211; nos relacionamentos como temos no Hibernate: <span class="emphasis"><em>Select fetching, </em></span><span class="emphasis"><em>Subselect fetching, </em></span><span class="emphasis"><em>Join fetching e </em></span><span class="emphasis"><em>Batch fetching. </em>Nem a API de Criteria possui estratégia com FetchMode, apenas uma &#8220;Issue&#8221; aberta para a interface FetchJoinObject que deverá trabalhar isso, eu espero.<em><br />
</em></span></p>
<p>Ainda assim continuamos <a href="http://www.milfont.org/tech/2008/10/27/especificacao-ou-implementacao/">indicando o uso do Hibernate direto ao invés da especificação</a> até que a especificação seja estável o suficiente com features decentes para um desenvolvimento sério em Java. A API de Criteria da implementação Hibernate continua ainda muito superior principalmente se você precisar de consultas <a href="http://blog.caelum.com.br/2008/09/11/divisions-com-hibernate-uso-avancado-da-criteria-api/">um pouco mais avançadas</a>.</p>
<p>Confiram o material e decidam.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/12/11/criteria-na-jpa-20-public-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Especificação ou implementação?</title>
		<link>http://www.milfont.org/tech/2008/10/27/especificacao-ou-implementacao/</link>
		<comments>http://www.milfont.org/tech/2008/10/27/especificacao-ou-implementacao/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 14:39:44 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[JSR]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=339</guid>
		<description><![CDATA[A primeira recomendação em qualquer ramo é sempre seguir a especificação, isso é válido para não cairmos em um dos piores anti-patterns que existe, o &#8220;Vendor Lock-in&#8220;. Na indústria do Software passamos por isso frequentemente e a estratégia de Embrace-Extend-Extinguish esteve bastante presente na história dos bancos de dados como exemplo disso. Features proprietárias são sedutoras, [...]]]></description>
			<content:encoded><![CDATA[<p>A primeira recomendação em qualquer ramo é sempre seguir a especificação, isso é válido para não cairmos em um dos piores anti-patterns que existe, o &#8220;<a href="http://www.antipatterns.com/vendorlockin.htm">Vendor Lock-in</a>&#8220;. Na indústria do Software passamos por isso frequentemente e a estratégia de <a href="http://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish">Embrace-Extend-Extinguish</a> esteve bastante presente na <a href="http://en.wikipedia.org/wiki/Vendor_lock-in#Avoiding_vendor_lock-in_for_computer_software">história dos bancos de dados</a> como exemplo disso.</p>
<p>Features proprietárias são sedutoras, antigamente usávamos grids com paginação no HTML com a propriedade datasrc na tag table, podíamos ler inclusive de arquivos XML. Isso muito antes de Ajax ou até do Firefox. Evidente que só funcionava no IE.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;users&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Christiano Milfont&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;2&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Rafael Ponte&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TABLE</span> <span style="color: #000066;">DATASRC</span>=<span style="color: #ff0000;">&quot;#users&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TR<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TD<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;DIV</span> <span style="color: #000066;">DATAFLD</span>=<span style="color: #ff0000;">&quot;id&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/DIV<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/TD<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TD<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;DIV</span> <span style="color: #000066;">DATAFLD</span>=<span style="color: #ff0000;">&quot;name&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/DIV<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/TD<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/TR<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/TABLE<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Com a popularização do Firefox e a necessidade das aplicações serem CrossBrowser, tivemos que nos adaptar às specs da W3C. Praticamente todas as aplicações WEB precisaram serem reescritas -algumas até hoje ainda só &#8220;rodam&#8221; no IE.</p>
<p>Usar uma Feature proprietária facilita, mas no final você pagará o preço da não interoperabilidade. Agora precisamos usar um Framework Ajax para fazermos coisas que antes era nativo. No IE <a href="http://msdn.microsoft.com/en-us/library/ms535861(VS.85).aspx">tínhamos  até DnD</a>.</p>
<p>Especificação muito mais frágil do que as implementações nos força a criar uma &#8220;Isolation Layer&#8221; como solução de refactoring sem comprometer o sistema. Podemos então usar as features nos beneficiando do que a implementação tem a oferecer sem comprometermos o resultado final, o uso <a href="http://www.milfont.org/tech/2007/10/05/bridge-para-encapsular-o-cross-browser/">fica encapsulado na solução</a>.</p>
<h2>Especificação mal feita</h2>
<p>O problema é quando a definição de uma especificação fica frágil o suficiente &#8211; por problemas políticos &#8211; para forçar um refactoring profundo na mudança entre implementações.</p>
<p>No CEJUG, ocorreu uma <a href="https://cejug.dev.java.net/servlets/BrowseList?list=discussao&amp;by=thread&amp;from=1370683">thread sobre problema com data</a> na JPA, onde eu recomendei retirar a anotação @Temporal &#8211; que já tinha me dado trabalho anteriormente &#8211; e por &#8220;feeling&#8221; eu sabia que o problema era nessa anotação, mas nunca tinha pesquisado para saber o real porquê. Como quem ganhou dinheiro com Feeling no Brasil foi apenas <a href="http://www.youtube.com/watch?v=PfRrJyMLc-s">Morris Albert</a> &#8211; by <a href="http://www.contraditorium.com/2007/03/20/o-grande-crash-de-2007/">Cardoso</a> &#8211; eu dei uma pesquisada sobre isso e descobri que [como escrevei no email]:</p>
<blockquote><p>From	CMilfont<br />
to	discussao@cejug.dev.java.net<br />
date	Mon, Oct 27, 2008 at 9:54 AM<br />
subject	Re: [cejug-discussao] problema com data</p>
<p>Dei uma pesquisada e a conclusão que cheguei é:<br />
A spec determina que propriedades do tipo Date e Calendar [util java] devem ter a anotação @Temporal.<br />
TopLink obriga, se não tiver lança uma exceção ValidationException [pelo menos foi o que vi na documentação dele, não cheguei a testar].<br />
Hibernate é opcional, mas se você colocar ele devolve uma instância de Calendar, porque entende que a data é completa [como Timestamp] mesmo dizendo que o tipo é Date &#8211; aqui entendo como uma falha e vi que as issues sobre isso no projeto já foram fechadas, os últimos builds devem ter consertado, ou não.<br />
A spec não diz que deve lançar exception mesmo dizendo &#8220;must be&#8221; então o Oracle TopLink assumiu essa responsabilidade.<br />
Claro que essas funcionalidades devem também mudar de build para build então podem ter diferenças nas versões de builds entre os próprios implementadores, como Hibernate e TopLink mudarem da versão x.x.1 para x.x.3 por exemplo.<br />
Coisas de spec mal escrita, JPA tem que ser urgente revista, os capítulos ficam muito ambiguos, tem trechos que você fica bastante confuso, diferente de specs como da JSE que é bastante clara.</p></blockquote>
<p>O problema disso é que não dá para encapsular a diferença entre as implementações porque o uso dessa anotação é incompatível entre dois desses implementadores.</p>
<p>Outro problema da JPA é a falta de elementos básicos que um ORM deve implementar &#8211; como a Criteria &#8211; impossibilitando a troca de implementações com um simples refactoring. Tudo bem que em um Domain Model você tem como &#8211; e deve &#8211; isolar essa diferença entre Engines ORM mas em termos de Refactoring da aplicação no geral, ter que reescrever todas as buscas de uma aplicação porque a Engine não suporta Criteria pode não afetar o modelo mais trará um prejuízo enorme.</p>
<p>Como o Hibernate é OpenSource, maduro e anos-luz à frente até <a href="http://jcp.org/en/jsr/detail?id=317">da nova especificação de JPA 2.0</a>, a escolha dele pelos profissionais experientes é a mais adequada. Spring, é outra solução ao JEE sem EJB que permanece como indicação desde <a href="http://www.amazon.com/Expert-One-One-Development-without/dp/0764558315">o livro do Rod Johson de 2004</a> que era ainda sobre EJB2, recomendava o uso de JEE sem EJB e apresentou o Spring oficialmente ao mundo. Apesar de que Spring e EJB3 estarem bem nivelados hoje em dia, Spring <a href="https://cejug.dev.java.net/files/documents/859/93077/file_93077.dat/Os%20melhores%20do%20mundo,%20um%20comparativo%20entre%20Spring%20e%20EJB%203.0.pdf">ainda leva uma certa vantagem</a>, ainda mais pela maturidade e semrpe estar nos trilhos corretos, coisa que o EJB está se ajustando aos trancos e barrancos.</p>
<p>Em regra eu sempre recomendo o uso de especificações, mas em determinados pontos a especificação é desaconselhada e o uso direto da implementação tem suporte mais adequado. Não temos o poder de sempre escolhermos as ferramentas mais adequadas, muitas vezes a política impera &#8211; como nos órgãos públicos que são obrigados a usarem Oracle ou IBM por imposição governamental feita em um escritório na Casa Civil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/10/27/especificacao-ou-implementacao/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Java Magazine ed 61</title>
		<link>http://www.milfont.org/tech/2008/09/30/java-magazine-ed-61/</link>
		<comments>http://www.milfont.org/tech/2008/09/30/java-magazine-ed-61/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 14:30:57 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Java Magazine]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=296</guid>
		<description><![CDATA[Saiu a edição 61 da Java Magazine com matéria minha publicada sobre Orientação a Objetos no Javascript. TEm artigo de um conterrâneo e da turma de Natal também. Agora são 3 artigos meus publicados http://www.milfont.org/tech/published/ http://www.devmedia.com.br/resumo/default.asp?site=6 Escritores de Fortaleza Orientação a Objetos no Javascript Por: Christiano Milfont Nesse artigo estudaremos como está fundamentada a orientação [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="edicao 61" src="http://www.devmedia.com.br/loja/img/capaJava61_G.jpg" alt="" width="199" height="271" /><br />
Saiu a edição 61 da Java Magazine com matéria minha publicada sobre Orientação a Objetos no Javascript. TEm artigo de um conterrâneo e da turma de Natal também.</p>
<p>Agora são 3 artigos meus publicados <a href="http://www.milfont.org/tech/published/">http://www.milfont.org/tech/published/</a></p>
<p><a href="http://www.devmedia.com.br/resumo/default.asp?site=6">http://www.devmedia.com.br/resumo/default.asp?site=6</a></p>
<p><em style="color: #ff0000;"><strong>Escritores de Fortaleza</strong></em></p>
<p><strong>Orientação a Objetos no Javascript</strong><br />
Por: <strong>Christiano Milfont </strong></p>
<p>Nesse artigo estudaremos como está fundamentada a orientação a objetos no Javascript e como entender a sintaxe dentro desse conceito. Todos os Frameworks Ajax modernos estão codificados com a orientação a objetos como base.</p>
<p><strong>MP3 Player ME</strong><br />
Por: <strong>Ernandes Mourão Júnior</strong></p>
<p>Neste artigo, vamos mostrar como podemos inserir a plataforma Java ME nesta estória. Vamos criar um cenário onde o seu dispositivo móvel não possui um tocador de MP3, mas você gostaria de ter um para poder ouvir as suas canções favoritas. Para isto, vamos mostrar o desenvolvimento de um tocador de MP3 simples, utilizando-se da JSR 75 – PDA Optional Packages e da JSR 135 – Mobile Media API (MMAPI). Explorando-as desde os conceitos até a prática, com exemplos de código.</p>
<p><em style="color: #ff0000;"><strong>Escritores de Natal</strong></em></p>
<p><strong>Gráficos em Sistemas Web</strong><br />
Por: <strong>David Pereira, Itamir Filho e Raphaela Galhardo</strong></p>
<p>O artigo apresenta um conjunto de técnicas para criação de gráficos em sistemas web.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/09/30/java-magazine-ed-61/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Regras dinâmicas no Domain Model com linguagens de script</title>
		<link>http://www.milfont.org/tech/2008/01/22/regras-dinamicas-no-domain-model-com-linguagens-de-script/</link>
		<comments>http://www.milfont.org/tech/2008/01/22/regras-dinamicas-no-domain-model-com-linguagens-de-script/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 07:17:18 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[DSL]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Fluent Interface]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[linguagens dinâmicas]]></category>
		<category><![CDATA[Rhino]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2008/01/22/regras-dinamicas-no-domain-model-com-linguagens-de-script/</guid>
		<description><![CDATA[Trabalhar com Orientação a Objetos em aplicações comerciais é trabalhoso porque envolve necessariamente outros paradigmas (como bancos de dados relacionais), além de requisitos não funcionais da sua arquitetura (como segurança, concorrência, etc) impedindo uma modelagem pura. Em aplicações que realmente existem lógica de negócios e não apenas um conjunto de cadastros e relatórios, a utilização [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhar com Orientação a Objetos em aplicações comerciais é trabalhoso porque envolve necessariamente outros paradigmas (como bancos de dados relacionais), além de requisitos não funcionais da sua arquitetura (como segurança, concorrência, etc) impedindo uma modelagem  pura. Em aplicações que realmente existem lógica de negócios e não apenas um conjunto de cadastros e relatórios, a utilização de uma abordagem com &#8220;Domain Driven Design&#8221; se faz necessária para a redução da complexidade no coração do software, ou seja, na camada responsável pelo modelo do negócio.</p>
<p>A abordagem de Domain Model proposta por Eric Evans, consegue isolar o núcleo do sistema (responsável pela lógica de manipulação das informações e processos de negócios) abstraindo das particularidades da arquitetura por meio de suas técnicas modernas e maduras. Mesmo assim o esforço de isolamento não é tão claro mesmo para coisas triviais como segurança, onde existe uma linha tênue entre o que é requisito funcional ou não.</p>
<p>Na construção do seu modelo, a profusão de abordagens como Fluent Interfaces e DSL ajudam a maximizar o entendimento do negócio, mas ainda assim restam dúvidas de como e onde aplicar adequadamente.</p>
<h2>Confusão</h2>
<p>Tenho visto muitos bons desenvolvedores caírem na onda do Hype e se tornarem <strong><em>fanboys</em></strong> &#8220;*-tards&#8221; e saírem por aí alegando que a linguagem X ou outra coisa qualquer é evolução do Java/C# ou coisas desse tipo, comparando linguagens de abordagens tão distintas entre si e até de paradigmas diferentes. Esse pessoal esquece &#8220;o porquê&#8221; de existirem tipos estáticos e dinâmicos, fortes e fracos. Uma linguagem funcional não é evolução de uma linguagem orientada a objetos, se bem que o vice-versa é contraditório porque alguns autores alegam que o object calculi seria evolução do lambda-calculi. Linguagens de tipos dinâmicos não são evolução de tipos estáticos, já existiam e servem para propósitos diferentes. Da mesma forma existem <strong><em>JAVAtards</em></strong> que esquecem que existem outras funcionalidades que Java não implementa (lembre-se que você não cria um <a href="http://en.wikipedia.org/wiki/MapReduce">MapReduce</a> sem conhecimentos profundos de programação funcional).</p>
<p>O  ponto principal é que os tipos estáticos são importantes em linguagens imperativas e são importantes na definição da camada de negócio, mas linguagens dinâmicas também o são, pela agilidade nas mudanças e na complexidade da arquitetura. Imagine o custo de um deploy para cada refactoring e mudança em uma arquitetura JEE e compare com o mesmo nível de complexidade de mudança em PHP ou Ruby.</p>
<p>O mais comum ultimamente é a divisão da camada de negócios em duas zonas distintas: uma estática, implementada com uma linguagem estática e fortemente tipada como Java; e uma dinâmica, implementada com o sabor de script que você goste, como ruby, javascript ou python.</p>
<h2>Camada estática</h2>
<p>Existem princípios em qualquer negócio que por mais ágil que esse negócio seja e mude constantemente, esses princípios nunca mudam, são aquelas funcionalidades facilmente detectadas na modelagem tradicional, onde se detecta o caminho principal de um ator pelo caso de uso e podemos prever os caminhos alternativos.</p>
<p>Alguns pseudoanalistas imaginam que todas as funcionalidades se revelam na modelagem tradicional e se não cobriu todas as possibilidades é porque falhou o processo de desenvolvimento. Essas funcionalidades facilmente detectáveis e controláveis fazem parte da camada estática do seu modelo, não devem mudar nunca ou muito pouco em relação à vida útil do software.</p>
<p>Imagine um sistema contábil, os princípios de crédito e débito, plano de contas, livros contábeis, a própria operação de contabilização a partir de documentos entre outros aspectos são os mesmos há uns 200 anos e mudaram muito pouco nesse tempo todo. Falo sobretudo da contabilidade fiscal. Uma modelagem desses princípios vai sofrer pouca alteração durante toda a vida útil do software.</p>
<p>Imagine o sistema jurídico, é praticamente o mesmo dos romanos. Imagine  um sistema de vendas, desde a troca de sal por um carneiro, surgimento da moeda ao cartão de crédito, os princípios são os mesmos.</p>
<p>Para implementar essa camada, uma linguagem de tipos fortes e estáticos é o mais indicado.</p>
<h2>Camada dinâmica</h2>
<p>Agora imagine toda a contabilidade gerencial que é realizada com base na contabilidade fiscal. Imagine todas as operações possíveis e combinações imaginárias de vendas. Todos os cálculos de impostos que os governos mudam todo ano. A análise e modelagem total dos casos de usos é praticamente impossível e se mostrou inviável ao longo do tempo.</p>
<p>Alguém pode sugerir a utilização de métodos ágeis para solucionar esse problema em linguagens estáticas mas não é o bastante. Os métodos ágeis surgiram para prepararem as equipes para as mudanças, suavizar o impacto que refactoring causam no código. Observem que estamos falando apenas de negócio, puro negócio. Os métodos ágeis não dizem como fazer o seu código, eles te auxiliam.</p>
<p>A abordagem de utilizar uma linguagem dinâmica para esses requisitos mutáveis e tardiamente diagnosticáveis  se mostrou eficientíssima. Isolamos parte do Domain Model para ser provido de uma linguagem dinâmica (de script de preferência), e concentramos na facilidade de montar um idioma comum para a equipe sem o custo de build ou deploy de linguagens estáticas.</p>
<h3>Segmentação</h3>
<p>Dividimos então essa camada dinâmica em duas camadas interiores: uma da própria linguagem dinâmica que facilita as modificações ágeis (aconselhavelmente com Fluent Interfaces); e outra mais rebuscada, criada para a criação de regras (DSL com ou sem Fluent Interfaces) e uma linguagem comum entre a equipe e os operadores do sistema que são geralmente não técnicos mas treinados para isso.</p>
<h2>Implementação</h2>
<p>Trabalhemos com esse pequeno exemplo, tenho uma operação <em>fecharVenda</em> de uma hipotetica classe Venda que entre suas responsabilidades, existe a geração de comissão do vendedor.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fecharVenda<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 ...
	<span style="color: #666666; font-style: italic;">//pre-execução</span>
 	<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">vendedor</span>.<span style="color: #006633;">setComissao</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">valorTotal</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//pos-execução</span>
...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Agora imagine que surgiu uma modificação no sistema, existem dois percentuais diferentes. Isso é moleza, você refatora a operação com a modificação:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fecharVenda<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 ...
&nbsp;
	<span style="color: #666666; font-style: italic;">//pre-execução</span>
	<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">tipo</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;VendaTipo1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">vendedor</span>.<span style="color: #006633;">setComissao</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">valorTotal</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">tipo</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;VendaTipo2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">vendedor</span>.<span style="color: #006633;">setComissao</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">valorTotal</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">//pos-execução</span>
...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Ah! Mas eu sou esperto, criei uma propriedade lá que amarro o tipo de documento com o percentual apropriado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fecharVenda<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 ...
	<span style="color: #666666; font-style: italic;">//pre-execução</span>
	<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">vendedor</span>.<span style="color: #006633;">setComissao</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">valorTotal</span> 
                   <span style="color: #339933;">*</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">vendedor</span>.<span style="color: #006633;">getPercentualApropriado</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: #666666; font-style: italic;">//pos-execução</span>
...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Daí chega o seu cliente todo fogoso e diz que a regra mudou, agora não é mais no total da nota e sim nos ítens, cada item pode ter um percentual diferente. O caminho mais usual é você refatorar o item e copiar a propriedade para lá, percorrer todos os produtos no método fecharVenda e calcular a comissão, claro, deixando a abordagem atual comentada caso o cliente deseje voltar como era antes.</p>
<h3>Usando uma linguagem de Script</h3>
<p>Observe no comentário //pre e //pos execução, que acha de injetar uma chamada a um script no método?</p>
<p>Você faria essa última modificação assim em javascript (com Rhino):</p>
<p>Chamada ao Script que será injetado no modelo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">ScriptEngineManager factory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ScriptEngineManager<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ScriptEngine engine <span style="color: #339933;">=</span> factory.<span style="color: #006633;">getEngineByName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;JavaScript&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
	engine.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;lista&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">itens</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	engine.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;vendedor&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">vendedor</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	engine.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nf&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	engine.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;total&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">total</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	engine.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;totalDescontos&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">totalDescontos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">String</span> path <span style="color: #339933;">=</span> NotaFiscal.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getResource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;script.js&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	engine.<span style="color: #006633;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileReader</span><span style="color: #009900;">&#40;</span>path<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">total</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Double</span><span style="color: #009900;">&#41;</span> engine.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;total&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">totalDescontos</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Double</span><span style="color: #009900;">&#41;</span> engine.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;totalDescontos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ScriptException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	e.<span style="color: #006633;">printStackTrace</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: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">FileNotFoundException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Código no script.js:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</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> _$ <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>els<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;">elements</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> iterator <span style="color: #339933;">=</span> els.<span style="color: #660066;">iterator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>iterator.<span style="color: #660066;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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;">elements</span>.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>iterator.<span style="color: #660066;">next</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: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	_$.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		each<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> len <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">elements</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> len<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				fn.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">elements</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</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: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		comissionar<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>vendedor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> comissao <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				vendedor.<span style="color: #660066;">comissao</span> <span style="color: #339933;">+=</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">total</span> <span style="color: #339933;">*</span> e.<span style="color: #660066;">percentual</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span>comissao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</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: #003366; font-weight: bold;">new</span> _$<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</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: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lista'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">comissionar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Fortemente inspirado no código do prototype resolvi o problema temporariamente sem precisar refatorar o código da aplicação e deixei aberto para quantas modificações forem necessárias nessa parte que é variável.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/01/22/regras-dinamicas-no-domain-model-com-linguagens-de-script/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Não use notação estranha</title>
		<link>http://www.milfont.org/tech/2008/01/21/nao-use-notacao-estranha/</link>
		<comments>http://www.milfont.org/tech/2008/01/21/nao-use-notacao-estranha/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 17:11:13 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[notação hungara]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2008/01/21/nao-use-notacao-estranha/</guid>
		<description><![CDATA[A notação húngara teve sua época e sua utilidade, basicamente serve para diferenciar tipos. Hoje com o avanço das IDEs, nem linguagens de tipos fracos precisam de notação húngara. A notação húngara influenciou outras áreas como Banco de dados. Criaram notações para objetos de banco devido às deficiências das ferramentas em identificar tipos, os DBAs [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_h%C3%BAngara">notação húngara</a> teve sua época e sua utilidade, basicamente serve para diferenciar tipos. Hoje com o avanço das IDEs, nem linguagens de tipos fracos precisam de <a href="http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_h%C3%BAngara">notação húngara</a>.</p>
<p>A notação húngara influenciou outras áreas como Banco de dados. Criaram notações para objetos de banco devido às deficiências das ferramentas em identificar tipos, os DBAs mantiveram o costume de padronizar os nomes dos artefatos com prefixos e as vezes tambem com sufixos. Na SEAD-Ce   usávamos &#8220;TB_&#8221; como prefixo de tabelas para diferenciar de &#8220;TR_&#8221; para triggers. Isso tem uma valia grande para um DBA na hora de listar os objetos no Oracle ou criar rotinas de manipulação.</p>
<p>Mas pelo amor de Javé, não use isso em uma linguagem orientada a objetos, ainda mais com tipos fortes e estáticos como JAVA.</p>
<p>Imagine a seguinte situação em java:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">Class</span> Categoria <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nomeCategoria<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//segue ...</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Se nome é uma propriedade da classe Categoria, para que diabos nomear como nomeCategoria? Com qual Objetivo? Qual a vantagem que isso trás?</p>
<p>O pior é definirem padrões semelhantes ao que o DBA (que tem necessidade disso) define para seus artefatos em uma linguagem OO. Vi padrão definido como &#8220;usar as três primeiras letras da classe antes das propriedades&#8221; e todo tipo de monstruosidade.</p>
<p>Nem que voce me prove que usa o bloco de notas para programar, eu ficaria convencido da real utilidade disso.</p>
<p>Dar manutenção em código desse tipo mais atrapalha do que ajuda, fora que construir também nunca vi utilidade nisso.</p>
<p>Usar notação Java padronizada pela SUN tudo bem , como definir o nome de variáveis em minúsculo e as demais palavras com a primeira letra em maiúsculo, mesmo assim é uma sugestão para facilitar o reconhecimento pela comunidade, se você não quiser seguir o código compila numa boa. Outras comunidades definem a segunda palavra separada por &#8220;_&#8221; como data_inicio. Mas nada de PTcaixaDoisDTO por favor.</p>
<p>Não invente notação estranha para seu código, imagine que a pessoa que vai dar manutenção é o <a href="http://en.wikipedia.org/wiki/Dexter_Morgan">Dexter Morgan</a> e ele sabe seu endereço.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/01/21/nao-use-notacao-estranha/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Herança no Javascript</title>
		<link>http://www.milfont.org/tech/2008/01/05/heranca-no-javascript/</link>
		<comments>http://www.milfont.org/tech/2008/01/05/heranca-no-javascript/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 20:14:51 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[Nicholas C. Zakas]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2008/01/05/heranca-no-javascript/</guid>
		<description><![CDATA[Herança é capacidade de um objeto reusar (herdar) os métodos e propriedades de outro objeto. O modelo de orientação a objetos baseado em protótipos, estabelece que um objeto serve de &#8220;molde&#8221; ou &#8220;base&#8221; (protótipo) para outro e a herança em javascript adiciona a propriedade global &#8220;instanceof&#8221; para definir se um objeto &#8220;é&#8221; do mesmo tipo [...]]]></description>
			<content:encoded><![CDATA[<p>Herança é capacidade de um objeto reusar (herdar) os métodos e  propriedades de outro objeto. O modelo de orientação a objetos baseado em protótipos, estabelece que um objeto serve de &#8220;molde&#8221; ou &#8220;base&#8221;  (protótipo) para outro e a herança em javascript adiciona a propriedade global  &#8220;instanceof&#8221; para definir se um objeto &#8220;é&#8221; do mesmo tipo do objeto base  (protótipo). Para implementar a herança, voce define um  objeto base (protótipo) que fornecerá as características aos outros  objetos.</p>
<p>Todos os objetos definidos pelo desenvolvedor são candidatos a  objeto base. Como medida de segurança as classes Native e Host não  estão eleitos a servirem como objetos base.</p>
<p>Selecionado o objeto base, agora voce pode criar os objetos que herdarão e modificarão o objeto base conforme os requisitos. Os  objetos filhos criados pelo desenvolvedor herdam todas as propriedades  e métodos do objeto base, incluindo o construtor e as implementações de  métodos. Lembrando que todas as propriedades e métodos são públicos,  então os objetos podem acessá-los diretamente. Esses objetos podem  adicionar novas propriedades e métodos não presentes no objeto base ou  reescrever com novas implementações.</p>
<h3>Keyword <em>This</em></h3>
<p>A palavra chave <em>This</em> faz referência ao escopo do objeto onde ela está sendo chamada.</p>
<p>Como o uso  do <em>This</em> no ECMAScript existe a possibilidade de emular os  escopos privados usando a palavra chave <em>var</em>, já que por default a linguagem só conhece o escopo  público.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> objetoY<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> variavel_privada <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Essa variável é privada&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">variavel_publica</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Essa variável é pública&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nesse código a variável denominada &#8220;variavel_privada&#8221; não é propriedade  do objeto &#8220;objetoY&#8221; e sim uma propriedade local ao contexto desse  objeto, simulando assim uma variável privada já que outros contextos  não terão acesso a ela, apenas métodos e propriedades internas ao  objeto, enquanto a propriedade  &#8220;variavel_publica&#8221; faz parte do objeto e é de escopo público.</p>
<h3><strong>Herança via Object masquerading</strong></h3>
<p>É uma estratégia que  emula a herança, um construtor associa todas as propriedades e métodos  (com o paradigma de declaração de Construtor) usando a keyword &#8220;<em>this</em>&#8221;  para o contexto interno do qual foi referenciado. Porque o construtor é  como uma função, voce pode montar o construtor de um objeto &#8220;A&#8221; dentro  de um método de um objeto &#8220;B&#8221; e chamá-lo. O objeto &#8220;B&#8221; então recebe as  propriedades e métodos definidos no construtor de &#8220;A&#8221; porque o <em>this</em> agora aponta para o contexto do novo objeto.</p>
<p>Cria o objeto que servirá de base:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> A<span style="color: #009900;">&#40;</span>sColor<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;">color</span> <span style="color: #339933;">=</span> sColor<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sayColor</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;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">color</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></pre></div></div>

<p>Agora  eu crio o objeto chamado de &#8220;B&#8221; que herdará de &#8220;A&#8221;, quando eu chamo o  objeto &#8220;A&#8221;, ele é referenciado ao contexto interno e o &#8220;<em>this</em>&#8221; passa a pertencer a &#8220;B&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> B<span style="color: #009900;">&#40;</span>sColor<span style="color: #339933;">,</span> sName<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;">newMethod</span> <span style="color: #339933;">=</span> A<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">newMethod</span><span style="color: #009900;">&#40;</span>sColor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">delete</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">newMethod</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #000066;">name</span> <span style="color: #339933;">=</span> sName<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sayName</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;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #000066;">name</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></pre></div></div>

<p>Ao executar essas sentenças:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> objA <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ClassA<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'red'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> objB <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ClassB<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'blue'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Nicholas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
objA.<span style="color: #660066;">sayColor</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;">//outputs 'red'</span>
objB.<span style="color: #660066;">sayColor</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;">//outputs 'blue'</span>
objB.<span style="color: #660066;">sayName</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;">//outputs 'Nicholas'</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>objB <span style="color: #000066; font-weight: bold;">instanceof</span> A <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//false</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>objB <span style="color: #000066; font-weight: bold;">instanceof</span> B <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//true</span></pre></div></div>

<p>Temos as mesmas chamadas de A em B com emulação completa da herança.</p>
<p>Como  perceberam, Object Masquerading suporta a implementação de múltipla  herança, mas como se trata de uma estratégia de emulação, essa abordagem não define  o tipo do objeto que herda semelhante aos tipos herdados e portanto  falha ao tentar comparar pelo &#8220;<em>instanceof</em>&#8220;.</p>
<h3><strong>Herança via métodos call() e apply()</strong></h3>
<p>Os métodos globais <em>call</em> e <em>apply</em> (que todo objeto herda do objeto Global) são estratégias semelhantes ao  &#8220;Object Masquerading&#8221; e importam o contexto de um objeto ao outro.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">call<span style="color: #009900;">&#40;</span>Objeto<span style="color: #339933;">,</span> argumento1<span style="color: #339933;">,</span> argumento2<span style="color: #339933;">,</span> ...<span style="color: #009900;">&#41;</span>
apply<span style="color: #009900;">&#40;</span>Objeto<span style="color: #339933;">,</span> array<span style="color: #339933;">-</span>de<span style="color: #339933;">-</span>argumentos<span style="color: #009900;">&#41;</span></pre></div></div>

<p>Se diferenciam somente no quesito que se refere aos parâmetros  passados, onde o método call recebe uma sequencia de parâmetros, enquanto o método apply recebe um array de parâmetros.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> nome<span style="color: #009900;">&#40;</span>sPrefixo<span style="color: #339933;">,</span> sSufixo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>sPrefixo <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">parametro_interno</span> <span style="color: #339933;">+</span> sSufixo<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: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Object<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">parametro_interno</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Milfont'</span><span style="color: #339933;">;</span>
nome.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>obj<span style="color: #339933;">,</span> <span style="color: #3366CC;">'O '</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">' é o mais elegante. '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Observe  que nesse exemplo a função &#8220;nome&#8221; está definida fora do objeto &#8220;obj&#8221; e  associa a propriedade parametro_interno a seu próprio contexto, utilizamos o método  call para passar  o objeto &#8220;obj&#8221; ao contexto da função &#8220;nome&#8221; e a  sequência de parâmetros esperados pelo seu construtor.</p>
<p>A função apply se comporta da mesma maneira e difere apenas na execução:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">nome.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span>obj<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'O '</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">' é o mais elegante. '</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ao invés de passar os parâmetros em sequência, passamos um array com a sequência desses parâmetros.</p>
<p>A vantagem do método apply é que toda função tem uma propriedade chamada <em>arguments</em> que herda do objeto Global e facilita a implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> A<span style="color: #009900;">&#40;</span>sNome<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> sNome<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">digaNome</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;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</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>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> B<span style="color: #009900;">&#40;</span>sNome<span style="color: #339933;">,</span> sName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    A.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sobrenome</span> <span style="color: #339933;">=</span> sName<span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">digaSobrenome</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;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sobrenome</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></pre></div></div>

<p>Aqui  temos dentro da função &#8220;B&#8221; a chamada de &#8220;A&#8221; passando pelo método apply  o contexto de &#8220;B&#8221; para o interior da função &#8220;A&#8221;, observe que repassa a  propriedade <em>arguments </em>que é um array de argumentos recebidos.</p>
<p>Executando, teríamos:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> objA <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> A<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'martins'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> objB <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Christiano'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'milfont'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
objA.<span style="color: #660066;">digaNome</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;">// 'martins'</span>
objB.<span style="color: #660066;">digaNome</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;">// 'Christiano'</span>
objB.<span style="color: #660066;">digaSobrenome</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;">// 'milfont'</span></pre></div></div>

<h3><strong>Herança via <em>Prototype</em></strong></h3>
<p>A  forma de herança atualmente reconhecida pela especificação é a <em>cadeia  de protótipos</em> ou <em>Prototype chaining</em>. Utilizando a propriedade <em>prototype</em> que todos os objetos herdam de Global, voce associa o contexto (métodos  e propriedades) a outro objeto e o qualifica a ser do mesmo tipo do  objeto que ele está recebendo.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> A<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
A.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'red'</span><span style="color: #339933;">;</span>
A.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">digaNome</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;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</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: #003366; font-weight: bold;">function</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
B.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> A<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Aqui a função B recebe todos os métodos e propriedades de A e passa a ser do tipo dela, executando teríamos:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> objA <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> A<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> objB <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
objA.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'martins'</span><span style="color: #339933;">;</span>
objB.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Christiano'</span><span style="color: #339933;">;</span>
objA.<span style="color: #660066;">digaNome</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;">// martins</span>
objB.<span style="color: #660066;">digaNome</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;">// Christiano</span>
&nbsp;
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>objB <span style="color: #000066; font-weight: bold;">instanceof</span> A<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>objB <span style="color: #000066; font-weight: bold;">instanceof</span> B<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span></pre></div></div>

<p>Formas híbridas podem ser usadas, mesclando esses métodos na construção dos objetos.</p>
<h3><strong>Multipla herança</strong></h3>
<p>Algumas linguagens orientadas a  objetos habilitam o suporte à múltipla herança. Que é a capacidade de  um objeto herdar as propriedades (métodos e atributos) de mais de um  objeto. Além que esse objeto passa a ser da espécie dos objetos que ele  herda, como por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Passaro<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;">nome</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'papagaio'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">function</span> Produto<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;">valor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'R$10,00'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
Passaro.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Produto<span style="color: #339933;">;</span>
Passaro.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">imprimir</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;">valor</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' - '</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></pre></div></div>

<p>Uma classe PetStore poderia realizar um teste se o periquito é dos  tipos Produto e Passaro para aplicar medicamento adequado à espécie por  exemplo, esse tipo de construção é comum em linguagens como C, é simulado em Java por meio de interfaces.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> passaro <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Passaro<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="color: #009900;">&#40;</span>Produto<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// saida: true</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="color: #009900;">&#40;</span>Passaro<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// saida: true</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro.<span style="color: #660066;">imprimir</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;">// saida: &quot;R$10,00 - papagaio&quot;</span></pre></div></div>

<p>Javascript não suporta múltipla herança pelo método de prototype que é  o método que define o tipo do objeto, existe entretanto como contornar  isso, um exemplo é a biblioteca zInherit  (<a href="http://www.nczonline.net/downloads/">http://www.nczonline.net/downloads/</a>) de Nicholas C. Zakas  (<a href="http://www.nczonline.net/writing/">http://www.nczonline.net/writing/</a>), autor dos excelentes livros  &#8220;Professional Ajax&#8221; e &#8220;Professional JavaScript for Web  Developers&#8221;.</p>
<p>Esse script acrescenta os métodos inheritFrom e instanceOf ao objeto nativo Object.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Biologia<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;">reino</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'animal'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">function</span> Produto<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;">valor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'R$10,00'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">function</span> Passaro<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    Produto.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Biologia.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</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: #3366CC;">'periquito'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
Passaro.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">inheritFrom</span><span style="color: #009900;">&#40;</span>Produto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Passaro.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">inheritFrom</span><span style="color: #009900;">&#40;</span>Biologia<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Passaro.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">imprimir</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;">reino</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' - '</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">valor</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' - '</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>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> passaro <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Passaro<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro.<span style="color: #000066; font-weight: bold;">instanceOf</span><span style="color: #009900;">&#40;</span>Produto<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//saida : true</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro.<span style="color: #000066; font-weight: bold;">instanceOf</span><span style="color: #009900;">&#40;</span>Biologia<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//saida : true</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="color: #009900;">&#40;</span>Passaro<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//saida : true</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>passaro.<span style="color: #660066;">imprimir</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;">// saida: &quot;animal - R$10,00 - papagaio&quot;</span></pre></div></div>

<p>O metodo apply() habilita a aplicar um método de outro objeto no contexto de um objeto diferente.</p>
<p>Os frameworks modernos como ExtJS e YUI tem suas formas de implementarem a múltipla herança. Uma das formas mais utilizadas pelos <a href="http://www.milfont.org/tech/2007/10/11/frameworks-ajax/">Frameworks Ajax</a> é copiarem os métodos e variáveis de um protótipo ao objeto que herdará.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/01/05/heranca-no-javascript/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Estudar para que se eu já sei o que fazer</title>
		<link>http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/</link>
		<comments>http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 19:52:41 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/</guid>
		<description><![CDATA[Tenho severas cr&#237;ticas ao modelo educacional, principalmente o superior. Vou e volto para a faculdade de tempos em tempos, minha escola real est&#225; nos livros, a faculdade &#233; pelo diploma porque a falta dele as vezes fecha portas que n&#227;o tem como serem abertas e em determinados momentos precisam serem ultrapassadas. Minhas cr&#237;ticas derivam principalmente [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho severas cr&iacute;ticas ao modelo educacional, principalmente o superior. Vou e volto para a faculdade de tempos em tempos, minha escola real est&aacute; nos livros, a faculdade &eacute; pelo diploma porque a falta dele as vezes fecha portas que n&atilde;o tem como serem abertas e em determinados momentos precisam serem ultrapassadas.</p>
<p>Minhas cr&iacute;ticas derivam principalmente da fal&aacute;cia e do sofismo, as pessoas acreditam que possuir um n&iacute;vel superior  as credita para a qualifica&ccedil;&atilde;o necess&aacute;ria a uma determinada tarefa simplesmente. Quantos alunos est&atilde;o se formando esse ano em Ci&ecirc;ncia da Computa&ccedil;&atilde;o sem a necess&aacute;ria qualifica&ccedil;&atilde;o? A maioria? Todos? Nenhum? Como saber se n&atilde;o existe um mecanismo eficiente de provar isso?</p>
<p>Na aus&ecirc;ncia de um mecanismo eficiente, o mercado sempre adota pontos factuais para basear suas contrata&ccedil;&otilde;es, e uma delas &eacute; o porte de um diploma de curso superior.</p>
<p>Fiz quase todas as cadeiras que envolvem desenvolvimento de software: Estrutura de dados, laborat&oacute;rio 1 e 2, t&eacute;cnicas de programa&ccedil;&atilde;o 1 e 2, l&oacute;gica matem&aacute;tica, teoria da computa&ccedil;&atilde;o, entre outras que n&atilde;o lembro no momento. Em todas essas cadeiras nunca ouvi o professor(a) sequer mencionar coisas como: <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Closure</a>, <a href="http://en.wikipedia.org/wiki/Currying">Currying</a>, <a href="http://en.wikipedia.org/wiki/Continuation">Continuation</a>, <a href="http://en.wikipedia.org/wiki/Design_by_contract">Design By Contract</a>, <a href="http://en.wikipedia.org/wiki/Actor_model">Actor model</a>, <a href="http://en.wikipedia.org/wiki/Lazy_evaluation">Lazy evaluation</a>, <a href="http://en.wikipedia.org/wiki/Tail_recursion">Tail recursion</a>, <a href="http://en.wikipedia.org/wiki/Quine_%28computing%29">Quine</a>, <a href="http://en.wikipedia.org/wiki/Engine_%28computer_science%29">Engine</a>, <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov substitution principle</a>, &#8230; mais algumas coisas que n&atilde;o lembrei no momento &#8230;</p>
<p>O b&aacute;sico de orienta&ccedil;&atilde;o a objetos &eacute; ensinado, o aluno consegue at&eacute; responder o que &eacute; heran&ccedil;a e encapsulamento, mas eu nunca vi sequer mencionarem Orienta&ccedil;&atilde;o a Objetos <a href="http://en.wikipedia.org/wiki/Prototype-based_programming">Prototype-based</a>, a&iacute; tenho que me deparar com gente dizendo que Javascript ou Lua fede porque simplesmente n&atilde;o entende como funciona os conceitos e acha estranho a sintaxe das linguagens. </p>
<p>Eu mesmo passei a faculdade inteira  sem discutir <a href="http://en.wikipedia.org/wiki/Design_pattern">design patterns</a>, com exce&ccedil;&atilde;o de <a href="http://en.wikipedia.org/wiki/Data_Access_Object">DAO</a>, que eventualmente pula na frente dos alunos em alguma cadeira obscura de &quot;desenvolvimento web&quot; (sic). Hoje um amigo estava impressionado com as recomenda&ccedil;&otilde;es que o pessoal da SUN passou sobre o GoF na <a href="http://www.cejug.org/display/cejug/Caravana+Sun+2007">caravana de ontem</a>, e eu falei para ele que isso &eacute; naftalina, s&eacute;rio, se em 2007, o GoF &eacute; novidade para voc&ecirc;, algo de muito s&eacute;rio aconteceu com sua forma&ccedil;&atilde;o. </p>
<p>Tive um professor muito bom, H&eacute;lio Moura, que usava na &eacute;poca a primeira edi&ccedil;&atilde;o do livro &quot;<a href="http://www.amazon.com/Applying-UML-Patterns-Craig-Larman/dp/0137488807/ref=sr_1_3/103-8969754-9514222?ie=UTF8&amp;s=books&amp;qid=1193944157&amp;sr=1-3">Applying UML and Patterns</a>&quot;(que &eacute; de 1997 e faz portanto 10 anos) do <a href="http://en.wikipedia.org/wiki/Craig_Larman">Craig Larman</a>, refer&ecirc;ncia na &eacute;poca para RUP, e passou alguns princ&iacute;pios legais como <a href="http://en.wikipedia.org/wiki/GRASP_%28Object_Oriented_Design%29">GRASP</a>, <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a>, <a href="http://en.wikipedia.org/wiki/Open/closed_principle">Open/closed principle</a>, entre mais algumas coisas legais que n&atilde;o lembro agora. Mas isso foi uma exce&ccedil;&atilde;o, e esse professor n&atilde;o ministra mais aulas na faculdade onde estudo. Isso era coisa de 99 ou 2000, in&iacute;cio do mil&ecirc;nio, vi que os professores de l&aacute; ainda usam a mesma vers&atilde;o do livro do <a href="http://www.craiglarman.com">Craig</a>. Detalhe, j&aacute; estamos na <a href="http://www.amazon.com/Applying-UML-Patterns-Introduction-Object-Oriented/dp/0131489062/ref=sr_1_2/103-8969754-9514222?ie=UTF8&amp;s=books&amp;qid=1193944157&amp;sr=1-2">terceira edi&ccedil;&atilde;o</a> e com mudan&ccedil;as significativas. </p>
<p>Agora <a href="http://martinfowler.com/books.html#eaa">PoEAA</a> do <a href="http://martinfowler.com/">Martin Fowler</a> que &eacute; bom, voce vai passar batido, nem tenha <a href="http://martinfowler.com/eaaCatalog">esperan&ccedil;a de discutir isso</a> em sala de aula. </p>
<p><a href="http://en.wikipedia.org/wiki/Domain_model">Domain Model</a>? isso &eacute; anos-luz da academia brasiliana, v&aacute; <a href="http://martinfowler.com/eaaCatalog/domainModel.html">estudar</a> que &eacute; melhor. <a href="http://domaindrivendesign.org/">Domain Driven Design</a> tamb&eacute;m &eacute; assunto inexistente, procure <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">outra freguesia</a>. </p>
<p><a href="http://en.wikipedia.org/wiki/Agile_software_development">Metodologias &aacute;geis</a>, enquanto a academia est&aacute; descobrindo XP (timidamente claro), o mercado j&aacute; discute a fus&atilde;o entre <a href="http://en.wikipedia.org/wiki/Extreme_Programming">XP</a>, <a href="http://en.wikipedia.org/wiki/Scrum_(development)">Scrum</a>, <a href="http://en.wikipedia.org/wiki/Feature_Driven_Development">FDD</a>, <a href="http://en.wikipedia.org/wiki/Crystal_Clear_(software_development)">Crystal</a>, <a href="http://en.wikipedia.org/wiki/Dynamic_Systems_Development_Method">DSDM</a>. At&eacute; a Microsoft tem m&eacute;todos &aacute;geis enquanto a academia consolida UPs como novidade. </p>
<p>A maioria sai da faculdade monoglota, com apenas o conhecimento espec&iacute;fico de uma linguagem de programa&ccedil;&atilde;o, enquanto deveriam estudar princ&iacute;pios, est&atilde;o estudando linguagem. <a href="http://en.wikipedia.org/wiki/Functional_programming">Programa&ccedil;&atilde;o funcional</a> at&eacute; pode ser vista, talves raramente em uma cadeira de calculo, ou IA (com LISP) se der tempo, alguns confundem senten&ccedil;as com paradigmas, tinha um professor que falava que por a linguagem ter senten&ccedil;a condicional como um &quot;IF&quot;, ela n&atilde;o poderia ser considerada 100% Orientada a objetos, entre outras sandices bizarras. DSL? bah! </p>
<p>Conversando com um amigo dia desses l&aacute; na faculdade, entramos no assunto banco de dados, sem querer surgiu no meio da discuss&atilde;o sobre <a href="http://en.wikipedia.org/wiki/Database_normalization">formas normais</a>, para minha surpresa ele disse que n&atilde;o sabia do que eu estava falando, achei estranho porque o professor de banco de dados 1, cadeira respons&aacute;vel por esse conte&uacute;do, &eacute; um excelente professor, <a href="http://paginas.terra.com.br/informatica/fsiqueira/">Fernando Siqueira</a>, e conhecendo ele eu sabia que n&atilde;o passaria ningu&eacute;m sem ensinar formas normais. Depois esse meu amigo voltou e falou que deu uma &quot;olhada&quot; no livro e &quot;lembrou&quot;. Ora, isso me causa apreens&atilde;o, mesmo eu sabendo que o professor tem a compet&ecirc;ncia sobre uma mat&eacute;ria e tenho certeza que a aplicou, porque um aluno simplesmente esquece o principal conte&uacute;do de uma determinada mat&eacute;ria?</p>
<p>S&atilde;o mist&eacute;rios, mas mist&eacute;rio mesmo &eacute; uma menina que se forma esse ano e n&atilde;o sabe ainda para que serve um banco de dados, mesmo evidentemente ter cursado todas as cadeiras de banco de dados. Isso sim merece estudo, tese, trabalhos cient&iacute;ficos e tudo que n&oacute;s pudessemos descobrir.</p>
<h3>Livros </h3>
<p>A minha escola real s&atilde;o os livros, tive e tenho alguns bons professores, uns poucos excelentes, mas os autores cl&aacute;ssicos s&atilde;o os mestres dos meus mestres. N&atilde;o procure livro espec&iacute;fico, procure autor, e toda a cultura por volta desse autor.</p>
<p>Posso indicar alguns que s&atilde;o a base da carreira de qualquer desenvolvedor que se preze: Alan S. Koch, Alistair Cockburn, Bertrand Meyer, Craig Larman, Eric Evans, Joshua Kerievsky, Kent Beck, Martin Fowler, Rod Johnson, Ron Jeffries, Steve McConnell, Robert C. Martin, &#8230; isso s&oacute; dando uma olhadela aqui na minha &quot;biblioteca&quot;. Sei que esqueci nomes importantes, mas se voc&ecirc; seguir essa lista, vai acabar caindo neles.</p>
<p>O pior disso tudo &eacute; que o pessoal fica empolgado com t&iacute;tulo aqui, o cara virou doutor j&aacute; se acha semi-deus, s&atilde;o praticamente inacess&iacute;veis, &eacute; muito mais facil voc&ecirc; falar com Martin Fowler do que falar com um Doutor brasileiro. </p>
<p> Ent&atilde;o voce tem duas alternativas, estudar ou frequentar a faculdade, d&aacute; para conciliar as duas, mas a prefer&ecirc;ncia ser&aacute; sempre para o estudo, ele que pagar&aacute; o leite de cada dia, ali&aacute;s&#8230; leite n&atilde;o que esse est&aacute; matando ultimamente, e ei que pensei que era a cerveja <img src='http://www.milfont.org/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2007/11/01/estudar-para-que-se-eu-ja-sei-o-que-fazer/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
	</channel>
</rss>

