<?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>Saga do programador &#187; OO; Domain specific Language; Language Oriented Programming</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/oo-domain-specific-language-language-oriented-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Wed, 18 Aug 2010 13:34:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Linguagem como forma de abstração?</title>
		<link>http://www.sagadoprogramador.com.br/2009/03/linguagem-como-forma-de-abstracao/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/03/linguagem-como-forma-de-abstracao/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 17:19:30 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[OO; Domain specific Language; Language Oriented Programming]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=169</guid>
		<description><![CDATA[Muito se tem falado ultimamente em Domain Specific Language, Fluent Interfaces, Código Expressivo, mas o que estes conceitos trazem de novidade para nós da comunidade de desenvolvimento de software? Não estaríamos satisfeitos com a quantidade de técnicas e tecnologias que temos que lidar?
O grande questão a se responder é, estas tecnologias são suficientes para resolver [...]]]></description>
			<content:encoded><![CDATA[<p><span>Muito se tem falado ultimamente em <a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html" target="_blank">Domain Specific Language</a>, <a href="http://www.martinfowler.com/bliki/FluentInterface.html" target="_blank">Fluent Interfaces</a>, Código Expressivo, mas o que estes conceitos trazem de novidade para nós da comunidade de desenvolvimento de software? Não estaríamos satisfeitos com a quantidade de técnicas e tecnologias que temos que lidar?</span></p>
<p><span>O grande questão a se responder é, estas tecnologias são suficientes para resolver os problemas que temos atualmente? Java e C# com suas implementações de Orientação a Objetos são suficientes para resolver nossos problemas como desenvolvedores? </span></p>
<p><span>Em uma apresentação na <a title="TSS Barcelona" href="http://event.on24.com/eventRegistration/EventLobbyServlet?target=previewLobby.jsp&amp;eventid=92643&amp;sessionid=1&amp;key=8EF4FE3D4124E466F5A04BD0537FFDC5" target="_blank">TSS Barcelona</a>, <a href="http://martinfowler.com/">Martin Fowle</a>r e <a href="http://www.nealford.com/">Neal Ford</a> propõem uma <a href="http://www.infoq.com/news/2007/09/Language-oriented-programming">nova abordagem para construção de software</a>.Em vez de utilizarmos as técnicas de modelagem padrão de hoje, baseadas em hierarquias de objetos, o principal mecanismo de abstração seria a própria linguagem.  Eles acreditam que nossa atual camada de abstração (baseada hierarquias para modelar o mundo) tem falhado em alguns momentos.  E é justamente nestas falhas que utilizamos coisas que aumentam ainda mais a complexidade,  e nesta apresentação eles citam <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">aspectos</a> como exemplo. Se o fato de construir software é justamente tentar controlar a complexidade, por que estamos adicionando mais complexidade para resolver nossos problemas?</span></p>
<p><span><span id="more-169"></span></span></p>
<p><span>Se olharmos para trás, vamos reparar que nossa camada de abstração tem evoluído várias vezes. No início <a href="http://en.wikipedia.org/wiki/Assembly_language">assembly</a> era utilizado para construir programas de computador, mas atualmente, ninguém escreve mais nada em assembly, isto porque ela tem um baixo nível de abstração.Este fato faz com que a construção de qualquer coisa seja demorada. Os mecanismos de abstração servem para facilitar nosso trabalho como desenvolvedores de software, e é natural que sempre tentamos encontrar um nível de abstração mais adequado. Os paradigmas de desenvolvimento atuais tentam fazer isso. Orientação a Objetos ocupa um lugar muito importante atualmente e a idéia não é criar um novo paradigma, mas sim dar um passo adiante e focar na linguagem.</span></p>
<p><span>Já não é novidade que estamos sempre preocupados com a clareza e objetividade no momento da escrita de um código. Esta necessidade não é do compilador, esta é uma necessidade nossa</span><span> como</span><span> desenvolvedores. <a href="http://www.martinfowler.com/">Fowler </a>diz que a verdadeira arte de escrever programas de computador não é comunicar com a máquina, mas comunicar com outros programadores que precisam ler nosso código o tempo todo. Se observarmos, o tempo todo estamos preocupados (ou deveríamos estar, rs) com os nomes de variáveis, de métodos e de classes, que expressem de maneira mais clara possível nossa intenção.  Estes nomes formam um vocabulário.<br />
Quando nós conversamos com outra pessoa, nós utilizamos um vocabulário, mas se não pensarmos em uma forma de combinar as palavras, é possível que esta pessoa não nos entenda.<br />
É esta forma de combinar as palavras que é o foco da nova camada de abstração baseada na linguagem, sugerida por <a href="http://www.martinfowler.com/">Fowler</a> e <a href="http://www.nealford.com/">Neal Ford</a>.</span></p>
<p><span>Se pensarmos em palavras soltas, elas podem até significar algo, mas semanticamente não querem dizer muita coisa. Vamos imaginar o seguinte exemplo:</span></p>
<p><span><strong>Autor </strong> <strong>Livro </strong> <strong>Assunto</strong></span></p>
<p><span>Da forma como está escrito, estas palavras podem ser utilizadas de várias formas, em várias combinações.</span></p>
<p><span>Um </span><span><strong>Autor </strong></span><span>escreve um </span><span><strong>Livro</strong></span><span> com </span><span><strong>Assunto</strong></span><span> política.</span></p>
<p><span>Esta frase já tem algum sentido. Repare como combinamos as palavras para expressar nossas idéias.  Esta é a forma como nós comunicamos.</span></p>
<p><span>Quando utilizamos orientação a objetos para modelar o mundo, nós conseguimos montar um vocabulário. Autor, Livro, Assunto, são exemplos de palavras que fazem parte deste vocabulário. Mas OO não nos ajuda a criar uma gramática sobre este vocabulário, e é aí que entram as <a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">DSLs</a>. O que Fowler e Ford sugerem é parar de pensar unicamente no vocabulário e passar a ter a noção de linguagem, que combina vocabulário com gramática.</span></p>
<p><span>A justificativa para a utilização da linguagem como mecanismo de abstração é a falta de contexto. Quando programamos não temos a noção de contexto. Contexto é um conceito muito importante na nossa comunicação. Quando você fala com um amigo: “Fluminense vai contratar Ronaldinho”, vc não precisar dizer pra ele que Fluminense é um time de futebol, e que Ronaldinho é um grande jogador de futebol e ainda que times de futebol contratam bons jogadores. Isto está implícito. É diferente quando precisamos dizer isto para alguma API no nosso código. Vou tentar exemplificar</span><span>:</span></p>
<pre class="java">Time fluminense     = new Time(“Fluminense”);
Jogador ronaldinho = new Jogador(“Ronaldinho”);
Ronaldinho.setQualidade(“Excelente”);
Contratacao contrato = new Contrato();
contrato.setTime(fluminense);
contrato.setJogador(ronaldinho);
contrato.setValor(10.000.000,00);</pre>
<p>Bom não sei se foi o melhor exemplo, mas reparem que todas as vezes precisamos explicitamente dizer: Fluminense é um time; Ronaldinho é um jogador; Ronaldinho tem uma qualidade excelente; Existe um contrato entre fluminense e Ronaldinho. Isto porque quando falamos com uma api e frameworks eles não tem qualquer noção de contexto, temos que começar no mais baixo nível possível para explicar em detalhes o que queremos que eles façam.<br />
Agora vamos tentar utilizar a linguagem para escrever este mesmo código:</p>
<pre class="java">      AlgumTime(“fluminense”)
                     .estabeleceUmContratoCom(“Ronaldinho”)
                     .noValorDe(10.000.000,00);</pre>
<p>Observem, fizemos uma combinação de palavras (vocabulário) com uma gramática, o que forneceu para o leitor deste código (<a href="http://martinfowler.com/bliki/SyntacticNoise.html">apesar do ruído da sintaxe da linguagem</a>) uma expressão bem mais clara do que a anterior. No código acima o contexto (Contratação de jogador) está implícito, com isso evitamos repetir o código de configuração dos objetos, tornando muito mais legível e expressivo.</p>
<p>É importante destacar que nós não vamos desenvolver um sistema todo utilizando DSLs, provavelmente você vai utilizar uma linguagem como java ou c# e várias DSLs . Na minha opinião, esta técnica deverá ser utilizada na construção de APIs e Frameworks. Uma API disponibiliza um vocabulário, as DSLs adicionam a gramática formando assim uma linguagem, que é muito mais expressiva e legível.</p>
<p>Existem algumas técnicas para construção de DSLs, mas isso vai ficar para um próximo post.</p>
<p>Até mais..<br />
Luiz Costa</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/03/linguagem-como-forma-de-abstracao/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
