<?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>Coding4Food &#187; patterns</title>
	<atom:link href="http://coding4food.com/tag/patterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://coding4food.com</link>
	<description>software development and IT stuff</description>
	<lastBuildDate>Tue, 31 Aug 2010 23:47:46 +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>Porque adoramos ser genéricos ?</title>
		<link>http://coding4food.com/2008/09/03/porque-adoramos-ser-genericos/</link>
		<comments>http://coding4food.com/2008/09/03/porque-adoramos-ser-genericos/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 01:25:55 +0000</pubDate>
		<dc:creator>Eduardo Kruger</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://coding4food.com/?p=147</guid>
		<description><![CDATA[Passamos a maior parte do tempo desenvolvendo programas que devem ser, além de compatíveis com a arquitetura atual do sistema, estar preparados para futuras alterações. Geralmente somos levados a acreditar que, como programadores, nossas implementações devem ser &#8220;genéricas&#8221; e &#8220;atemporais&#8221;.
Essa busca pelo &#8220;genérico&#8221; não é incomum entre arquitetos e programadores. Kevlin Henney já falou a [...]]]></description>
			<content:encoded><![CDATA[<p>Passamos a maior parte do tempo desenvolvendo programas que devem ser, além de compatíveis com a arquitetura atual do sistema, estar preparados para futuras alterações. Geralmente somos levados a acreditar que, como programadores, nossas implementações devem ser &#8220;genéricas&#8221; e &#8220;atemporais&#8221;.<br />
Essa busca pelo &#8220;genérico&#8221; não é incomum entre arquitetos e programadores. <span class="entity-info"><a href="http://www.two-sdg.demon.co.uk/curbralan/kevlin.html" target="_blank">Kevlin Henney</a> já falou a respeito desse comportamento:<br />
</span></p>
<blockquote><p>A common problem in component frameworks, class libraries, foundation services, and other infrastructure code is that many are designed to be general purpose without reference to concrete applications. This leads to a dizzying array of options and possibilities that are often unused, misused, or just not useful. Most developers work on specific systems: the quest for unbounded generality rarely serves them well (if at all). The best route to generality is through understanding known, specific examples and focusing on their essence to find an essential common solution. <strong>Simplicity through experience rather than generality through guesswork.</strong><br />
<span class="entity-info"><a href="http://www.two-sdg.demon.co.uk/curbralan/kevlin.html" target="_blank">Kevlin Henney</a></span></p></blockquote>
<p>Acho que essa cultura de generalização exagerada pode criar problemas quando programadores perdem o foco no contexto do sistema, nos interesses dos <a href="http://en.wikipedia.org/wiki/Stakeholder_(corporate)" target="_blank">stakeholders</a> e passam em se preocupar em produzir frameworks e componentes genéricos.</p>
<blockquote><p>Although many architects value generality, it should not be unconditional. <strong>People do not on the whole pay for (or need) generality: They tend to have a specific situation, and it is a solution to that specific situation that has value. </strong>We can find generality and flexibility in trying to deliver specific solutions, but if we weigh anchor and forget the specifics too soon, we end up adrift in a sea of nebulous possibilities, a world of tricky configuration options, overburdened (not just overloaded) parameter lists, long-winded interfaces, and not-quite right abstractions. In pursuit of arbitrary flexibility you can often lose valuable properties, accidental or intended, of alternative, simpler designs.<br />
<span class="entity-info"><a href="http://www.two-sdg.demon.co.uk/curbralan/kevlin.html" target="_blank">Kevlin Henney</a></span></p></blockquote>
<blockquote><p>Thus, the real goal for all architect is to make sure the final architecture, resulting from the design and code written, solves the stakeholders concerns. I have nothing if only nice code and a great design that does not solve the stakeholders needs.<strong>The architect needs to learn how to get out of the design/coding swirl without losing eye-contact, and start developing the solution with the problem in mind.</strong><br />
<a href="http://97-things.near-time.net/wiki/show/william-martinez-pomares" target="_blank">William Martinez Pomares</a></p></blockquote>
<p>A maioria dos esforços para tornar implementações genéricas, acabam inserindo complexidade desnecessária ao código fonte, pois as decisões são feitas para resolver, problemas que na maioria das vezes acabam não se concretizando no futuro.<br />
Frameworks genéricos, ou frameworks de referência geralmente se tornam um problema de arquitetura de sistemas. As boas arquiteturas são estabelecidas dentro de um cenário espefício. Cada projeto tem característias e necessidades únicas, que podem ser resolvidas com frameworks mais apropriados para àquela situação. Mas na prática, o que acaba acontecendo, é que após um projeto bem sucedido, muitos programadores tem a impressão que o mesmo framework pode ser utilizado para qualquer outro projeto futuro. E então, a máxima torna-se verdadeira: <strong>pra quem só tem um martelo, todo problema é prego</strong>.</p>
<p>Claro, que práticas que já obtiveram sucesso num projeto, podem eventualmente ser aplicadas em outras situações. Contudo, isso não pode se tornar uma regra. Achar que algumas tecnologias podem ser aplicadas em todos os projetos, é ilusão. <strong>Mas tem muita gente que ainda acredita em soluções genéricas, compra meias tamanho único e fica na eterna busca pela <a href="http://en.wikipedia.org/wiki/Silver_bullet" target="_blank">bala de prata</a> para seus problemas.</strong></p>
<p><strong> </strong></p>
<p><img src="/wp-content/themes/blueprint/images/generics.PNG" alt="A busca pela bala de prata..." /></p>
<p>Além do mais, o cliente não compra arquitetura. O cliente paga por uma solução, que as vezes, é software. O cliente não está preocupado com o número de camadas da aplicação ou se ela foi desenvolvida com <a href="http://struts.apache.org/" target="_blank">struts</a> ou <a href="http://www.mentaframework.org/" target="_blank">mentawai</a>, muito menos com o design de suas classes. O cliente espera que o sistema ajude a resolver seus problemas e venha de encontro aos seus anseios.<br />
Apesar da arquitetura de sistemas estar mais relacionada à escolha e aplicação de tecnologias, creio que seja fundamental que arquitetos e programadores sempre mantenham foco nos interesses e objetivos dos principais <a href="http://en.wikipedia.org/wiki/Stakeholder_(corporate)" target="_blank">stakeholders</a> dos projetos.</p>
<p>E antes de sair tentando reusar objetos e generalizar componentes, pergunte a si mesmo: &#8220;O que realmente precisa ser feito ?&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://coding4food.com/2008/09/03/porque-adoramos-ser-genericos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quanto menos, melhor</title>
		<link>http://coding4food.com/2008/08/16/quanto-menos-melhor/</link>
		<comments>http://coding4food.com/2008/08/16/quanto-menos-melhor/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 03:56:13 +0000</pubDate>
		<dc:creator>Eduardo Kruger</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://coding4food.com/?p=91</guid>
		<description><![CDATA[Desenvolvimento de sistemas geralmente são repletos de discussões&#8230; longas e cansativas discussões relativas à arquitetura e design. Geralmente é no meio dessas discussões que se pode identificar um tipo peculiar de programador: o pattern-addicted developer.
Esse tipo de programador, geralmente tem um bom conhecimento técnico, domina a linguagem e os frameworks que estão sendo utilizados. Mas [...]]]></description>
			<content:encoded><![CDATA[<p>Desenvolvimento de sistemas geralmente são repletos de discussões&#8230; longas e cansativas discussões relativas à arquitetura e design. Geralmente é no meio dessas discussões que se pode identificar um tipo peculiar de programador: <strong>o pattern-addicted developer</strong>.<br />
Esse tipo de programador, geralmente tem um bom conhecimento técnico, domina a linguagem e os frameworks que estão sendo utilizados. Mas tem um vício perigoso: a necessidade insaciável em aplicar todos os design patterns que ele conhece em todos os projetos. Para ele, quanto mais classes e interfaces, melhor. Nas mãos de um <em>pattern addicted</em>, um cadastro simples pode ser tornar num monstrinho de n camadas, com milhares de <em>Facades, Session Layers, DTO&#8217;s, VO&#8217;s, Factories, DAO&#8217;s, Adapters, Mediators</em> e <em>Business Delegates</em>. Para o <em>pattern-addicted</em>, código fonte bem escrito, é complexo. Tão complexo, que poderá ser manutenido apenas por ele mesmo.</p>
<p>A simplicidade na programação, é um assunto que vem montivando muita gente. Rico Mariani (Microsoft), fala sobre simplicidade e performance:</p>
<blockquote>
<p dir="ltr">I hardly think that one can make any conclusions about which vendor has the edge in performance from my article on <a href="http://blogs.msdn.com/ricom/archive/2004/08/24/219751.aspx">Performance Tidbits</a>.  If I was to summarize my advice in that blog in a few words it would be &#8220;don&#8217;t use OOP features that you don&#8217;t need.&#8221;</p>
<p>This is not to say that you should shun virtual functions, inheritance, or other features of modern programming languages.  Far from it, often they not only add clarity and maintainability they also improve performance.  But, as often, I find that people have written their code in some elaborate way when a much simpler model would have been equally servicable and more performant.  Whatever programming religion you may have I think you&#8217;ll agree that more complex language abstractions do not inherently help your design &#8212; rather each more sophisticated feature starts at a net negative and must somehow earn its way to positiveness with benefits such as clarity, ease of maintenance, performance, and so forth.<br />
From<a id="ctl00___ctl00___bth___BlogTitle" class="headermaintitle" href="http://blogs.msdn.com/ricom/default.aspx"> Rico Mariani&#8217;s Performance Tidbits<br />
</a></p></blockquote>
<p>Código fonte complexo, é um forte candidato a <em>refactoring</em>. Simplicidade é tudo.  Não vamos utilizar design patterns sem necessidade. <a href="http://c2.com/cgi/wiki?DoTheSimplestThingThatCouldPossiblyWork" target="_blank">Faça a coisa mais simples possível que possa funcionar</a>. <a href="http://c2.com/cgi/wiki?BigDesignUpFront" target="_blank">Não pense em problemas que você ainda não tem</a>. Se foque no que precisa ser feito agora.<a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt" target="_blank"> Torne o YAGNI uma filosifia de trabalho.</a> O pessoal do <a href="http://www.37signals.com" target="_blank">37signals</a>, já falou muito a respeito disso:<a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt" target="_blank"><br />
</a></p>
<blockquote><p>Keep your code as simple as possible. You&#8217;d think that twice as much code would make your software only twice as complex. But actually, <strong>each time you increase the amount of code, your software grows exponentially more complicated</strong>. Each minor addition, each change, each interdependency, and each preference has a cascading effect. Keep adding code recklessly and, before you know it, you&#8217;ll have created the dreaded Big Ball of Mud.</p>
<ul>
<li>Less software is easier to manage.</li>
<li>Less software reduces your codebase and that means</li>
<li>less maintenance busywork (and a happier staff).</li>
<li>Less software lowers your cost of change so you  can adapt quickly. You can change your mind</li>
<li>Less software results in fewer bugs.</li>
<li>Less software means less support.<a href="http://www.37signals.com" target="_blank"><br />
</a></li>
</ul>
</blockquote>
<p>Não há nada de errado na aplicação dos <em>design patterns</em> catalogados pelo GoF &#8211; <a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1218829018&amp;sr=8-1" target="_blank"><span id="btAsinTitle">Design Patterns: Elements of Reusable Object-Oriented Software</span></a><span id="btAsinTitle"> ou nos <a href="http://java.sun.com/reference/blueprints/index.html" target="_blank">Blue Prints da SUN</a>.</span><span id="btAsinTitle"> </span><span id="btAsinTitle">Mas não crie problemas, apenas para poder utilizá-los.</span><span id="btAsinTitle"><br />
</span></p>
<p>Não vejo nenhuma vantagem em investir muito tempo tentando resolver algo, que um dia talvez, poderá vir a acontecer. Implementar soluções, na tentativa de <a href="http://gettingreal.37signals.com/ch04_Its_a_Problem_When_Its_a_Problem.php" target="_blank">resolver problemas que ainda não existe</a><a href="http://gettingreal.37signals.com/ch04_Its_a_Problem_When_Its_a_Problem.php" target="_blank">m</a>, não fazem muito sentido para mim. Todos os requisitos não precisam ser implementadas agora. Ao invés disso, acho mais inteligente fazer esforços para manter componentes desacoplados, permitindo que o sistema cresça interativamente de forma sustentável, à medida que novas funcionalidades vão sendo inseridas. As vezes, é fundamental saber o que deve se descartado.</p>
<blockquote><p>The &#8220;secret&#8221; to good software design wasn&#8217;t in knowing what to put into the code; it was in knowing what to leave OUT! It was in recognizing where the hard-spots and soft-spots were, and knowing where to leave space/room rather than trying to cram in more design.<br />
Brad Appleton</p></blockquote>
<p>Em se tratando de software, quanto menos, melhor.</p>
]]></content:encoded>
			<wfw:commentRss>http://coding4food.com/2008/08/16/quanto-menos-melhor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
