<?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>marcuscavalcanti.net &#187; Arquitetura e Padrões</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/category/arquitetura-e-padroes/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Wed, 21 Jul 2010 03:52:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pensando em uma arquitetura simples para integração entre sistemas</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 15:34:20 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RESTful]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=971</guid>
		<description><![CDATA[Tentei bolar um título melhor para o tópico, porém confesso que não consegui, mas ainda assim acho que o título se aplica no que será falado nas próximas linhas.
O problema
Em um projeto pessoal recente precisei fazer a integração entre três sistemas distintos, na verdade os sistemas são distintos, mas não deveriam ser. Trata-se de um [...]]]></description>
			<content:encoded><![CDATA[<p>Tentei bolar um título melhor para o tópico, porém confesso que não consegui, mas ainda assim acho que o título se aplica no que será falado nas próximas linhas.</p>
<h3>O problema</h3>
<p>Em um projeto pessoal recente precisei fazer a integração entre três sistemas distintos, na verdade os sistemas são distintos, mas não deveriam ser. Trata-se de um site e o que ocorre é que esse mesmo site possui três módulos (sistemas) que estão em plataformas, linguagens e lugares diferentes. Conclui-se que é um projeto que foi crescendo desordenadamente e que em nenhum momento ninguém pensou em uma maneira de organizar melhor os módulos e realizar as integrações. Como esses módulos foram feitos em linguagens e plataformas diferentes, o requisito número um do cliente era que esses módulos se comunicassem e que essa comunicação fosse transparente pra ele e para quem fosse administrar o sistema.</p>
<h3>Cenário atual</h3>
<p>O site é um pequeno site de e-commerce e dos três módulos existentes, um diz respeito ao <em>frontend/backend</em> do site e é feito com .NET/SQL Server, o outro módulo é o <em>backend</em> de vendas e é feito com PHP/MySQL e o último módulo é o de <em>newsletter (mailing)</em> que também está em PHP/MySQL. O módulo de vendas foi o último a ser desenvolvido e deveria ser mantido, o problema é que o administrador do sistema precisa &#8220;inputar&#8221; todas as vendas na mão, isso mesmo, na mão! Atualmente, quando um cliente tem interesse em algum produto do site, ele envia um email ao administrador informando qual(is) o(s) produto(s) ele tem interesse e os seus dados pessoais, e por sua vez o administrador entra no módulo de vendas, cadastra esse novo cliente, cria um pedido de venda, gera um login/senha para esse cliente e envia por email para que ele possa se autenticar no módulo de venda, concluir a compra e efetuar o pagamento.</p>
<p>Além de ser algo totalmente mecânico e nada prático, não há nenhuma relação entre os módulos do site e o administrador precisa reproduzir os dados do produto, que já existe em um módulo, em outro. Eram esses problemas que deveriam ser remediados.</p>
<h3>Requisitos do cliente</h3>
<p>Um dos requisitos do cliente, era de que o site (<em>frontend e backend</em>) deveria ser construído novamente, pois o atual além de ter sido construído em uma plataforma que ele não tinha mais interesse em manter, também estava incompleto e apresentando problemas, portanto o primeiro requisito era refazer todo o site com PHP/MySQL.</p>
<p>O segundo requisito era que o processo compra de produtos deveria ser todo feito através do site, pelo cliente, e não da forma arcaica como é atualmente e que foi descrita acima.</p>
<p>O terceiro requisito era que o módulo de vendas deveria ser mantido, pois ele atendia o que o cliente precisava, sendo assim o sistema que eu iria desenvolver deveria alimentar diretamente esse módulo de vendas.</p>
<h3>Estrutura do módulo de vendas</h3>
<p>Felizmente o módulo de vendas estava construído de uma maneira que facilitou o meu trabalho, quem o desenvolveu se preocupou em criar classes de modelo, uma camada de persistência e uma camada de negócio, portanto pude pensar em uma arquitetura simples em funcional muito em função disso.</p>
<h3>Arquitetura pensada</h3>
<p>Tentei pensar em algo que não criasse uma dependência entre os sistemas e que me fizesse mexer o minímo possível, ou nada, no módulo de vendas que seria mantido. Outros fatores que levei em consideração era que eu queria algo fácil de implementar, de dar manutenção e que de certa forma fosse rápido de desenvolver.</p>
<p>Conclui o desenvolvimento do (<em>frontend/backend</em>) e parti para pensar em uma arquitetura que me permitisse fazer tudo o que citei acima e que além disso me permitisse utilizar a boa estrutura que eu encontrei no módulo de vendas.</p>
<p>Para construir o site utilizei o <a href="http://www.codeigniter.com" target="_blank" style="text-decoration: underline">Code Igniter</a>, que é um <em>framework</em> que tenho prática, e também é leve e rápido de desenvolver, mas o que vale ressaltar é que arquitetura é algo que é independente de <em>framework</em>, portanto se eu tivesse utilizado qualquer outro <em>framework</em>, ou até mesmo se eu não tivesse utilizado nenhum <em>framework</em>, não faria a mínima diferença. Nesse caso os <em>frameworks</em> escolhidos só entram como facilitadores na implantação da arquitetura.</p>
<p>Mas voltando ao foco inicial, que é explicar a arquitetura, o que eu pensei foi em criar um <a href="http://pt.wikipedia.org/wiki/Web_service" target="_blank" style="text-decoration: underline"><em>Web Service</em></a> com as operações específicas para tudo o que eu precisaria fazer no módulo de vendas, ou seja, eu precisaria identificar todas as ações que eu precisaria realizar para fazer essa integração e alimentar esse módulo. Na verdade, além de alimentar eu também precisaria recuperar algumas informações do módulo de vendas. Como os módulos (site, vendas, <em>newsletter</em>) ficariam provavelmente em servidores diferentes, em bancos diferentes e em estruturas diferentes essa era a forma mais limpa de realizar a integração sem causar dependência entre esses módulos e com isso dar manutenção seria bem mais fácil.</p>
<p>Como já estava definido que eu iria utilizar <em>Web Service</em>, eu optei por utilizar o formato <a href="http://www.xfront.com/REST-Web-Services.html" target="_blank" style="text-decoration: underline">RESTful</a>, pois eles se encaixava perfeitamente na minha necessidade: me trazia simplicidade, praticidade, facilidade, além do que no meu caso a aplicabilidade de <a href="http://en.wikipedia.org/wiki/Resource_oriented_architecture" target="_blank" style="text-decoration: underline">ROA</a>, que é o <a href="http://alexbarnett.net/blog/archive/2006/11/04/REST-Web-Services-and-ROA.aspx" target="_blank" style="text-decoration: underline">conceito que <em>Web Services</em> RESTful utilizam</a>, era muito mais evidente do que a abordagem de serviços.</p>
<p>O próximo passo era identificar os recursos necessários e criar as <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" target="_blank" style="text-decoration: underline">URI</a> que eu utilizaria nos <em>requests</em> do meu<em> Web Service</em> REST, então ficou dessa forma:</p>
<ul>
<li><em>user/new</em></li>
<li><em>user/retrieve/email</em></li>
<li><em>user/retrieve/cpf</em></li>
<li><em>order/new</em></li>
<li><em>order/save/products</em></li>
<li><em>order/retrieve/last</em></li>
<li><em>shipping/calculate</em></li>
</ul>
<p>Para desenvolver esse <em>Web Service</em> RESTful resolvi utilizar o <a href="http://framework.zend.com" target="_blank" style="text-decoration: underline">Zend Framework</a>, pois ele possui alguns componentes que me ajudariam a desenvolver esse <em>Web Service</em> mais rápido, como o <a href="http://framework.zend.com/manual/en/zend.rest.html" target="_blank" style="text-decoration: underline">suporte a <em>Web Services</em> RESTful</a>, por exemplo, o ZF também tem uma <a href="http://framework.zend.com/manual/en/zend.json.html" target="_blank" style="text-decoration: underline">API para trabalhar com JSON</a> muito boa, então esse foi outro componente do ZF que eu resolvi utilizar.</p>
<p>Como no módulo de vendas já existiam classes de modelo que representavam as <a href="http://blog.rodrigoallemand.com.br/?p=138" target="_blank" style="text-decoration: underline">entidades do meu domínio</a>, o que eu fiz foi criar uma estrutura <a href="http://json.org" target="_blank" style="text-decoration: underline">JSON</a> semelhante as essas entidades e que representaria os <a href="http://www.w3.org/TR/2002/WD-ws-arch-scenarios-20020730/#S003" target="_blank" style="text-decoration: underline"><em>requests/responses</em></a> do meu <em>Web Service</em> RESTful. Paralelo a isso criei algumas classes de apoio que serviriam como os <a href="http://static.springframework.org/spring-ws/docs/1.0-m3/reference/html/ch05s02.html" target="_blank" style="text-decoration: underline"><em>Marshallers</em> e <em>Unmarshallers</em></a> do <a href="http://www.springsource.org/" target="_blank" style="text-decoration: underline">Spring</a>. <em>Marshallers</em> e <em>unmarshallers</em> são como <em>data mappers</em>, e no meu caso servem para eu mapear um objeto JSON para um objeto PHP (classes modelo) e também realizar o inverso.</p>
<p>Dessa forma com objetos JSON convertidos para objetos PHP que representavam as minhas classes modelo eu poderia usar a camada de persistência existente na aplicação para persistir todo objeto, então no caso de salvar um novo usuário, ficou assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">function</span> saveUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	</li><li>	<span style="color: #000088;">$userObject</span> <span style="color: #339933;">=</span> Unmarshaller<span style="color: #339933;">::</span><span style="color: #004000;">user</span><span style="color: #009900;">&#40;</span>Zend_Json<span style="color: #339933;">::</span><span style="color: #004000;">decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>	<span style="color: #000088;">$conn</span> 	&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">=</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">getConnectionHandler</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	<span style="color: #000088;">$result</span> 	<span style="color: #339933;">=</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$userObject</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>&nbsp;</li><li>	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$result</span> <span style="color: #009900;">&#41;</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'response'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Usuário cadastrado com sucesso.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>	<span style="color: #b1b100;">else</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'response'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ErrorMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	 </li><li>&nbsp;</li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Bem simples, né? No exemplo acima, criei algumas classes estáticas (utilitárias), a primeira me retorna um objeto de conexão com o banco de dados e a segunda classe representa o <em>unmarshaller</em> para transformar um Objeto JSON em uma classe de modelo que representa um usuário, após isso foi só persistir o usuário e retornar as mensagens correspondentes para quem está acessando recurso.</p>
<h3>Visão geral</h3>
<p>No fluxo de salvar um novo usuário, teríamos:</p>
<p>1) Site (módulo site) deseja salvar um novo usuário;<br />
2) Site monta um objeto JSON com os dados que representam o novo usuário;<br />
3) Site acessa o <em>Web Service</em> RESTful do módulo de venda através do recurso user/new;<br />
4) No módulo de venda, o método mapeado para o recurso user/new, faz <em>unmarshaller</em> do objeto JSON mapeando os valores desse objeto JSON para uma classe de modelo;<br />
5) O usuário é persistido através do objeto que foi mapeado no passo anterior;<br />
6) O Web Service RESTful retorna a mensagem correspondente para o site.</p>
<p>Quando se fala em arquitetura é comum pensarmos em algo complexo, cheio de tecnologias, frameworks e etc, mas o foco de arquitetura não deve ser esse, o foco de arquitetura deve ser pensar em uma estrutura que prime pela organização, relacionamento e reuso dos componentes de softwares envolvidos em um sistema, onde o intuito deve ser facilitar e não complicar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Getters e Setters?</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/14/getters-e-setters/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/14/getters-e-setters/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 02:52:06 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[getter/setter]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=89</guid>
		<description><![CDATA[Logo quando comecei a programar orientado a objetos, percebi que muitas aplicações faziam o uso dos famosos pares get/set, então a primeira coisa que eu fazia ao construir uma classe, era pedir para que a IDE gerasse esses pares dos meus atributos privados antes mesmo de fazer qualquer coisa. Mas o que eu não me [...]]]></description>
			<content:encoded><![CDATA[<p>Logo quando comecei a programar orientado a objetos, percebi que muitas aplicações faziam o uso dos famosos pares get/set, então a primeira coisa que eu fazia ao construir uma classe, era pedir para que a IDE gerasse esses pares dos meus atributos privados antes mesmo de fazer qualquer coisa. Mas o que eu não me questionava, era sobre o real motivo do uso dessa dupla.</p>
<p>Hoje em dia vejo muitas aplicações que cometem esse mesmo equívoco que eu cometia há alguns anos atrás, fazem o uso do recurso (que nesse caso passaria a não ser um recurso) sem saber a razão, isso me remete até ao <a href="http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/" style="text-decoration: underline" target="_blank">meu primeiro post</a>.</p>
<p>Essa questão sobre o uso de getters e setters tem muito a ver como as coisas são feitas hoje em dia em relação ao desenvolvimento de software, principalmente em desenvolvimento para web, eu diria. Perdeu-se o seu principal foco, razões e objetivos e com isso surgem casos como o uso desenfreado dos getters e setters.</p>
<p>Getters e setters devem ser originalmente usados para encapsular seus atributos, evitando assim que eles sejam acessados diretamente. Dessa forma podemos aplicar determinada regra de negócio antes de atribuir valor a um atributo. Não é necessário, por exemplo, usar getters e setters em alguns objetos que serão imutáveis, ou então, apenas em objetos que servem para receber valor, nesses casos os getters e setters tornariam-se desnecessários.</p>
<p>Hoje em dia só faço o uso dessa dupla, quando realmente sinto essa necessidade, quando sei que meu atributo poderá vir a ter uma regra de negócio específica ou por algum motivo muito peculiar (ver mais abaixo), caso contrário, não uso. Em muitos casos passar os valores para o objeto utilizando o método construtor já resolveria o problema de forma simplória.</p>
<p>Deve-se considerar também, a possibilidade do seu software ser uma API aberta, usada e modificada por outros desenvolvedores, onde talvez você não tenha necessidade de um getter/setter, mas provavelmente para fornecer uma maior flexibilidade do código &#8211; considerando a possibilidade dele ser extendido &#8211; talvez seja interessante disponibilizar os tais pares. Da mesma forma que para <em>debugar</em> um código, talvez seja interessante fazer o uso de getters e setters para saber o valor que está sendo atribuído a uma variável, ao invés de espalhar milhões de breakpoint pelo código.</p>
<p><strong>Links Interessantes</strong><br />
<a href="http://blog.fragmental.com.br/2006/03/04/fowler-e-getters/" style="text-decoration: underline" target="_blank">Fowler e Getters</a><br />
<a href="http://martinfowler.com/bliki/GetterEradicator.html" style="text-decoration: underline" target="_blank">Getter Erradictor</a><br />
<a href="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html" style="text-decoration: underline" target="_blank">Why getter and setter methods are evil</a><br />
<a href="http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/"  style="text-decoration: underline" target="_blank">Como não aprender Java e orientação a objetos</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/14/getters-e-setters/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>OO em vários sabores</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/11/oo-em-varios-sabores/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/11/oo-em-varios-sabores/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 02:28:53 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=61</guid>
		<description><![CDATA[Provavelmente não é a primeira vez que alguém teve essa idéia, mas o Jim Weirich teve a iniciativa de criar uma página mostrando a implementação dos principais conceitos de OO em várias linguagens de programação, com suporte nativo a OO, ou não.
A idéia foi criar um problema simples e a partir disso coletar as implementações [...]]]></description>
			<content:encoded><![CDATA[<p>Provavelmente não é a primeira vez que alguém teve essa idéia, mas o <a style="text-decoration: underline" href="http://www.onestepback.org" target="_blank">Jim Weirich</a> teve a iniciativa de criar uma <a style="text-decoration: underline" href="http://onestepback.org/articles/poly/index.html" target="_blank">página</a> mostrando a implementação dos principais conceitos de OO em várias linguagens de programação, com suporte nativo a OO, ou não.</p>
<p>A idéia foi criar um problema simples e a partir disso coletar as implementações nas mais diversas linguagens, das mais loucas as mais famosas.</p>
<p>Eu dei a minha colaboração na <a style="text-decoration: underline" href="http://onestepback.org/articles/poly/oo-php5.html" target="_blank">implementação para PHP 5</a>.</p>
<p>Reparem na &#8220;facilidade&#8221; que seria <a style="text-decoration: underline" href="http://onestepback.org/articles/poly/sp-sed.html" target="_blank">resolver o problema</a> usando SED, que na verdade <a style="text-decoration: underline" href="http://aurelio.net/sed/sed-HOWTO/sed-HOWTO-2.html#toc5" target="_blank">não é considerada uma linguagem de programação</a>.</p>
<p>É a famosa discussão da melhor linguagem. Para mim não existe a melhor linguagem, cada uma tem sua finalidade e consequentemente seus pontos fortes e fracos. Nada impede que um sistema tenha várias linguagens e plataformas, não é mesmo? Aliás, felizardo são aqueles que tem essa visão e know-how de mixar tecnologias. Vide <a href="http://en.wikipedia.org/wiki/Google_platform" target="_blank" style="text-decoration: underline">Google</a>, que dentre outras usa <a href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/af75a3e91a03ec18/?pli=1" target="_blank" style="text-decoration: underline">Python</a>, <a href="http://java.sun.com/developer/technicalArticles/J2SE/google/limoore.html" target="_blank" style="text-decoration: underline">Java</a> e <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml" target="_blank" style="text-decoration: underline">C++</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/11/oo-em-varios-sabores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>frameworks x desenvolvedores</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 19:10:48 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=26</guid>
		<description><![CDATA[Outro dia na lista php-especialista rolou uma discussão no mínimo curiosa sobre o uso de frameworks. Uns defendiam os frameworks (eu era um desses) e outros eram radicalmente contra, na verdade uma pessoa era radicalmente contra.
Acompanhando a discussão e até participando, refleti sobre alguns pontos e percebi um detalhe que até então estava passando desapercebido [...]]]></description>
			<content:encoded><![CDATA[<p>Outro dia na lista php-especialista rolou uma <a style="text-decoration: underline" href="http://br.groups.yahoo.com/group/php-especialistas/message/18149" target="_blank">discussão</a> no mínimo curiosa sobre o uso de frameworks. Uns defendiam os frameworks (eu era um desses) e outros eram radicalmente contra, na verdade uma pessoa era radicalmente contra.</p>
<p>Acompanhando a discussão e até participando, refleti sobre alguns pontos e percebi um detalhe que até então estava passando desapercebido por mim: frameworks só deveriam ser usados por quem consegue e tem responsailidade ao usá-los.</p>
<p>A frase acima parece meio ambígua e talvez até agressiva, concordo, mas posso explicar melhor.</p>
<p>Tenho visto constantemente em fóruns de discussão, listas e etc, pessoas com dúvida sobre o framework X, só que grande parte dessas dúvidas não são em função de uma limitação do framework X e sim uma limitação do desenvolvedor. Vejo que por exemplo, com essa explosão dos frameworks WEB/MVC, que muitos desenvolvedores fazem o uso do framework X de forma famigerada ferindo todos os conceitos de MVC, conseguem simplesmente esquecer que o framework foi construído dentro desse padrão e que o ideal é que ele permaneça dessa forma. Quando digo isso, não digo isso porque o framework X deve ser imutável, na verdade a grande maioria dos frameworks oferece flexibilidade o suficiente para ser extendido e até alterado (que na maiora das vezes não é a melhor decisão), mas de forma que seja respeitado a sua arquitetura e &#8216;boas práticas&#8217; de design de uma aplicação.</p>
<p>Quase todos esses frameworks foram construídos usando <a href="http://java.sun.com/docs/books/tutorial/java/concepts/" target="_blank" style="text-decoration: underline">OO</a>, mas mesmo assim a maioria dos desenvolvedores que usam esses frameworks não conhecem os principais (básicos) conceitos de OO e com isso acabam tomando decisões que no futuro irá prejudicar o projeto como um todo e consequentemente irão ter o seu filme queimado. Em muitos casos a aplicação correta dos conceitos de OO <a style="text-decoration: underline" href="http://martinfowler.com/articles/enterprisePatterns.html" target="_blank">resolveriam de forma elegante e reutilizável aquele problema</a> que outros optam por resolver de forma <a style="text-decoration: underline" href="http://desciclo.pedia.ws/wiki/POG" target="_blank">bisonha</a>.</p>
<h3>Onde eu quero chegar com tudo isso?</h3>
<p>O que eu quero dizer é que todos deveríamos nos preocupar em entender como as coisas funcionam antes mesmo de usá-las, aprendi isso há bastante tempo atrás com um amigo meu na época em que agia da mesma forma que estou citando aqui, portanto compreendo perfeitamente algumas pessoas ainda agirem dessa forma, principalmente as mais inexperientes, por isso resolvi ter a iniciativa de escrever esse post e talvez gerar uma reflexão. Não sou o dono da verdade, não construo os melhores softwares do mundo, mas procuro sempre saber e entender o que eu estou usando e o que estou fazendo, pois com isso evito problemas para mim e para o meu projeto. E o principal é que evoluo.</p>
<h3>Dicas</h3>
<p>Antes de usar algo, procure se perguntar:</p>
<p>- O que eu preciso?</p>
<p>- Como &#8220;x&#8221; funciona?</p>
<p>- Usar &#8220;x&#8221; resolve o meu problema?</p>
<p>- &#8220;x&#8221; vai me ajudar ou atrapalhar?</p>
<p>- Quais são as outras alternativas a &#8220;x&#8221;?</p>
<p>Acredito que com respostas para as questões acima é possível ter uma resposta que satisfaça a necessidade real do problema e que principalmente nos deixe com a sensação de que o melhor possível foi feito, pelo menos pensado foi. E se mesmo assim algo der errado, como conhecemos o problema e a solução que fracassou, fica mais fácil (ou menos difícil?) de identificar e resolver.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/01/09/frameworks-x-desenvolvedores/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
