<?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 do Alone &#187; Patterns</title>
	<atom:link href="http://www.nelsonalone.com.br/tag/patterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nelsonalone.com.br</link>
	<description>A tecnologia de forma simplificada</description>
	<lastBuildDate>Wed, 08 Feb 2012 03:29:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java Anti-Patterns</title>
		<link>http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/</link>
		<comments>http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 11:01:49 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Anti-Pattern]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=618</guid>
		<description><![CDATA[No dia-dia nos deparamos com situações que não sabemos  a melhor forma soluciona-la, levando, as vezes, utilizar de soluções conhecidas como Anti-Pattern. As ferramentas de análise de código ajudam um pouco, mas não chegam a ser imediatas quando precisamos. Nesse caso, a melhor ferramenta é a nossa cachola. Encontrei nesse blog um número repleto de<a href="http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No dia-dia nos deparamos com situações que não sabemos  a melhor forma soluciona-la, levando, as vezes, utilizar de soluções conhecidas como Anti-Pattern. As ferramentas de análise de código ajudam um pouco, mas não chegam a ser imediatas quando precisamos.</p>
<p style="text-align: justify;">Nesse caso, a melhor ferramenta é a nossa cachola. Encontrei nesse blog um número repleto de dicas para solucionar os problemas de Anti-Pattern que utilizamos no dia-dia. Desde dicas de performance até soluções para determinados problemas. Vale a pena dar uma olhada. <a href="http://www.odi.ch/prog/design/newbies.php">Odi’s Blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O Builder na prática e no Mundo Real</title>
		<link>http://www.nelsonalone.com.br/2010/11/03/o-builder-na-pratica-e-no-mundo-real/</link>
		<comments>http://www.nelsonalone.com.br/2010/11/03/o-builder-na-pratica-e-no-mundo-real/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 18:26:41 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=507</guid>
		<description><![CDATA[O padrão de projetos Builder permite a separação da construção de objetos complexos de sua representação possibilitando, com o mesmo processo de construção, criar diferentes representações. No desenho tradicional do GOF ele aparece como um elemento agregado do Builder, possibilitando a criação na forma separada. Mas o padrão Builder cumpre um papel importante no “jeitão”<a href="http://www.nelsonalone.com.br/2010/11/03/o-builder-na-pratica-e-no-mundo-real/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>O padrão de projetos Builder permite a separação da construção de objetos complexos de sua representação possibilitando, com o mesmo processo de construção, criar diferentes representações.</p>
<p>No desenho tradicional do GOF ele aparece como um elemento agregado do Builder, possibilitando a criação na forma separada. Mas o padrão Builder cumpre um papel importante no “jeitão” das libs contidas na JVM. Um exemplo disso é o fato de Utilizar o tradicional System.out.println() ou o System.gc() que são processos de iniciação estáticos.</p>
<p><a href="http://www.nelsonalone.com.br/content/wp-content/uploads/2010/11/builder.png"><img class="aligncenter size-medium wp-image-508" title="builder" src="http://www.nelsonalone.com.br/content/wp-content/uploads/2010/11/builder-300x153.png" alt="" width="300" height="153" /></a></p>
<p>De acordo com o item 2 do Effective Java 2nd Edicition do Joshua Bloch, “<em>Static factories and constructors share a limitation: they do not scale well to large numbers of optional parameters</em>”. Segundo Bloch, a solução para isso está na construção de métodos státicos associados aos tipos genéricos para construir os objetos de forma elegante como abaixo:</p>
<pre class="brush:java">Rectangle rec = new Rectangle.Builder().opacity(5.0).height(1.2).build();
</pre>
<p>Quando se faz muitos testes unitários, a maioria das vezes torna-se necessário construir objetos, ou mocks, que representam um estado fictício para a execução dos demais testes. E frequentemente utilizamos o método tradicional, com os construtores:</p>
<pre class="brush:java">Usuario usuario = new Usuario("Nelson","Alone",new Date(),"alone","alone",new Departamento(),new Filial());
</pre>
<p>É uma forma tediosa de iniciar objetos quando temos vários atributos que precisamos preencher para utilizá-lo no procedimento de teste. Portanto, o Builder pode agilizar esse processo da seguinte forma</p>
<p>Para exemplificar a utilização do Builder com métodos genéricos e de classes internas, inicialmente vamos preparar a construção de duas classes tradicionais, Rectangle e Chape. Utilizaremos classes internas para a construção dos objetos internamente. Isso faz com qua a instancia da classes possa ser feita através da classes interna e do método builder para finalização do processo:</p>
<pre class="brush:java">public class Shape {

	private final double opacity;

	protected static abstract class Init&lt;T extends Init&lt;T&gt;&gt; {
		private double opacity;
		protected abstract T self();

		public T opacity(double opacity) {
			this.opacity = opacity;
			return self();
		}
	}

	public static class Builder extends Init&lt;Builder&gt; {
		protected Builder self() {
			return this;
		}
	}

	protected Shape(Init&lt;?&gt; init) {
		this.opacity = init.opacity;
	}

}
</pre>
<pre class="brush:java">public class Rectangle extends Shape {
	private final double height;

	protected static abstract class Init&lt;T extends Init&lt;T&gt;&gt; extends Shape.Init&lt;T&gt; {

		private double height;

		public T height(double height) {
			this.height = height;
			return self();
		}

		public Rectangle build() {
			return new Rectangle(this);
		}

	}

	public static class Builder extends Init&lt;Builder&gt; {
		protected Builder self() {
			return this;
		}
	}

	protected Rectangle(Init&lt;?&gt; init) {
		super(init);
		this.height = init.height;
	}

}
</pre>
<p>Exemplo para construção:</p>
<pre class="brush:java">Rectangle rec = new Rectangle.Builder().opacity(5.0).height(1.2).build();
</pre>
<p>Já ajudou bastante. A cada atributo incluso é retornado uma instância do construtor para a inclusão posterior, sendo finalizado pelo método build(). Porém, é necessário o acoplamento da classes interna para a preparação do Builder ara a sua utilização. Essa solução pode solucionar o problema, mas vamos fazer diferente. </p>
<p>Agora, temos um jeito mais elegante de construer objetos sem o auxílio direto da classe interna Builder. Utilizaremos o método estático builder para auxiliar no processo, como abaixo:</p>
<pre class="brush:java">public class Shape {

	private final double opacity;

	public static abstract class Builder&lt;T extends Builder&lt;T&gt;&gt; {
		private double opacity;

		protected abstract T self();

		public T opacity(double opacity) {
			this.opacity = opacity;
			return self();
		}

		public Shape build() {
			return new Shape(this);
		}
	}

	public static class Builder2 extends Builder&lt;Builder2&gt; {
		public Builder2 self() {
			return this;
		}
	}

	public static Builder&lt;?&gt; builder() {
		return new Builder2();
	}

	protected Shape(Builder&lt;?&gt; builder) {
		this.opacity = builder.opacity;
	}

}</pre>
<pre class="brush:java">public class Rectangle extends Shape {
	private final double height;

	protected static abstract class Builder&lt;T extends Builder&lt;T&gt;&gt; extends Shape.Builder&lt;T&gt; {

		private double height;

		public T height(double height) {
			this.height = height;
			return self();
		}

		public Rectangle build() {
			return new Rectangle(this);
		}

	}

	public static class Builder2 extends Builder&lt;Builder2&gt; {
		protected Builder2 self() {
			return this;
		}
	}

	public static Builder&lt;?&gt; builder() {
		return new Builder2();
	}

	protected Rectangle(Builder&lt;?&gt; init) {
		super(init);
		this.height = init.height;
	}

}</pre>
<p>Exemplo para construção:</p>
<pre class="brush:java">Rectangle rec = Rectangle.builder().opacity(14.45).height(478.41).build();
</pre>
<p>Ficou mais aceitável e, ao mesmo tempo, menos acoplável. Internamente, temos mais código, mas facilita bastante a construção do objeto caso tenha um número grande de parâmetros.</p>
<p>Faça <a title="Fontes" href="http://www.nelsonalone.com.br/content/wp-content/uploads/2010/11/makebuilderadapter.zip">download dos fontes</a>,  execute os teste e veja como fica em uma solução mais complexa.</p>
<p>[]s</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2010/11/03/o-builder-na-pratica-e-no-mundo-real/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Padrões X Simplicidade</title>
		<link>http://www.nelsonalone.com.br/2009/10/29/padroes-simplicidade/</link>
		<comments>http://www.nelsonalone.com.br/2009/10/29/padroes-simplicidade/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 05:16:10 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[DP]]></category>
		<category><![CDATA[GoF]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=381</guid>
		<description><![CDATA[A obra do GoF foi magnífica para o cenário atual da computação, especificamente a área de desenvolvimento de software, pois, trouxe um conjunto de informações organizado e catalogado por responsabilidades que visam a solução de um problema específico. Os problemas foram descritos brevemente com o objetivo de acoplar um padrão de projeto conforme a necessidade<a href="http://www.nelsonalone.com.br/2009/10/29/padroes-simplicidade/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A obra do GoF foi magnífica para o cenário atual da computação, especificamente a área de desenvolvimento de software, pois, trouxe um conjunto de informações organizado e catalogado por responsabilidades que visam a solução de um problema específico. Os problemas foram descritos brevemente com o objetivo de acoplar um padrão de projeto conforme a necessidade que era descrita, dessa forma, tornando a leitura fácil e clara.</p>
<p style="text-align: justify;">Porém, utilizar padrões sem conhecer a real realidade do problema, ou até mesmo utiliza-lo por modismo, pode fazer com que problemas, que geralmente são simples de serem solucionados, tornem-se extremamente complexos transformando o código em um  prato enorme de espaguete.  Utilizar padrões sem experiência pode levar o projeto ao caos, tanto em longo prazo (o mais provável) quanto em curto prazo.</p>
<p style="text-align: justify;">Concentrar na solução do problema é a primeira coisa que deve ser feita, é a atividade mais importante no momento. Devemos esquecer da existência de patterns para concentrarmos no problema a ser solucionado. Após solucionado, poderá ser refatorado para um padrão de projeto específico do tipo de problema que está sendo resolvido. Essa é uma atividade básica para utilizar o padrões de uma forma simples, pois, aplica-lo direto, principalmente se o desenvolvedor for inesperiente, poderá causar uma série de problemas colaterais.</p>
<p style="text-align: justify;">A simplicidade deve ser mantida. Caso seja impossível, ao menos mantenha leitura dos fontes simples e clara.</p>
<p style="text-align: justify;">[]s</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2009/10/29/padroes-simplicidade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

