<?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>Sylverio &#187; Orientação a Objetos</title>
	<atom:link href="http://sylverio.com.br/blog/category/orientacao-a-objetos/feed/" rel="self" type="application/rss+xml" />
	<link>http://sylverio.com.br/blog</link>
	<description>Análise, Arquitetura, Orientação a Objetos, UML, Tecnologias e Programação</description>
	<lastBuildDate>Mon, 06 Feb 2012 11:01:34 +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>Polimorfismo</title>
		<link>http://sylverio.com.br/blog/2012/01/polimorfismo/</link>
		<comments>http://sylverio.com.br/blog/2012/01/polimorfismo/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 10:46:43 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Análise]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=813</guid>
		<description><![CDATA[A meu ver o princípio polimorfismo é um dos principais princípios e conceitos empregados para programação orientação à objetos. É esse conceito possibilitou que diversos desing patterns (padrões de projetos) fossem criados para o desenvolvimento de soluções de problemas de &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2012/01/polimorfismo/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://www.sylverio.com.br/blog/image/nanofarmacos.png" title="polimorfismo" class="alignleft" style="border:none; padding:2px;" />A meu ver o <strong>princípio polimorfismo</strong> é um dos principais princípios e conceitos empregados para programação orientação à objetos. É esse conceito possibilitou que diversos desing patterns (padrões de projetos) fossem criados para o desenvolvimento de soluções de problemas de arquitetura (<em>diga-se problemas, quebra de princípios de orientação a objetos</em>).</p>
<p>Apesar do desenvolvimento de sorftware ser uma ciência exata, muitos desenvolvedores consideram algumas dessas soluções como <strong>mágicas</strong> devido a sua complexidade. Primeiramente gostaria de salientar que não existe mágica, e sim o <strong>emprego metódico de técnicas e princípios</strong> para o projeto de software que boa parte dessa &#8220;mágica&#8221; pode ser atribuído ao <strong>polimorfismo</strong>.</p>
<h3>O que é Polimorfismo?</h3>
<p><em>&#8220;Um conceito em teoria de tipo, no qual um nome (como uma declaração de variável) pode denotar objetos de muitas subclasses diferentes que são relacionadas por alguma superclasse comum, assim, qualquer objeto denotado por esse nome tem a capacidade de responder a algum conjunto comum de operações de modos diferentes&#8221;</em> (Booch, 2000).<br />
Em outras palavras, possibilita que referências de tipos de classes mais abstratas representem o comportamento das classes concretas que as referenciam, esse comportamento também é conhecido como <a href="http://sylverio.com.br/blog/2009/01/generalizacao-especializacao-heranca/">Generalização-Especialização</a>.</p>
<p><img alt="" src="http://www.sylverio.com.br/blog/image/poliformismo01.png" class="alignright" style="border:none; padding:2px;" /></p>
<p>Polimorfismo é uma solução para um problema comum em ciência da computação: &#8220;<strong>Variação condicional</strong>&#8220;.<br />
Quando um programa é projetado com lógica condicional de estrutura <strong>if-else</strong> ou instrução <strong>case</strong>, quando surgir uma nova variação, ela exigirá uma modificação da lógica desses comandos, freqüentemente em vários lugares. Causando o aumento da complexidade ciclomática e manutenibilidade no sistema e diminuição do reuso de componentes.</p>
<p><strong>Problema:</strong> Como tratar alternativas (variações condicionais) com base no tipo? Como criar componentes de software interconectáveis?</p>
<p><strong>Solução:</strong> Quando alternativas ou comportamentos relacionados variam segundo o tipo (classe), atribua a responsabilidade pelo comportamento aos tipos para os quais o comportamento varia, usando operações polimórficas.</p>
<h3>Exemplificando</h3>
<p>Como caso de estudo, vou criar um simples sistema de exame virtual, onde iram existir 2 tipos de questões, numéricas e textos (descritivas).<br />
Abaixo temos o modelo de domínio de nossa aplicação.<br />
<img alt="" src="http://www.sylverio.com.br/blog/image/avaliacao_virtual_modelo_dominio01.png" style="border:none; padding:2px;" /></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Poliformismo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">class</span> Question
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Description <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Answer <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> Correct <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">void</span> AssessingAnswer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Numeric <span style="color: #008000;">:</span> Question
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> CorrectAnswer <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">void</span> AssessingAnswer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> number<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;">bool</span> isNumeric <span style="color: #008000;">=</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">.</span><span style="color: #0000FF;">TryParse</span><span style="color: #008000;">&#40;</span>Answer, <span style="color: #0600FF; font-weight: bold;">out</span> number<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>isNumeric<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Correct <span style="color: #008000;">=</span> Equals<span style="color: #008000;">&#40;</span>CorrectAnswer, number<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Text <span style="color: #008000;">:</span> Question
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> CorrectAnswer <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">void</span> AssessingAnswer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Correct <span style="color: #008000;">=</span> Equals<span style="color: #008000;">&#40;</span>CorrectAnswer<span style="color: #008000;">.</span><span style="color: #0000FF;">ToUpper</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, Answer<span style="color: #008000;">.</span><span style="color: #0000FF;">ToUpper</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Vamos pensar no seguinte problema, as regras de avaliações de respostas para perguntas em texto se diferem das numéricas.<br />
Seguindo o princípio do polimorfismo, devemos atribuir a responsabilidade de quem deve conhecer as regras aos tipos (no nosso caso  a classe <em>Text</em> e <em>Numeric </em>) utilizando operações polimórficas.<br />
Para isso criamos a classe abstrata <em>Question </em>(Questão) é conceito geral, que pode representa qualquer um dos tipos de suas implementações (numérica ou texto).</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Poliformismo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Exam
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> Exam<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Questions <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>question<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Questions<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> Numeric <span style="color: #008000;">&#123;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Com quantos anos Nostradamos morreu?&quot;</span>, CorrectAnswer <span style="color: #008000;">=</span> <span style="color: #FF0000;">47</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Questions<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> Text <span style="color: #008000;">&#123;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Qual a cor do cavalo branco de Napoleão?&quot;</span>, CorrectAnswer <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Branco&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> List<span style="color: #008000;">&lt;/</span>question<span style="color: #008000;">&gt;&lt;</span>question<span style="color: #008000;">&gt;</span> Questions <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Name <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Result <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> ShowQuestions<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>Question question <span style="color: #0600FF; font-weight: bold;">in</span> Questions<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>question<span style="color: #008000;">.</span><span style="color: #0000FF;">Description</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #6666cc; font-weight: bold;">string</span> answer <span style="color: #008000;">=</span> Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                question<span style="color: #008000;">.</span><span style="color: #0000FF;">Answer</span> <span style="color: #008000;">=</span> answer<span style="color: #008000;">;</span>
                question<span style="color: #008000;">.</span><span style="color: #0000FF;">AssessingAnswer</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> ShowResult<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Correções da avaliação.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>Question question <span style="color: #0600FF; font-weight: bold;">in</span> Questions<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;A resposta {0} esta: {1}&quot;</span>, question<span style="color: #008000;">.</span><span style="color: #0000FF;">Answer</span>, <span style="color: #008000;">&#40;</span>question<span style="color: #008000;">.</span><span style="color: #0000FF;">Correct</span> <span style="color: #008000;">?</span> <span style="color: #666666;">&quot;Certa&quot;</span> <span style="color: #008000;">:</span> <span style="color: #666666;">&quot;Errada&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&lt;/</span>question<span style="color: #008000;">&gt;</span></pre></div></div>

<p>Reparem que para a classe <em>Exam</em> a manipulação das questões é transparente, nesse nível de abstratação, não importa se é uma questão do tipo numérica ou textual.<br />
No método <em>ShowQuestions</em> quando o usuário digita a resposta, a classe <em>Exam</em> delega a classe <em>Question</em> a responsabilidade de verificar se a mesma esta correta. Assim cada tipo da operação aplica suas regras para validar a pergunta.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Poliformismo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Exam exam <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Exam <span style="color: #008000;">&#123;</span>Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Carlos Fernando&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
            exam<span style="color: #008000;">.</span><span style="color: #0000FF;">ShowQuestions</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            exam<span style="color: #008000;">.</span><span style="color: #0000FF;">ShowResult</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Esse princípio traz diversas vantagens para a arquitetura da aplicação. Além de diminuir a complexidade ciclomática da aplicação porque não utilizamos instruções condicionais (if-else) para tratar as variações condicionais <em>(&#8220;se for questão do tipo texto ou se for questão do tipo numérica&#8221;)</em>. Também auxilia na arquitetura, pois facilita a extensão de novas funcionalidades. Se caso em momento futuro surja a necessidade de criar questões de múltiplas escolhas, não teremos que alterar o exame (<em>Exam</em>), e sim  implementar uma nova classe onde implemente a abstração de questão.<br />
Nesse exemplo, tratamos alternativas com base no tipo, para soluções de componentes de software interconectáveis, será realizado em um próximo post.</p>
<p><strong>Conclusão</strong></p>
<p>Polimorfismo é um princípio fundamental no projeto e desenvolvimento de um sistema, diminui a complexidade ciclomática de uma aplicação e ainda permite que seja facilmente estendido para tratar novas variações.<br />
Esse princípio deve ser muito bem compreendido por desenvolvedores, pois muitos design patterns utilizam seus conceitos para implementações de soluções.</p>
<p><strong>Padrões relacionados:</strong></p>
<ul>
<li>Variações protegidas</li>
<li>Vários padrões de projetos GOF</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2012/01/polimorfismo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípio Controlador</title>
		<link>http://sylverio.com.br/blog/2011/08/principio-controlador/</link>
		<comments>http://sylverio.com.br/blog/2011/08/principio-controlador/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 01:58:27 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=790</guid>
		<description><![CDATA[Problema: Qual é o primeiro objeto, além da camada de UI, que recebe e coordena (&#8220;Controla&#8221;) uma operação no sistema? Solução: Atribua a responsabilidade a uma classe que representa uma das seguintes escolhas: Representa o &#8220;sistema global&#8221;, um &#8220;objeto raiz&#8221;, &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/08/principio-controlador/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>Problema:</strong> Qual é o primeiro objeto, além da camada de UI, que recebe e coordena (<em>&#8220;Controla&#8221;</em>) uma operação no sistema?</p>
<p><strong>Solução:</strong> Atribua a responsabilidade a uma classe que representa uma das seguintes escolhas:</p>
<ul>
<li>Representa o <em>&#8220;sistema global&#8221;</em>, um <em>&#8220;objeto raiz&#8221;</em>, um dispositivo dentro do qual o software está sendo processado, ou um subsistema importante &#8211; essas são todas variantes de um controlador fachada (<em>facade controller</em>)</li>
<li>Representa um cenário de um caso de uso dentro do qual ocorre o evento do sistema, frequentemente denominado TratadoDo&lt;nomedecasodeuso&gt;, CoordenadorDe&lt;nomedecasodeuso&gt; ou SessaoDo&lt;nomedecasodeuso&gt;
<ul>
<li>Use a mesma classe controladora para todos os eventos do sistema do mesmo cenário do caso de uso.</li>
<li>Informalmente, uma sessão é uma instância de convenção com um ator. Sessões podem ser de qualquer tamanho, mas frequentemente são organizadas em casos de uso.</li>
</ul>
</li>
</ul>
<p>Um <strong>controlador</strong> é o primeiro objeto além da camada de UI que é responsável por receber ou tratar uma mensagem de operação do sistema. Esse é um padrão de delegação, de acordo com a premissa que a camada de UI não deve conter a lógica da aplicação, os objetos da camada de UI precisam delegar essa solicitação a outra camada.</p>
<p><strong>Quando e como utilizar!</strong><br />
Os <i>Controladores Fachada</i> são adequados quando não exitem &#8220;demasiados&#8221; eventos de sistema.<br />
Nesse caso pode-se optar por <i>Controladores de Caso de Uso</i> para evitar tonar os controladores fachada sobrecarregado com excesso de responsabilidade, evitando a baixa <a href="http://sylverio.com.br/blog/2011/07/principio-alta-coesao/">coesão</a> e alto <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">acoplamento</a>.</p>
<p>Em 1967 <a href="http://en.wikipedia.org/wiki/Ivar_Jacobson">Ivar Jacobson</a> desenvolve uma metodologia onde existem os conceitos (opcionais) de <i>classes de fronteira</i>, <i>classes de controle</i> e <i>classes de entidade</i>. Os objetos de fronteiras, são abstrações das interfaces. Os objetos de entidade são objetos do domínio. E os objetos de controles são tratadores de caso de uso.</p>
<p><strong>Conceito X Tecnologia</strong><br />
O Princípio Controlador apresentado difere de controladores de tecnologias como <a href="http://www.asp.net/mvc">ASP.NET MVC</a>, <a href="http://www.asp.net/web-forms">ASP.NET WebForms</a>, <a href="http://www.devmedia.com.br/post-7238-Fundamentos-do-Java-Struts.html">Struts</a> (JAVA) entre outras.<br />
O code behind do WebForms ou são tratadores de eventos do navegador, já os controllers (Action) do MVC são controladores de interação e fluxo de página. Estes deveram obter uma referência para objetos controladores do domínio a fim de obter uma Separação Modelo-Visão.</p>
<p><strong>Vantagens</strong></p>
<ul>
<li>Aumento da possibilidade de reutilização e de interfaces &#8220;plugáveis&#8221; &#8211; essa vantagem garante que logica de aplicação não seja tratada na interface.</li>
<li>Melhora a forma de gerenciamento de sobre o estado do caso de uso &#8211; permite garantir que uma determinada chamada (método) não irá ocorrer até que outra tenha sido executada.</li>
</ul>
<p><strong>Padrões Relacionados</strong></p>
<ul>
<li>Commando</li>
<li>Fachada</li>
<li>Camadas</li>
<li>Invenção Pura</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/08/principio-controlador/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Princípio Alta Coesão</title>
		<link>http://sylverio.com.br/blog/2011/07/principio-alta-coesao/</link>
		<comments>http://sylverio.com.br/blog/2011/07/principio-alta-coesao/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 03:52:40 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=778</guid>
		<description><![CDATA[Coesão em ciência da computação é a relação de quão fortemente relacionadas e objetivas são as responsabilidades de uma classe. Problema: Como manter os objetos bem focados, inteligíveis, gerenciavéis e como efeito colateral apoiar o baixo acoplamento? Solução: Atribuir uma &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/07/principio-alta-coesao/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Coesão em <em>ciência da computação</em> é a relação de quão fortemente relacionadas e objetivas são as responsabilidades de uma classe.</p>
<p><strong>Problema:</strong> Como manter os objetos bem focados, inteligíveis, gerenciavéis e como efeito colateral apoiar o <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">baixo acoplamento</a>?<br />
<strong>Solução:</strong> Atribuir uma responsabilidade de forma que a coesão permaneça alta.</p>
<p>Em outras palavras, são classes de difícil entendimento e manutenção consequentemente de difícil reutilização, executam atividades que deveriam ser delegadas para outros objetos, ou apresentam um nível de abstração alto.</p>
<p>Para exemplificar vou apresentar uma situação fictícia, de um sistema de atendimento de chamados, e esses atendimentos podem esta relacionados a vários clientes.</p>
<p><img src="http://sylverio.com.br/blog/image/sd_exemplo_coesao_pior.png" alt="diagrama de sequência exemplo coesão pior" /></p>
<p>Considere a seguinte situação, o usuário adiciona um cliente ao atendimento. O ControladorAtendimento recebe a mensagem, seguindo o <a href="http://sylverio.com.br/blog/2011/02/principio-criador/">princípio criador</a>, ela detêm os dados iniciais de Cliente e se torna uma boa candidata para criar a instância c do Cliente.<br />
Depois a instância ControladorAtendimento envia uma mensagem AdicionarCliente passando a instância c  Cliente para o Atendimento.</p>
<p>Nesse caso de forma isolado, não há problemas de coesão, porem se o Controlador  continuar a ser responsável pela maioria dos serviços executados pelo gerenciamento de um atendimento ele irá se sobrecarregar de tarefas e perderá sua coesão.</p>
<p>O digrama abaixo apresenta a solução para o problema citado:</p>
<p><img src="http://sylverio.com.br/blog/image/sd_exemplo_coesao_melhor.png" alt="Diagrama de sequência exemplo coesão melhor" /></p>
<p>O ControladorAtendimento delega para o objeto Atendimento a função de criar a instancia de Cliente.<br />
Dessa forma tornamos a classe Atendimento mais coesa, pois suas atividades estão mais encapsuladas.<br />
Se analisarmos melhor, o <a href="http://sylverio.com.br/blog/2011/02/principio-criador/">princípio criador</a> esta sendo mais bem aplicado nesse caso, pois Atendimento “contém” uma lista Cliente e Atendimento usa Cliente de maneira muito próxima, ou seja, são duas condições que a tonam uma candidata a criação instância Cliente muito melhor que ControladorAtendimento.<br />
Outro princípio que podemos identificar que foi aplicado nessa solução foi a diminuição do <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">acoplamento</a> da classe ControladorAtendimento, pois ela não precisa mais ter conhecimento (ou referência) para do objeto Cliente.</p>
<p>Segundo Grandy Booch, coesão alta existe quando os elementos de um componente &#8220;trabalham juntos para fornecer algum comportamento bem delimitado&#8221;.</p>
<p>Craig Larman define uma classe com coesão alta da como, &#8220;tem um número relativamente pequeno de métodos, com funcionalidade altamente relacionada, e não executa muito trabalho. Se a tarefa for grande, irá colaborar com outros objetos para dividir o esforço&#8221;.</p>
<h2>Graus de Coesão</h2>
<p>1. <em>Coesão Muito Baixa</em> &#8211; Uma classe é a única responsável por muitas coisas em áreas funcionais muito diferentes.<br />
2. <em>Coesão Baixa</em> &#8211; Uma classe é a única responsável por uma tarefa complexa em uma área funcional.<br />
3. <em>Coesão Alta</em> &#8211; Uma classe que tem responsabilidades moderadas em uma área funcional e colabora com outras classes para realizar a tarefa.<br />
4. <em>Coesão Moderada</em> &#8211; Uma classe tem peso leve e responsabilidade exclusivas em algumas áreas logicamente relacionadas ao conceito da classe, mas não umas com as outras.</p>
<h2>Conclusão</h2>
<p>Assim como o Baixo Acoplamento, Coesão Alta é um princípio que devemos ter em mente durante todo o desenvolvimento/projeto de um sistema, pois auxilia a avaliação de alternativas e de tomada de decisão sobre os objetos de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/07/principio-alta-coesao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípio Acoplamento Baixo</title>
		<link>http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/</link>
		<comments>http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 02:29:26 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=733</guid>
		<description><![CDATA[Acoplamento é uma media de quão fortemente um elemento está conectado a, tem conhecimento de, ou depende de outros elementos. Um objeto com acoplamento baixo (ou fraco) não depende de muitos outros objetos. O nível de acoplamento pode ser analisado &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>Acoplamento</strong> é uma media de quão fortemente um elemento está conectado a, tem conhecimento de, ou depende de outros elementos. Um objeto com acoplamento baixo (ou fraco) não depende de muitos outros objetos.<br />
O nível de acoplamento pode ser analisado de vários pontos, desde classes, pacotes e camadas à subsistemas e sistemas.</p>
<p><strong>Problema:</strong> Como apoiar dependência baixa, baixo impacto de modificação e aumentar o reúso?</p>
<p><strong>Solução:</strong> Atribuir responsabilidade de modo que o acoplamento permaneça baixo.</p>
<p>Abaixo segue alguns efeitos na arquitetura que uma classes com acoplamento alto (ou forte) pode causar:</p>
<ul>
<li><strong>Rigidez:</strong> Alteração em uma  classe, obriga a alteração em diversas classes relacionadas, gerando uma cadeia de manutenção, conhecidas como <strong>“efeito dominó”</strong>.</li>
<li><strong>Fragilidade:</strong> Dificuldade de manutenção em um determinado ponto do sistema, pois gera problemas em outro ponto não relacionado, conhecido como <strong>“efeito borboleta-maremoto”</strong>, nomenclatura extraída da Teoria do Caos. Esta teoria defende que o simples bater de asas de uma borboleta em um extremo do mundo, pode causar um tornado no outro extremo.</li>
<li><strong>Imobilidade:</strong> Dificuldade de reutilização por excesso de dependência entre<br />
classes, conhecido como <strong>“efeito banana-gorila”</strong>, pois a dependência é tão grande que solicitar uma banana e é obtido um gorila junto com ela.</li>
</ul>
<p><strong>Formas comum de acoplamento entre classes:</strong> </p>
<ul>
<li>Objeto A tem um atributo do que se refere a instância de um objeto B.</li>
<li>Objeto A chama um serviço de um objeto B.</li>
<li>Objeto A tem um método que referencia uma instância de um objeto B (seja por parâmetro, variável local ou retorno da mensagem).</li>
<li>Objeto A é uma subclasse do objeto B.</li>
<li>Objeto B é uma interface implementada pelo objeto A.</li>
</ul>
<p><em>Dica:</em> O nível de acoplamento em si não deve ser considerado isolado de outros princípios tais como <a href="http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/">Especialista de Informação</a> e <a href="http://sylverio.com.br/blog/tag/o-o/">Coesão Alta</a>.</p>
<p><strong>Contra-Indicações</strong><br />
Acoplamento forte a objetos estáveis não é um problema. Exemplo: Pode-se acoplar com segurança a biblioteca Java (java.util, etc) ou .Net (System.Collections, etc) pois são estáveis e amplamente disseminadas.</p>
<p>O acoplamento alto não é um problema, mas passa a ser um problema em classes que estão sujeitas a modificações ou entre objetos de pacotes e/ou camadas diferentes. A idéia principal é minimizar os efeitos de dependência excessivo entre objetos a fim de reduzir os impactos de modificações e permitir o reuso de objetos.<br />
Devemos sempre avaliar o grau de acoplamento entre objetos e quais as conseqüências teremos em nosso sistema ao aumenta-lo.<br />
Objetos genéricos devem sempre ter um nível de acoplamento muito baixo possibilitar reutiliza-lo em diversas partes do sistemas sem grandes impactos de dependência.<br />
Por outro lado, objetos com ausência de acoplamento também não são bem vistos no sistema, pois contradiz a metáfora central da tecnologia de objetos: <span style="text-decoration:underline;"><em>&#8220;um sistema é composto por objetos conectados que se comunicam por mensagens&#8221;</em></span>.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Não é afetado por mudanças em outros computadores.</li>
<li>Simples de entender isoladamente.</li>
<li>É conveniente para reutilização.</li>
</ul>
<p><strong>Padrões Relacionados</strong></p>
<ul>
<li>Variação Protegida</li>
</ul>
<p>Enjoy <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípio Especialista de Informação</title>
		<link>http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/</link>
		<comments>http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/#comments</comments>
		<pubDate>Tue, 31 May 2011 01:22:34 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=709</guid>
		<description><![CDATA[Em um projetos de software desenvolvemos diversos objetos. Que por sua vez, fazer diversas interações entre si. As escolhas que tomamos ao aplicar responsabilidades nesses objetos definem como será suas interações, se escolhermos bem, teremos sistemas mais fáceis de se &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Em um projetos de software desenvolvemos diversos objetos. Que por sua vez, fazer diversas interações entre si. As escolhas que tomamos ao aplicar responsabilidades nesses objetos definem como será suas interações, se escolhermos bem, teremos sistemas mais fáceis de se entender, de se manter e de estender. Senão! Bem&#8230; É melhor nem imaginar.<br />
A principal característica da atribuição de responsabilidades baseado na informação que o objeto detem, está em não sobrecarregar os objetos com responsabilidades que poderiam ser delegadas.<br />
O objeto só deve fazer o que está relacionado com a sua abstração. Para isso, delega as demais atribuições para quem está mais apto a fazer. Quando o objeto não sabe quem é o mais apto, pergunta para algum outro objeto que saiba.</p>
<p><strong>Problema:</strong> Qual é um princípio geral de atribuição de responsabilidade a objetos?</p>
<p><strong>Solução:</strong> Atribua responsabilidade a classe que tem a <em>informação necessária para satisfazer a responsabilidade</em>.</p>
<p><em>Dica:</em> Pergunte se realmente aquela responsabilidade é relevante ao objeto, enuncie claramente a responsabilidade do objeto. Que objeto é responsável por conhecer/fazer <em>[coloque a responsabilidade do objeto aqui]</em>? Esse questionamento irá auxilia-lo a definir melhor os atributos e métodos de seus objetos.</p>
<p>O <strong>Especialista de Informação</strong> é um princípio básico usado continuamente no projeto de objetos, ele expressa a <em>&#8220;intuição&#8221;</em> comum de que objetos fazem coisas relacionadas a informação que têm.<br />
Geralmente fazem operações de coisas inanimadas que representa no mundo real. Por exemplo, uma venda não informa o seu total, ela é algo inanimado. Alguém calcula o total da venda. Craig Larman denomina isso como princípio da <em>&#8220;animação&#8221;</em> no projeto de objetos. </p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Mantém o encapsulamento pois utiliza informações próprias e apóia ao <a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">acoplamento baixo</a>.</li>
<li>Distribui o comportamento uniformemente entre as classes do sistema, aumentando a coesão das mesmas.</li>
</ul>
<p><strong>Contra-indicação:</strong><br />
Em algumas situações, a sugestão sugerida pelo especialista é indesejável, em geral por causa de problemas de acoplamento e de coesão.  </p>
<p><strong>Referência:</strong></p>
<ul>
<li>Utilizando UML e Padrões &#8211; Larman, Craig</li>
<li><a href="http://www.computacao.ufcg.edu.br/" target="_black">UFCG &#8211; Departamento de Sistemas e Computação</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípio Criador</title>
		<link>http://sylverio.com.br/blog/2011/02/principio-criador/</link>
		<comments>http://sylverio.com.br/blog/2011/02/principio-criador/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 11:54:27 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=662</guid>
		<description><![CDATA[Criar objetos em sistemas orientados a objetos é algo rotineiro. Porem quem cria o objeto X? Qual a classe que deve ter essa resposabilidade? São questões levantadas em diversos momentos da implementação do código. Apesar de ser um processo simples, &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/02/principio-criador/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Criar objetos em sistemas orientados a objetos é algo rotineiro. Porem quem cria o objeto X? Qual a classe que deve ter essa resposabilidade? São questões levantadas em diversos momentos da implementação do código.<br />
Apesar de ser um processo simples, a instânciação de objetos no código sem uma devida análise dos impactos pelo programador acarreta em um projeto com um alto acoplamento, tornando difícil sua manutenção e reutilização.</p>
<p><strong>Problema</strong>: Definir adequadamente aplicando o conceito de responsabilidade qual objeto é responsável pela criação de uma nova instância dentro da aplicação.</p>
<p><strong>Solução</strong>: Atribua à classe B a resposnabilidade de criar a instância da classe A se uma das seguintes condições for verdadeira(quanto mais melhor):</p>
<ol>
<li>B &#8220;contém&#8221; A ou agrega A de modo composto</li>
<li>B registra A</li>
<li>B usa A de maneira muito próxima</li>
<li>B tem os dados iniciais de A</li>
</ol>
<p>O princípio criador auxilia na definição de qual objeto deve ser responsável por criar uma nova instância de classe. Essa atribuição bem definida da apoio para que o projeto apresente um baixo acoplamento, melhor encapsulamento e reutilização.<br />
Repare que a escolha adequada desse princípio (criador) impacta no princípio de <i>baixo acoplamento</i>.<br />
Outra forma de relacionamento também presente é de <i>especialista de informação</i> que é dado pela identificação de classes que possui os dados iniciais que serão passado como parâmetros durante a criação do objeto, mencionsado na condição 4.<br />
A identificação de relacionamentos de objetos por composição ou agregação é uma boa diretriz para identificar os objetos que serão responsáveis por instânciar classes.</p>
<p><strong>Contra-Indicações</strong>: Os processos onde é necessário instânciar classes de uma determinada família com base em um valor propriedades externa, é aconcelhável a delegar esse atividade a classes auxiliares chamadas de <i>Fabrica Concreta</i> ou <i>Abstrata</i>.</p>
<h3>Composição ou Agregação?</h3>
<p>Outro ponto onde programadores apresentam dúvidas é definir quando um relacionamento é dado por composição ou agregação.</p>
<p><strong>Relacionamentos de composição</strong>, é dado pela dependência na qual o tempo de vida de um objeto é controlado por outro que o criou. Em outras palavras, o ciclo de vida do objeto depende do tempo de vida de quem o criou.<br />
<img src="http://sylverio.com.br/blog/wp-content/uploads/2011/02/composicao-300x142.png" alt="Composição" title="Composição" width="300" height="142" class="alignnone size-medium wp-image-689" style="border-style:none; margin:5px;" /></p>
<p><strong>Relacionamentos de agregação</strong>, o tempo de vida dos objetos são independentes, ou seja, se o controlador for destruido, o objeto contido não será.<br />
<img src="http://sylverio.com.br/blog/wp-content/uploads/2011/02/agreagacao-300x154.png" alt="Agreagação" title="Agreagação" width="300" height="154" class="alignnone size-medium wp-image-692" style="border-style:none; margin:5px;"/></p>
<p>Podemos perceber que relacionamentos de composição quase sempre serão responsáveis por criarem objetos de seus relacionamentos, porem relacionamentos do tipo agregação normalmente não.</p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/02/principio-criador/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princípios de Orientação a Objetos</title>
		<link>http://sylverio.com.br/blog/2011/02/principios-de-orientacao-a-objetos/</link>
		<comments>http://sylverio.com.br/blog/2011/02/principios-de-orientacao-a-objetos/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 13:43:16 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=651</guid>
		<description><![CDATA[O conceito básico de orientação a objetos é a criação de objetos (instâncias) a partir de uma classe definida. A classe representa uma espécie de forma ou moldura de onde são instânciados objetos com as características. A classe portanto caracteriza &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/02/principios-de-orientacao-a-objetos/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://sylverio.com.br/blog/wp-content/uploads/2011/02/principios-300x261.png" alt="Princípios" title="Principios" width="300" height="261" class="alignright size-medium wp-image-673" style="border-style:none; margin:5px;padding-top:15px;" /></p>
<p>O conceito básico de orientação a objetos é a criação de objetos (instâncias) a partir de uma classe definida. A classe representa uma espécie de forma ou moldura de onde são instânciados objetos com as características. A classe portanto caracteriza os objetos criados, incorporando características (atributos) e ações (métodos).</p>
<p>Princípios de Orientação a Objetos norteiam o desenvolvimento orientado a objetos de forma a auxiliar para que sejam mais escalável e manutenível. Evitando que o conceito básico de orientação a objetos inflija <a href="http://pt.wikipedia.org/wiki/Heur%C3%ADstica_(computa%C3%A7%C3%A3o)">heurísticas</a> e métricas de desenvolvimento</p>
<p>Antes da apresentação dos princípios, gostaria de definir um ponto de vista. </p>
<h2>Padrões ou Princípios?</h2>
<p>A Definição de padrão é modelo, medida. Princípio é toda estrutura sobre a qual se constrói alguma coisa. Diferente dos padrões definidos pelo GoF, que reflete modelos de solução-problema, os princípios esta mais ligado a essência da programação, a forma de pensar e projetar um sistema.<br />
Por esse motivo não vou tratar GRASP como padrão (pattern) e sim como princípio.<br />
Pois os princípios devem ser incorporados pelo programador antes dos padrões.</p>
<p>Além dos 9 princípios GRASP que serão apresentados, há também outros princípios difundidos: </p>
<ul>
<li>Open-Close Principle (OCP)</li>
<li>Liskov Substitution Principle (LSP)</li>
<li>Single Responsability Principle (SRP)</li>
<li>Don&#8217;t Repeat Yourself (DRY)</li>
<li>Dependency Inversion Principle (DIP)</li>
<li>Interface Segregation Principle (ISP)</li>
</ul>
<p>Ao meu ver esses princípios são subprodutos do GRASP. Também vou apresenta-los mas após o GRASP para ficar mais explicito.</p>
<h3>Relacionamento de princípios</h3>
<p>Os patterns definem a solução para um determinado problema. Já os princípios são complementares e se relacionam para a aplicação de responsabilidade nos projetos de desenvolvimento de software e estão presentes em todos os níveis da aplicação.<br />
Ao apresentar cada princípio em detalhes será possível perceber esse relacionamento e dependência entre os princípios.</p>
<p>Até mais <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/02/principios-de-orientacao-a-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projeto de Objetos de Software</title>
		<link>http://sylverio.com.br/blog/2011/02/projeto-de-objetos-de-software/</link>
		<comments>http://sylverio.com.br/blog/2011/02/projeto-de-objetos-de-software/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 00:19:26 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=629</guid>
		<description><![CDATA[Recentemente participei do desenvolvimento de um projeto para implementar novas funcionalidades em um sistema de ERP criado em VB6. Sim, VB6 não é uma linguagem O.O., mas possui diversos recursos que se aproximam, como encapsulamento, herança entre outras. Apesar de &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2011/02/projeto-de-objetos-de-software/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://sylverio.com.br/blog/wp-content/uploads/2011/02/dilber1.gif"><img src="http://sylverio.com.br/blog/wp-content/uploads/2011/02/dilber1.gif" alt="Dilbert" title="Dilbert" width="586" height="208" class="alignnone size-full wp-image-637" /></a></p>
<p>Recentemente participei do desenvolvimento de um projeto para implementar novas funcionalidades em um sistema de ERP criado em VB6. Sim, VB6 não é uma linguagem O.O., mas possui diversos recursos que se aproximam, como encapsulamento, herança entre outras. Apesar de ser um sistema com mais ou menos uns 10 anos, é um bom sistema. Sua arquitetura é dividida em camadas, possui estrutura de persistência de dados, apesar de estar anos luz de um <a href="http://sylverio.com.br/blog/2009/02/persistencia-de-dados-com-ibatis-ou-nhibernate/">NHibernate</a>. Coisa que para a época de seu desenvolvimento é muito raro se encontrar hoje no mercado! </p>
<p>Uma única coisa me incomodou: os <i>DESENVOLVEDORES</i>. Apesar da arquitetura ser muito boa, muitos desenvolvedores que tiveram contato com a aplicação e não tinham conhecimentos de <b>projeto de software guiado por responsabilidade</b>. Se tivessem, com certeza manutenibilidade da aplicação seria bem melhor.</p>
<p>Esta não é uma visão isolada. A falta de comprometimento e conhecimento dos desenvolvedores é em maior instância a grande causadora de sistemas deficientes. Pensando nisso vou iniciar um série de diversos artigos apresentando e exemplificando a utilização dos Princípios de Orientação a Objetos e Padrões de Projetos. A ideia apresentar uma forma de raciocinar sobre como projetar objetos de software inserindo conceitos de <a href="http://sylverio.com.br/blog/2008/11/como-programar-com-%E2%80%9Cresponsabilidade%E2%80%9D/">responsabilidade</a>, papéis e colaboração.</p>
<h2>Projeto Guiado por Responsabilidade</h2>
<p>A UML define uma responsabilidade como <i>&#8220;um contrato ou obrigação de um classificador&#8221;</i> [OMG03b]. A ideia de responsabilidade de um objeto (esse raciocínio pode ser aplicado a um escala maior de interação como um componente) é dado pelo seu papel e as obrigações que deve executar, ou seja, pelo seu <i>fazer</i> e <i>conhecer</i>.</p>
<p>As responsabilidades de <b>fazer</b> de um objeto incluem:</p>
<ul>
<li>Fazer algo propriamente dito, como criar um objeto ou executar um cálculo.</li>
<li>Iniciar uma ação em outro objeto.</li>
<li>Controlar ou coordenar atividade em outros objetos.</li>
</ul>
<p>As responsabilidades de <b>conhecer</b> de um objeto incluem:</p>
<ul>
<li>Ter conhecimento de dados privados encapsulados.</li>
<li>Conhecer objetos relacionados.</li>
<li>Ter conhecimento sobre coisas que ele pode derivar ou calcular.</li>
</ul>
<p><i>Responsabilidades não é a mesma coisa que um método &#8211; é uma abstração &#8211; porem métodos satisfazem às responsabilidades.</i> Craig Larman &#8211; Utilizando UML e Padrões.</p>
<h2>Design Patterns</h2>
<p>Em engenharia de software, um padrão de projeto de software (ou o termo em inglês Design Pattern) é uma solução reutilizável para um problema comum em software. Design patterns não é uma solução final que pode ser transformada em código. Ele é uma descrição ou template para como resolver um problema e pode ser utilizado em diferentes situações e tipicamente mostram a relação e interação entre objeto.</p>
<h2>GRASP &#8211; General Responsibility Assignment Software Patterns</h2>
<p>Também conhecido como Princípios de Orientação a Objetos são padrões auxiliam na resolução de alguns problemas, e em quase todos os casos estes problemas são comuns para quase todos os projetos de desenvolvimento de software.<br />
Os princípios de orientação a objetos define 9 padrões, que auxiliam no projeto e desenvolvimento de qualquer objeto na definição de suas responsabilidades, eles são:</p>
<ul>
<li><a href="http://sylverio.com.br/blog/2011/02/principio-criador/">Creator</a> (Criador)</li>
<li><a href="http://sylverio.com.br/blog/2011/05/principio-especialista-de-informacao/">Information Expert</a> (Especialista de Informação)</li>
<li><a href="http://sylverio.com.br/blog/2011/06/principio-acoplamento-baixo/">Low Coupling</a>  (Baixo Acoplamento)</li>
<li><a href="http://sylverio.com.br/blog/2011/07/principio-alta-coesao/">High Cohesion (Alta Coesão)</a></li>
<li><a href="http://sylverio.com.br/blog/2011/08/principio-controlador/">Controller (Controlador)</a></li>
<li><a href="http://sylverio.com.br/blog/2012/01/polimorfismo/">Polymorphism (Poliformismo)</a></li>
<li>Pure Fabrication (Invenção Pura)</li>
<li>Indirection (Indireção)</li>
<li>Protected Variations (Variações Protegidas)</li>
</ul>
<h3>Conclusão</h3>
<p>Dominar o conhecimento e racionar sobre objetos guiado por responsabilidade e entender os princípios de orientação a objetos é é vital para o desenvolvimento de qualquer aplicação orientada a objetos. Não é a utilização de linguagem OO (como C# ou Java) que torna um aplicação orientada a objetos e sim o domínio dos conceitos acima.</p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2011/02/projeto-de-objetos-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Estilo de programação</title>
		<link>http://sylverio.com.br/blog/2009/06/estilo-de-programacao/</link>
		<comments>http://sylverio.com.br/blog/2009/06/estilo-de-programacao/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 03:52:55 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=159</guid>
		<description><![CDATA[Não é nada de outro mundo, mas totalmente fundamental para o desenvolvimento de software em equipe. Estilo são definições de como escrever o código fonte, em outras palavras, padrões de nomenclatura para nomes e declarações de variáveis, atributos, métodos, classes, &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2009/06/estilo-de-programacao/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Não é nada de outro mundo, mas totalmente fundamental para o desenvolvimento de software em equipe. Estilo são definições de como escrever o código fonte, em outras palavras, padrões de nomenclatura para nomes e declarações de variáveis, atributos, métodos, classes, etc.</p>
<p>Para isso podemos seguir algumas convenções (como em Java e C#.Net), ou criar um definições de estilo com apropria equipe em questão.</p>
<p><strong>Vantagens ao usar estilo</strong></p>
<p>Quando se esta desenvolvendo em equipe, o código deve ser compreendido por todos os membros. O estilo de programação tem como função auxiliar a equipe escrever código de modo único, assim é de fácil compreenção os códigos criados por outros menbros.</p>
<p><strong>Complementação do estilo</strong></p>
<p>Mais meu habito que propriamente do estilo, é ter um cuidado especial ao se definir nomes de objetos, métodos, atributos, variáveis, entre outros. A correta nomeação dos elementos no código ajuda a diminuir o hiato entre o código e mundo real, e assim como estilo de programação, também tornar mais fácil sua compreensão.</p>
<p><strong>Exemplos do dia a dia</strong></p>
<p>Recentemente estive envolvido em um projeto de uma aplicação antiga. Não havia na empresa mais nenhum desenvolvedor que criou a aplicação e precisávamos implementar algumas melhorias. Ao começar a implementar as melhorias, me deparei com algumas variáveis chamada X, Y, item. E perdi horas tentando compreender o que significa X, Y e item.</p>
<p><strong>Conclusão</strong></p>
<p>Para exemplificar esses conceitos, criei 2 aplicações iguais, ambas em Java, porem o primeiro está totalmento sem estilo e o segundo com um estilo que normalmente sigo. Compare e tire suas próprias conclusões:</p>
<p><strong>Aplicação sem estilo</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> XyZ <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> no<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> XyZs <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Iterator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Application <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		XyZs xxs <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XyZs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		xxs.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Cria<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sergio&quot;</span>, <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		xxs.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Cria<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Rafael&quot;</span>, <span style="color: #cc66cc;">24</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		xxs.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Cria<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Frank&quot;</span>, <span style="color: #cc66cc;">22</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		ImprimeLista<span style="color: #009900;">&#40;</span>xxs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> XyZ Cria<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> n, <span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		XyZ x <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XyZ<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		x.<span style="color: #006633;">no</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
		x.<span style="color: #006633;">id</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> x<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> ImprimeLista<span style="color: #009900;">&#40;</span>XyZs g<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;==== Lista de Amigos ==== <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Iterator</span> i <span style="color: #339933;">=</span> g.<span style="color: #006633;">iterator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			XyZ a <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>XyZ<span style="color: #009900;">&#41;</span> i.<span style="color: #006633;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Nome: &quot;</span> <span style="color: #339933;">+</span> a.<span style="color: #006633;">no</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; idade: &quot;</span> <span style="color: #339933;">+</span> a.<span style="color: #006633;">id</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Aplicação com estilo</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Amigo <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> nome<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> idade<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Amigos <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Iterator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Application <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// cria lista de amigos</span>
		Amigos amigos <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Amigos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// adiciona amigo a lista</span>
		amigos.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>CriaAmigo<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sergio&quot;</span>, <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		amigos.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>CriaAmigo<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Rafael&quot;</span>, <span style="color: #cc66cc;">24</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		amigos.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>CriaAmigo<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Frank&quot;</span>, <span style="color: #cc66cc;">22</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		ImprimeLista<span style="color: #009900;">&#40;</span>amigos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Amigo CriaAmigo<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nome, <span style="color: #000066; font-weight: bold;">int</span> idade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		Amigo ret <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Amigo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		ret.<span style="color: #006633;">nome</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
		ret.<span style="color: #006633;">idade</span> <span style="color: #339933;">=</span> idade<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> ret<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> ImprimeLista<span style="color: #009900;">&#40;</span>Amigos amigos<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;==== Lista de Amigos ==== <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Iterator</span> i <span style="color: #339933;">=</span> amigos.<span style="color: #006633;">iterator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Amigo amigo <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Amigo<span style="color: #009900;">&#41;</span> i.<span style="color: #006633;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Nome: &quot;</span> <span style="color: #339933;">+</span> amigo.<span style="color: #006633;">nome</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; idade: &quot;</span> <span style="color: #339933;">+</span> amigo.<span style="color: #006633;">idade</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Perceptível a diferença, não?</p>
<p><strong>Links Complementares:</strong></p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/x2dbyw72(VS.71).aspx" target="_blank">Convenções MS Capitalization Styles</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx" target="_blank">Orientações para nomeação MS</a></li>
<li><a href="http://pt.wikipedia.org/wiki/CamelCase" target="_blank">CamelCase</a></li>
<li><a href="http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_h%C3%BAngara" target="_blank">Notação Húngara</a></li>
</ul>
<p>Não encontri nenhum artigo de estilo de Java, assim que eu encontrar eu posto aqui. Enquanto isso podemos ver a <a href="http://java.sun.com/reference/api/" target="_blank">API do Java</a> e tirar nossas conclusões de como escrever em Java com um estilo bem parecido.</p>
<p>Até mais&#8230; <img src='http://sylverio.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/06/estilo-de-programacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vídeo interessante</title>
		<link>http://sylverio.com.br/blog/2009/03/video-interessante/</link>
		<comments>http://sylverio.com.br/blog/2009/03/video-interessante/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 03:04:22 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[RUP]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=81</guid>
		<description><![CDATA[Pessoal, encontrei um vídeo com uma palestra sobre Domain Driven Design, no Blog da Localweb. Achei bem legal pois ele completa um pouco o post anterior. Enjoy!]]></description>
			<content:encoded><![CDATA[<p>Pessoal, encontrei um vídeo com uma palestra sobre <a href="http://agilblog.locaweb.com.br/2009/03/10/video-sobre-domain-driven-design/" target="_blanck">Domain Driven Design</a>, no Blog da Localweb.</p>
<p>Achei bem legal pois ele completa um pouco o post anterior.
<p>
</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/03/video-interessante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

