<?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>hlegius &#187; Arquitetura</title>
	<atom:link href="http://programe.me/category/arquitetura/feed/" rel="self" type="application/rss+xml" />
	<link>http://programe.me</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Wed, 23 Nov 2011 17:26:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Refatore cedo, refatore regularmente.</title>
		<link>http://programe.me/refatore-cedo-refatore-regularmente/</link>
		<comments>http://programe.me/refatore-cedo-refatore-regularmente/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 18:58:22 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=670</guid>
		<description><![CDATA[Dica de número 47 do livro The Pragmatic Programmer, de Andrew Hunt e David Thomas, esta é uma das dicas mais fáceis de explicar e uma das mais difíceis de ser seguida. Mas, perché ? Simples ! O que significa refatorar ? Essa palavra que está na roda de conversa dos developers atualmente nem sempre [...]]]></description>
			<content:encoded><![CDATA[<p>Dica de número 47 do livro <a href="http://pragprog.com/titles/tpp/the-pragmatic-programmer" target="_blank">The Pragmatic Programmer</a>, de Andrew Hunt e David Thomas, esta é uma das dicas mais fáceis de explicar e uma das mais difíceis de ser seguida.</p>
<p>Mas<em>, perché </em>?<em><br />
</em>Simples ! O que significa refatorar ?</p>
<p>Essa palavra que está na roda de conversa dos developers atualmente nem sempre é utilizada com sua real definição. Pare para pensar na última vez em que você refatorou algo.<em> </em>Responda a si mesmo as perguntas:</p>
<ul>
<li>Qual o objetivo do <em>refactoring</em> ?</li>
<li>Quantas coisas (pontos de função, pacotes, <em>formas (?)</em>) foram alteradas ?</li>
<li>Após, o que mudou ?</li>
<li>Por quê necessitou refatorar ?</li>
</ul>
<p><strong>1. Qual o objetivo do refactoring ?</strong><br />
Fazer valer os princípios <span style="text-decoration: line-through;">trazidos do alto da montanha</span> descritos por developers como <a href="http://twitter.com/#!/unclebobmartin" target="_blank">Uncle Bob</a> e <a href="http://www.pmg.csail.mit.edu/~liskov/" target="_blank">Barbara Liskov</a>.<br />
Em outras palavras: não repetir a mesma coisa duas vezes; ser coeso; ser claro e objetivo; cada &#8220;coisa&#8221; precisa ter sua responsabilidade e esta deverá ser única; e <a href="http://domaindrivendesign.org/node/132" target="_blank">etc</a>, <a href="http://www.objectmentor.com/resources/articles/ocp.pdf" target="_blank">etc</a> e <a href="http://www.objectmentor.com/resources/articles/isp.pdf" target="_blank">etcetera</a>.</p>
<p><strong>2. Quantas coisas (pontos de função, pacotes, formas (?)) foram alteradas ?</strong><br />
Uma e somente uma. Se você resolveu mudar uma funcionabilidade e junto adicionou uma coisa por menor que mínima, você aumentou a probabilidade de dar tudo errado. A dica aqui é: <strong>não é possível assoviar e chupar cana ao mesmo tempo.</strong> <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>3. Após, o que mudou ?</strong><br />
Nada. Você não tinha como objetivo mudar um comportamento, apenas melhorar algo que já existia. Se fez um refactoring por causa de um bug, então você não refatorou, mas sim, inseriu um ou mais novos bugs. Leia o item 2 novamente se ficou com dúvidas.</p>
<p><strong>4.  Por quê necessitou refatorar ?</strong><br />
Vários motivos podem levar você a isto, mas a finalidade sempre acaba recaíndo sobre: melhorar o processo, a atividade ou relacionamento entre eles.</p>
<p><strong>Processos, atividades e relacionamentos.</strong></p>
<p>Repare que eu evitei falar de código diretamente. Isso pois eu vejo a refatoração algo possível para qualquer um em qualquer área. Tente aplicar os 4 itens acima em sua área. Se for um gestor, veja a refatoração como evolução e adequação dos processos existentes; No item 2 eu falei sobre <em>formas(?) </em>justamente com este propósito. Refatore a forma como você faz algo.</p>
<p>Nós da área Web da Vex, mantemos dentro do repositório dos projetos os arquivos SQL que geramos ao decorrer de cada alteração/adição feita aos projetos. Em meados do primeiro semestre de 2009, os arquivos .sql eram salvos da seguinte forma:</p>
<pre>/data/projetoXPTO/moduloABC/umNomeDescritivo.sql</pre>
<p>O <em>umNomeDescritivo.sql</em> parece algo legal. Vamos fazer um teste de mesa com isto:</p>
<pre>/data/erp/relatoriosFinanceiros/engineDeGraficos.sql</pre>
<p>Woow! Funciona perfeito. Tudo referente à engine de gráficos ficará neste arquivo .sql e <em>done deal</em>.</p>
<p>Com o tempo, aquilo ficou impossível de controlar pois a cada nova atualização, os arquivos ficavam maiores e o pior: quando o deploy da aplicação era realizado, como saber exatamente o que atualizar no banco de dados de produção ?</p>
<p>A partir deste problema, uma refatoração na forma de salvar arquivos SQL fora realizada. O novo modelo sugeria o padrão:</p>
<pre>/data/projetoXPTO/moduloABC/YYYYMMDD_umNomeDescritivo.sql</pre>
<p>Legal, problema resolvido ! Vamos ao teste de mesa:</p>
<pre>/data/erp/relatoriosFinanceiros/20100301_engineDeGraficos.sql</pre>
<p>A primeira vista, tudo perfeito. Contudo, nossos softwares são feitos com base em releases e acredite, temos muito código a cada novo release, gerando assim <strong>muito</strong> SQL para atualização. Processos manuais ou automatizados tornaram-se inviáveis pois a pergunta que ecoava na sala era:</p>
<blockquote><p>Quais foram as datas dos Release 1.2.2 e Release 1.2.3 do software de autenticação mesmo ?</p></blockquote>
<p>Pois é. E agora, José ? A partir disso eu pensei um bocado e resolvi dar palpite no processo. Porque não armazenar por release ?</p>
<pre>/data/release-1.2.3/projetoXPTO/modulo_umNomeDescritivo.sql</pre>
<p>Pronto. Agora consigo fazer uma análise do que mudou por versão. Essa refatoração no processo de armazenamento dos arquivos SQL mudou a forma como os arquivos são salvos e só.</p>
<p>Refatore sempre que puder. Mude e melhore aquilo que funciona, mas que não está na sua melhor forma. Tenha em mente que deixar algo que pode ser melhorado para trás, poderá custar-lhe caro amanhã. Porém, eu entendo que só há refatoração quando o objeto alvo está <strong>finalizado e funcionando</strong>. Antes disso o nome ao meu ver é implementação.</p>
<p>Keep refactoring <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left;"><small><em>Artigo originalmente postado por mim no até então blog Ready to Sail, hoje, o <a href="http://readytosail.vexcorp.com">planet da Vex</a>.</em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/refatore-cedo-refatore-regularmente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eu uso estático porque é mais rápido.</title>
		<link>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/</link>
		<comments>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:04:04 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[teoria]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=488</guid>
		<description><![CDATA[Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO. Vejamos um exemplo nada científico que fiz: Criei os seguintes exemplos: &#60;?php class Estatico { public static function fazAlgumaCoisa() { $i [...]]]></description>
			<content:encoded><![CDATA[<p>Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO.</p>
<p>Vejamos um exemplo nada científico que fiz:</p>
<p>Criei os seguintes exemplos:</p>
<p><code></p>
<pre>&lt;?php
class Estatico {

    public static function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
           echo Estatico::outraCoisa();
           $i++;
        }
    }

    public static function outraCoisa() {
        return "Conteúdo";
    }
}

Estatico::fazAlgumaCoisa();</pre>
<p></code></p>
<p><code></p>
<pre>&lt;?php
class Instancia {

    public function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
            echo $this-&gt;outraCoisa();
            $i++;
        }
    }

    public function outraCoisa() {
        return "Conteúdo";
    }
}
$objInstancia = new Instancia();
$objInstancia-&gt;fazAlgumaCoisa();</pre>
<p></code></p>
<p>Os resultados após rodar quatro vezes cada foram:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico.png"><img class="aligncenter size-medium wp-image-491" title="Chamadas estáticas em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico-300x68.png" alt="" width="300" height="68" /></a></p>
<p style="text-align: center;"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia.png"><img class="aligncenter" title="Chamada em instância em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia-300x66.png" alt="" width="300" height="66" /></a></p>
<p>Ou seja: <strong>91.09 ms para o estático</strong> contra <strong>90.07 para a versão non-static</strong>. Obviamente foi apenas um teste sem qualquer relevância, pois rodei em minha máquina pessoal com várias outras aplicações rodando em background. É perceptível porém, que a diferença não é absurda que compense o uso de estático por este motivo.</p>
<p>Deixando a questão de &#8220;performance&#8221; de lado, partimos para questões arquitetônicas:</p>
<ul>
<li>Identidade</li>
<li>SoC &#8211; Separation of Concerns (Principio de Separação das Responsabilidades)</li>
<li>Encapsulamento</li>
<li>Estado</li>
<li>DRY &#8211; Don&#8217;t Repeat Yourself</li>
<li>Associações &#8211; sejam elas composições ou agregações</li>
</ul>
<p>Ao perder Identidade e Estado as possibilidades daquele método &#8211; ou da classe inteira, caso use estático em tudo &#8211; tem o leque de utilidade reduzido para:</p>
<ul>
<li>Service</li>
<li>Facade</li>
<li>Factory</li>
<li>Helpers &#8211; no âmbito de serem apenas funções que realizam determinada tarefa na aplicação sem qualquer valor ao Domínio</li>
</ul>
<p>Com isso, perdemos também o Princípio de Separação das Responsabilidades, ou seja, a classe perde o controle sobre a integridade dos dados que ela deveria controlar e proteger contra acesso ou alteração indevidos.</p>
<p>Listei o DRY também por um motivo simples: com métodos estáticos, perdemos a grande chance de usar as variáveis de instância da classe à favor da mesma. Exemplo:</p>
<p><code></p>
<pre>class UsuarioEstatico {

    public static function login($usuario, $senha) {
        // valida o usuário e zaz
        $autenticador = new Autenticador();
        $autenticador-&gt;autentica($usuario, $senha);
    }

    public static function logout($usuario) {
        // verifica se a sessao está aberta
        $autenticador = new Autenticador();
        $autenticador-&gt;fechaSessaoPara($usuario);
    }
}</pre>
<p></code></p>
<p><code></p>
<pre>class Usuario implements Autenticavel {
    private $autenticador;

    public function __construct($usuario, $senha) {
        // manipula os dados de entrada
        $this-&gt;autenticador = new Autenticador($this);
    }

    public function login() {
        return $this-&gt;autenticador-&gt;autentica();
    }

    public function logout() {
        return $this-&gt;autenticador-&gt;fechaSessao();
    }
}</pre>
<p></code></p>
<p>Repare no modelo estático: foi necessário instanciar o antenticador por duas vezes em pontos diferentes. Opa, repetiu ! Mesmo que o autenticador fosse estático, teriamos duplicação, pois teriamos que certificar que o usuário existe e tudo mais. Isso porque não comentei como ficaria o lado cliente dessa implementação estática. O cliente &#8211; seja Controller, WebService ou qualquer classe em outra camada no domínio &#8211; teria que conhecer muita coisa sobre implementação dessa classe para poder manipulá-la.</p>
<p>Como bônus, repare que perdemos neste caso também o Polimorfismo, uma vez que eu poderia ter esse Autenticador() como base de autenticação para qualquer tipo (Usuário, Funcionário, Gerência, Administradores&#8230;)</p>
<p>O uso de métodos ou funções &#8211; sim, há diferença &#8211; estáticas pode ser bem-vindo nos itens já enumerados. Alguns developers porém, ainda que nestes casos são contra o uso por achar a ideia estática demasiadamente anti-oo.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

