<?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>Arkhi &#187; antipattern</title>
	<atom:link href="http://blog.arkhi.com.br/tag/antipattern/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.arkhi.com.br</link>
	<description>Arquitetura Corporativa</description>
	<lastBuildDate>Mon, 30 Nov 2009 01:21:51 +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>Desmistificando a Decomposição em Camadas</title>
		<link>http://blog.arkhi.com.br/2008/10/26/desmistificando-a-decomposicao-em-camadas/</link>
		<comments>http://blog.arkhi.com.br/2008/10/26/desmistificando-a-decomposicao-em-camadas/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 00:31:12 +0000</pubDate>
		<dc:creator>Eros Viggiano</dc:creator>
				<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[antipattern]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[camadas]]></category>
		<category><![CDATA[decomposição]]></category>
		<category><![CDATA[layers]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://dearchitectura.wordpress.com/?p=161</guid>
		<description><![CDATA[O tema &#8220;camadas&#8221; é recorrente na arquitetura de software: muitas vezes apontado como a solução para todo tipo de software e recentemente criticado como anti-pattern. Para os iniciantes e leigos, a arquitetura de software se resume na divisão do software em camadas e sua associação a uma &#8220;pilha&#8221; de tecnologias.
O padrão &#8220;Layers&#8221;
O padrão (pattern) &#8220;Layers&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>O tema &#8220;camadas&#8221; é recorrente na arquitetura de software: muitas vezes apontado como a solução para todo tipo de software e recentemente criticado como anti-pattern. Para os iniciantes e leigos, a arquitetura de software se resume na divisão do software em camadas e sua associação a uma &#8220;pilha&#8221; de tecnologias.</p>
<p><strong>O padrão &#8220;Layers&#8221;</strong></p>
<p>O padrão (pattern) &#8220;Layers&#8221;, reconhecido inicialmente em <a title="POSA 1" href="http://www.amazon.com/Pattern-Oriented-Software-Architecture-System-Patterns/dp/0471958697/ref=pd_sim_b_3">POSA 1</a>, identifica o contexto no qual um sistema requer decomposição e se endereça a um ou mais dos seguintes problemas, conforme sintetizado por <a href="http://www.ibm.com/developerworks/rational/library/4699.html">Eeles</a>:</p>
<ul>
<li>Complexidade do sistema dificulta sua inteira compreensão.</li>
<li>Baixa manutenibilidade &#8211; uma alteração gera uma série de impactos.</li>
<li>Elementos menos estáveis não estão isolados.</li>
<li>Dificuldade em identificar elementos mais reusáveis.</li>
<li>Construção de um sistema por diversos times com habilidades distintas.</li>
</ul>
<p>Tal como no conhecido <a href="http://pt.wikipedia.org/wiki/Modelo_OSI">Modelo OSI</a>, o padrão &#8220;Layers&#8221; sugere um particionamento com diferentes níveis de abstração. Camadas superiores são clientes das camadas inferiores e estas não tem dependências das primeiras.</p>
<p>As principais estratégias para a decomposição em camadas são baseadas em responsabilidadea e reuso. Também é possível a combinação dessas estratégias em outras, como a modelagem de camadas multidimensionais.</p>
<p><strong>Estratégia &#8220;Camadas com base em responsabilidades&#8221;</strong><br />
A estratégia com base em responsabilidades é possivelmente a mais popular, onde as responsabilidades de um sistema são isoladas umas das outras. Uma abordagem muito comum é a segmentação em camadas de apresentação, negócios e integração. A flexibilidade e manutenibilidade são os conceitos chave para esta estratégia.</p>
<p>Imagine que, para uma aplicação originalmente com interface web, tenha sido identificada a posterior necessidade de acesso por dispositivos móveis. Sem modificar as demais camadas, é possível oferecer uma camada de apresentação com suporte a tais dispositivos. Outra situação possível é a troca da implementação da camada de apresentação (ex: integração com mainframe para SGBD).</p>
<p>Esta estratégia também permite que indivíduos de habilidades distintas atuem em suas respectivas áreas de competência (ex: programadores web e integradores).</p>
<p><strong>Estratégia &#8220;Camadas com base no reuso&#8221;</strong><br />
Geralmente derivada de uma diretriz de arquitetura corporativa, a estratégia com base no reuso sugere o agrupamento de componentes em camadas conforme o seu grau de utilização.</p>
<p>Um exemplo típico de estratificação por reuso,  citado por <a title="Software Reuse" href="http://www.amazon.com/Software-Reuse-Architecture-Organization-Business/dp/0201924765/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1224979983&amp;sr=8-1">Jacobson</a>, é o conjunto das camadas &#8220;Base&#8221;, &#8220;Específica para Negócios&#8221; e &#8220;Específica para Aplicativos&#8221;. No livro <a title="DDD" href="http://domaindrivendesign.org/books/index.html#DDD">Domain Driven Design</a>, Evan também comenta sobre a separação das camadas e usa os termos &#8220;User Interface Layer&#8221;, &#8220;Application Layer&#8221;, &#8220;Domain Layer&#8221; e &#8220;Infrastructure Layer&#8221;.</p>
<p>A óbvia vantagem nessa estratégia é o avançado grau de reuso de componentes. Permite também, com facilidade, o provimento e a catalogação de serviços especializados.</p>
<p>Estratégia Camadas multidimensionais<br />
Combina as estratégias baseadas em responsabilidade e reuso.</p>
<p><strong>Mitos &#8220;modernos&#8221; (e ingênuos) sobre camadas arquiteturais</strong><br />
Recentemente temos percebido um agradável movimento a favor da simplicidade das arquiteturas de software. O uso de múltiplas camadas como pouca distinção de utilidade entre elas tem gerado nomes como &#8220;arquitetura lasanha&#8221; (ressaltamos que arquiteturas são muito mais que estratificação em camadas, isto é um abuso). Simplicidade é ótimo! Mas, com devido respeito a quem cunhou o termo, o que se deve combater são as arquiteturas ritualísticas, obras criadas por indivíduos que, com pouco conhecimento em arquitetura, não exploram adequadamente o problema e que acreditam que arquiteturas de referência encontradas por aí a tudo se aplicam. O próprio contexto do pattern &#8220;Layers&#8221; define a natureza do problema no qual ele se aplica.</p>
<p>Muitas vezes, pouco se leva em conta as forças que regem a definição de um arquitetura. Por exemplo, suponhamos a necessidade de um software simples de cadastro sem um contexto de reuso e a ser desenvolvimento por apenas um programador. Possivelmente, o &#8220;Layers&#8221; nessa situação seria um exagero. Usar o padrão (não somente o &#8220;Layers&#8221;, qualquer um) para sem considerar todas as forças envolvidas e, principalmente, o problema que está sendo endereçado é inútil e prejudicial. Nesse caso, seria mais uma bela solução para um problema que não existe.</p>
<p>Boas referências sobre decomposição em camadas e assuntos correlatos podem ser encontradas em:</p>
<ol>
<li><a href="http://www.amazon.com/Pattern-Oriented-Software-Architecture-System-Patterns/dp/0471958697/ref=pd_sim_b_3">&#8220;Pattern-Oriented Software Architecture Volume 1: A System of Patterns&#8221;</a>, Frank Buschmann e outros.</li>
<li><a href="http://www.ibm.com/developerworks/rational/library/4699.html">&#8220;Layering Strategies&#8221;</a>, Peter Eeles</li>
<li><a href="http://martinfowler.com/eaaCatalog/serviceLayer.html">&#8220;Service Layer&#8221;,</a> <a href="http://martinfowler.com/eaaCatalog/domainModel.html">&#8220;Domain Model&#8221;</a> e <a href="http://www.martinfowler.com/bliki/AnemicDomainModel.html">&#8220;Anemic Domain Model&#8221;</a>, Martin Fower</li>
<li><a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612">&#8220;Design Patterns&#8221;</a>, GoF</li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0201325713">&#8220;Applied Software Architecture&#8221;</a>, Christine Hofmeister, Robert Nord e Dilip Soni</li>
<li><a href="http://msdn.microsoft.com/pt-br/library/aa905336.aspx">&#8220;Arquitetura pragmática: camadas&#8221;</a>, Ted Neward</li>
<li><a href="http://www.ambysoft.com/essays/classTypeArchitecture.html">&#8220;Class Type Architecture: A Strategy for Layering Software Applications&#8221;</a>, Scott Ambler</li>
<li><a href="http://www.javadude.com/articles/layering.html">&#8220;Layering Applications&#8221;</a>, Scott Stanchfield, JavaDude.com</li>
</ol>
<p>Para reflexão: &#8220;Ritual é o começo do caos&#8221;, Philippe Kruchten, em <a title="The Tao of the Software Architect" href="http://www.sei.cmu.edu/architecture/essays.html#tao">&#8220;The Tao of the Software Architect&#8221;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arkhi.com.br/2008/10/26/desmistificando-a-decomposicao-em-camadas/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
