<?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>tucaz.blog.now() &#187; OO</title>
	<atom:link href="http://blog.tucaz.net/category/oo/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tucaz.net</link>
	<description>Software architecture, agile and all that stuff that you can find everywhere</description>
	<lastBuildDate>Tue, 11 Jan 2011 21:00:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ninject, StructureMap e Padrões de Injeção de Dependência</title>
		<link>http://blog.tucaz.net/2010/08/04/ninject-structuremap-e-padroes-de-injecao-de-dependncia/</link>
		<comments>http://blog.tucaz.net/2010/08/04/ninject-structuremap-e-padroes-de-injecao-de-dependncia/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 03:57:56 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[abstract factory]]></category>
		<category><![CDATA[DI]]></category>
		<category><![CDATA[factory]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[ninject]]></category>
		<category><![CDATA[structuremap]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=433</guid>
		<description><![CDATA[Este post foi motivado por esta thread no DNA e por essa question no StackOverflow.com a respeito de um problema que encontrei nesta última semana em um cenário relativamente complexo de injeção de dependência.
Contexto
A arquitetura em questão utiliza injeção de dependência com base em interfaces, ou seja, todas as dependências das minhas classes são sempre [...]]]></description>
			<content:encoded><![CDATA[<p>Este post foi motivado por <a title="Discussão a respeito de IoC/DI no DotNetArchitects" href="http://groups.google.com/group/dotnetarchitects/browse_thread/thread/3fc4c95c4f0c150d">esta thread no DNA</a> e por <a title="Resolving dependencies @ StackOveflow.com" href="http://stackoverflow.com/questions/3335735/resolving-automatic-and-manual-dependencies">essa question no StackOverflow.com</a> a respeito de um problema que encontrei nesta última semana em um cenário relativamente complexo de injeção de dependência.</p>
<h2>Contexto</h2>
<p>A arquitetura em questão utiliza injeção de dependência com base em interfaces, ou seja, todas as dependências das minhas classes são sempre pra interfaces (contratos) e nunca para classes concretas (implementação) exatamente como manda o figurino.</p>
<p>Meu domínio é o padrão: carrinho de compras com Pedido e seus itens. Uma classe é responsável por efetuar o processamento do pedido (<em>GeradorPedido</em>). Ela executa todos os procedimentos necessários para que um pedido seja gerado de maneira correta, dentre eles aplicar um determinado fator de ajuste de preços dos itens acordo com a loja onde o pedido foi vendido. Este fator de ajuste é determinado pela classe <em>Precificador</em> e deve ser desconhecido para o restante dos outros objetos a fim de não violar o <a title="Single Responsibility Principle @ Wikipedia" href="http://en.wikipedia.org/wiki/Single_responsibility_principle">SRP</a>.</p>
<p>O diagrama abaixo representa as classes envolvidas e suas dependências:</p>
<p><a href="http://blog.tucaz.net/wp-content/uploads/2010/07/classes2.png"><img class="aligncenter size-full wp-image-437" title="Diagrama de Classes" src="http://blog.tucaz.net/wp-content/uploads/2010/07/classes2.png" alt="" width="619" height="426" /></a></p>
<p>Como aplicar este fator ao preço do item não é responsabilidade do <em>GeradorPedido</em>, sempre que uma instância de <em>GeradorPedido</em> é criada, injeto via construtor uma nova instância de <em>Precificador</em> pra ser usado quando necessário. Neste caso, temos uma dependência direta de <em>GeradorPedido</em> para <em>IPrecificador</em> que é resolvida em tempo de execução.</p>
<p>Tudo estava sendo resolvido utilizando <a title="Ninject's Website" href="http://www.ninject.org/">Ninject</a>:</p>
<p>MyModule.cs</p>
<pre name="code" class="csharp">public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind&lt;IPrecificador&gt;().To&lt;Precificador&gt;();
        Bind&lt;IGeradorPedido&gt;().To&lt;GeradorPedido&gt;();
    }
}</pre>
<p>UnitTest1.cs</p>
<pre name="code" class="csharp">[TestMethod]
public void consegue_resolver_GeradorPedido()
{
    MyModule module = new MyModule();
    StandardKernel kernel = new StandardKernel(module);
    var geradorPedido = kernel.Get();

    Assert.IsNotNull(geradorPedido);
}</pre>
<p>Precificador.cs</p>
<pre name="code" class="csharp">class Precificador : IPrecificador
{
    private decimal _fatorAjuste;

    public Precificador()
    {
        _fatorAjuste = 10m;
    }

    public decimal CalcularPreco(ItemPedido item)
    {
        return item.Preco * _fatorAjuste;
    }
}</pre>
<p>GeradorPedido.cs</p>
<pre name="code" class="csharp">class GeradorPedido : IGeradorPedido
{
    private IPrecificador _precificador;

    public GeradorPedido(IPrecificador precificador)
    {
        _precificador = precificador;
    }

    public string Processar(Pedido novoPedido)
    {
        decimal total = 0;

        foreach (var item in novoPedido.Itens)
        {
            total += _precificador.CalcularPreco(item);
        }

        //Faz mais algumas operações com pedido

        //Número do pedido
        return "ABC123";
    }
}</pre>
<p>Até aqui, tudo OK, certo? Ai entra um novo requisito e com ele aparece o problema&#8230;</p>
<h2>Novo Requisito</h2>
<p>Alguém decidiu que o fator dos preços deveria variar de acordo com a loja em que o pedido estava sendo feito. Se isso é uma regra de preço, a qual classe pertence? <em>Precificador</em>!</p>
<p>Quais opções temos pra implementar isso com o mínimo de impacto possível no sistema (já que a interface <em>IPrecificador</em> já estava sendo usada) e de maneira que a coesão e desacoplamento seja mantido?</p>
<h3>Opção 1 &#8211; Adicionar um paramêtro no método CalcularPreco</h3>
<p>A primeira opção que me veio a cabeça foi adicionar o paramêtro com a loja diretamente no método CalcularPreco da interface <em>IPrecificador</em>.</p>
<p>IPrecificador.cs</p>
<pre name="code" class="csharp">class Precificador : IPrecificador
{
    private decimal _fatorAjuste;

    public decimal CalcularPreco(ItemPedido item, Loja vendaEfetuadaEm)
    {
        if (vendaEfetuadaEm == Lojas.LojaUm)
            _fatorAjuste = 10m;
        else if (vendaEfetuadaEm == Lojas.LojaDois)
            _fatorAjuste = 15.4m;
        else
            _fatorAjuste = 0.9m;

        return item.Preco * _fatorAjuste;
    }
}</pre>
<p>Parecia uma boa saída, mas depois de pensar alguns minutos encontrei dois side-effects graves que me fizeram mudar de idéia:</p>
<ol>
<li>O novo paramêtro, <em>Loja</em>, passaria também a virar uma dependência direta pra todos que consumissem a interface <em>IPrecificador</em> já que estes [consumidores] seriam responsáveis por repassar a loja para poder realizar a chamada a CalcularPreco. Com isso estariamos violando o SRP adicionando um motivo a mais pra classe <em>GeradorPedido</em> e outras mudarem.</li>
<li>Diversos testes seriam quebrados pela adição do novo paramêtro, indicando que talvez não fosse a melhor alternativa já que essa alteração deveria afetar apenas uma classe</li>
</ol>
<h3>Opção 2 &#8211; Adicionar este paramêtro ao construtor da classe Precificador e utilizar uma Factory</h3>
<p>Já que esta alteração diz respeito apenas a responsabilidade da classe <em>Precificador</em>, que tal adicionar este paramêtro ao construtor da classe? Ótima idéia, não?</p>
<p>De fato foi a solução que fez mais sentido já que necessariamente para chegar ao fator de preço a ser aplicado a classe precisa saber com qual loja estamos lidando. Para implementar, bastaria fornecer a loja via construtor e armazenar o valor em um membro privado da classe pra uso posterior. Dessa forma, todos os consumidores dessa classe iriam receber uma instância de <em>IPrecificador</em> já configurada e pronta pra uso sem a necessidade de se preocupar em fornecer a loja.</p>
<p>Nosso novo Precificador.cs ficaria assim:</p>
<pre name="code" class="csharp">class Precificador : IPrecificador
{
    private decimal _fatorAjuste;

    public Precificador(Loja vendaEfetuadaEm)
    {
        if (vendaEfetuadaEm == Lojas.LojaUm)
            _fatorAjuste = 10m;
        else if (vendaEfetuadaEm == Lojas.LojaDois)
            _fatorAjuste = 15.4m;
        else
            _fatorAjuste = 0.9m;
    }

    public decimal CalcularPreco(ItemPedido item)
    {
        return item.Preco * _fatorAjuste;
    }
}</pre>
<p>No entanto, na hora que fui implementar esta solução esbarrei no meu container de DI, até então o Ninject, que resolvia a dependência de <em>IPrecificador</em> pra mim automaticamente sempre que necessário. Contudo, pra esta implementação eu precisaria fornecer um valor (a <em>Loja</em>) que só podia ser obtido em runtime na hora de construir a instância de <em>IPrecificador</em>.</p>
<p>Então a solução seria utilizar uma Factory!</p>
<p>GeradorPedidoFactory.cs</p>
<pre name="code" class="csharp">class GeradorPedidoFactory
{
    public static IGeradorPedido Criar(Loja vendaEfetuadaEm)
    {
        IPrecificador precificador = new Precificador(vendaEfetuadaEm);
        return new GeradorPedido(precificador);
    }
}</pre>
<p>Mas trinta segundos depois descartei essa idéia porque <em>IPrecificador</em> estava sendo usado por outras classes além de <em>GeradorPedido</em> então eu teria que criar uma factory pra cada uma das classes que fosse consumidora de <em>IPrecificador</em>. Também dessa forma eu estaria anulando meu Container de DI espalhando a criação de tipos concretos por diversas factories ao invés de centralizar em apenas um ponto.</p>
<h3>Opção 3 – Manter o construtor e utilizar uma Abstract Factory pra criar IPrecificador</h3>
<p>A terceira e ultima opção antes da solução final foi utilizar uma Abstract Factory, que seria injetada via DI em todo mundo que precisasse de <em>IPrecificador</em> eliminando a necessidade de uma factory pra cada construtor e mantendo a responsabilidade no lugar adequado. Algo assim:</p>
<p>PrecificadorFactory.cs</p>
<pre name="code" class="csharp">class PrecificadorFactory : IPrecificadorFactory
{
    public IPrecificador Criar(Loja vendaEfetuadaEm)
    {
        return new Precificador(vendaEfetuadaEm);
    }
}</pre>
<p>MyModule.cs</p>
<pre name="code" class="csharp">public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind&lt;IPrecificadorFactory&gt;().To&lt;PrecificadorFactory&gt;();
        Bind&lt;IGeradorPedido&gt;().To&lt;GeradorPedido&gt;();
    }
}</pre>
<p>GeradorPedido.cs</p>
<pre name="code" class="csharp">class GeradorPedido : IGeradorPedido
{
    private IPrecificadorFactory _precificadorFactory;

    public GeradorPedido(IPrecificadorFactory precificadorFactory)
    {
        _precificadorFactory = precificadorFactory;
    }

    public string Processar(Pedido novoPedido, Loja vendaEfetuadaEm)
    {
        IPrecificador precificador = _precificadorFactory.Criar(vendaEfetuadaEm);
        decimal total = 0;

        foreach (var item in novoPedido.Itens)
        {
            total += precificador.CalcularPreco(item);
        }

        //Faz mais algumas operações com pedido

        //Número do pedido
        return "ABC123";
    }
}</pre>
<p>Contudo, na hora que implementei pra ver como ficaria, percebi que tinha o mesmo problema da primeira solução: todo mundo que precisasse consumir <em>IPrecificador</em> teria que receber o paramêtro informando a <em>Loja</em> onde a venda foi efetuada para repassar para a abstract factory de IPrecificador a fim de criar uma instância concreta da classe. A dependência tinha voltado, apesar de a responsabilidade estar um pouco melhor distribuida. <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<h3>A Solução Final</h3>
<p>Quando eu já estava quase desistindo de procurar outra alternativa (mais uma) o <a title="Pedro Reys @ Twitter" href="http://twitter.com/pedroreys">@pedroreys</a> deu uma idéia excelente: fornecer previamente ao container de DI a instância de <em>IPrecificador</em> que deveria ser usada quando ela fosse necessária.</p>
<p>Na hora fui atrás de como fazer isso com o Ninject que, era meu container até então. Infelizmente ele não implementa essa funcionalidade especifíca. Pelo menos não da maneira que eu gostaria <strong>[1]</strong>.</p>
<p>Foi ai que decidi mudar para o <a title="StructureMap @ GitHub" href="http://structuremap.github.com/structuremap/index.html">StructureMap</a>, container utilizado no exemplo do <a title="Pedro Reys @ Twitter" href="http://twitter.com/pedroreys">@pedroreys</a>. O StructureMap, apesar de ter sido um dos primeiros containers de DI/IoC lançados (e de ser um pouco <em>verboso</em> demais pro meu gosto), se mantém atualizado e com uma excelente interface fluente exatamente como o Ninject.</p>
<p>A troca foi simples já que eu utilizo um Wrapper (omitido por breviedade) pro Ninject e a aplicação não tem contato com o container em si. O resultado acabou sendo um Mix de todas as soluções:</p>
<p>PrecificadorFactory.cs</p>
<pre name="code" class="csharp">class PrecificadorFactory
{
    public static IPrecificador Criar(Loja vendaEfetuadaEm)
    {
        return new Precificador(vendaEfetuadaEm);
    }
}</pre>
<p>UnitTest1.cs</p>
<pre name="code" class="csharp">[TestMethod]
public void consegue_resolver_GeradorPedido()
{
    Loja vendaEfetuadaEm = RecuperarLojaOndeVendaFoiEfetuada();

    IPrecificador precificador = PrecificadorFactory.Criar(vendaEfetuadaEm);

    Container container = new Container();

    IGeradorPedido geradorPedido = container.With&lt;IPrecificador&gt;(precificador).GetInstance&lt;IGeradorPedido&gt;();

    Assert.IsNotNull(geradorPedido);
}</pre>
<p>Dessa forma consigo:</p>
<ol>
<li>Criar a instância de <em>IPrecificador</em> separadamente</li>
<li>Dizer ao container que quero que esta instância especifica seja usada somente nesta resolução de <em>IGeradorPedido</em></li>
<li>Manter cada classe com sua responsabilidade</li>
</ol>
<p>Any thoughts o this?</p>
<p><strong>[1] – O Ninject, na última versão (2.0), implementa o método Rebind() que permite trocar o bind de uma interface em runtime. No entanto, esta troca é permanente e afeta todos os consumidores do container (Singleton, no meu caso) e no meu contexto, não faz muito sentido.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2010/08/04/ninject-structuremap-e-padroes-de-injecao-de-dependncia/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Resultado da terceira reunião do grupo DotNetArchitects &#8211; Com vídeo :)</title>
		<link>http://blog.tucaz.net/2008/12/29/resultado-da-terceira-reuniao-do-grupo-dotnetarchitects-com-video/</link>
		<comments>http://blog.tucaz.net/2008/12/29/resultado-da-terceira-reuniao-do-grupo-dotnetarchitects-com-video/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 00:27:55 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Apresentações]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[DotNetArchitects]]></category>
		<category><![CDATA[Apresentação DDD]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=202</guid>
		<description><![CDATA[Vídeos e slides da apresentação sobre DDD da terceira reunião do grupo DotNetArchitects.]]></description>
			<content:encoded><![CDATA[<p>No último dia 13 tivemos a terceira reunião do <a title="DotNetArchitects" href="http://www.dotnetarchitects.net/" target="_self">grupo</a> e os resultados podem ser vistos <a title="DotNetArchitects - Resultado da terceira reunião" href="http://dotnetarchitects.net/dotnetarchitects/post/Resultado-da-terceira-reuniao-DDD.aspx" target="_self">nesse post</a>.</p>
<p>Os vídeos da apresentação do <a title="Giovanni Bassi - Blog" href="http://unplugged.giggio.net/">Giovanni</a> sobre DDD e do debate posterior também já estão disponíveis para quem não pode ir ou tem interesse no assunto assim como os slides:</p>
<p><strong>Apresentação</strong></p>
<div><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="362" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=-7056786168177403020&amp;hl=pt-BR&amp;fs=true" /><embed id="VideoPlayback" type="application/x-shockwave-flash" width="400" height="362" src="http://video.google.com/googleplayer.swf?docid=-7056786168177403020&amp;hl=pt-BR&amp;fs=true"></embed></object></div>
<p><strong>Debate</strong></p>
<div><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="362" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=3055016873351250860&amp;hl=pt-BR&amp;fs=true" /><embed id="VideoPlayback" type="application/x-shockwave-flash" width="400" height="362" src="http://video.google.com/googleplayer.swf?docid=3055016873351250860&amp;hl=pt-BR&amp;fs=true"></embed></object></div>
<p><strong>Slides</strong></p>
<div id="__ss_852102" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="DDD &gt; Experiências" href="http://www.slideshare.net/giovanni.bassi/ddd-experincias-presentation?type=powerpoint">DDD &gt; Experiências</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=ddd1-copy-1229483358051446-1&amp;stripped_title=ddd-experincias-presentation" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=ddd1-copy-1229483358051446-1&amp;stripped_title=ddd-experincias-presentation" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View SlideShare <a style="text-decoration:underline;" title="View DDD &gt; Experiências on SlideShare" href="http://www.slideshare.net/giovanni.bassi/ddd-experincias-presentation?type=powerpoint">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/ddd">ddd</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/net">.net</a>)</div>
</div>
<p>Olha como melhoramos! Em comparação com o material da <a title="Apresentação sobre Scrum" href="http://blog.tucaz.net/2008/11/27/video-da-segunda-reuniao-dotnetarchitects-com-miinha-apresentacao-online/" target="_self">minha apresentação</a>, a gravação do áudio e vídeo já estão muito melhores.</p>
<p>Obrigado e parabéns novamente ao pessoal da UNIP que está apoiando a gente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/12/29/resultado-da-terceira-reuniao-do-grupo-dotnetarchitects-com-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET Scrum &#8211; Projeto Open Source</title>
		<link>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source/</link>
		<comments>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 20:16:31 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[.NET Scrum]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Codeplex]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Fluent Interfaces]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Spring.NET]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=195</guid>
		<description><![CDATA[Projeto .NET open source para gerenciamente de projetos utilizando Scrum como disciplina. Boas práticas de engenharia e conducação de projetos utilizando frameworks e práticas de mercado.]]></description>
			<content:encoded><![CDATA[<p>Há poucas semanas, batendo papo com o pessoal do <a title="DotNetArchitects - Arquitetura em .NET" href="http://www.dotnetarchitects.net/" target="_self">DotNetArchitects</a>, surgiu a idéia de utilizarmos uma ferramenta de gerenciamento de projetos Scrum pra cuidar dos das nossas atividades dentro do grupo.</p>
<p>Fui pesquisar, mas não encontrei nenhuma ferramenta gratuita web que pudessemos usar. Foi ai que surgiu o <a title=".NET Scrum - Ferramenta open source de gerenciamento de projetos Scrum" href="https://www.codeplex.com/netscrum" target="_self"><strong>.NET Scrum</strong></a>. A idéia não é construir nada pra competir com o que existe por ai, mas utilizar da idéia pra ter um laboratório e construir um projeto onde possamos aplicar o que há de mais novo em tecnologia além de boas práticas de engenharia e condução de projetos.</p>
<p>Portanto, quem der uma olhada no projeto e quiser contribuir ou apenas acompanhar vai encontrar um ASP.NET MVC, jQuery, NHibernate usando interfaces fluentes, DDD, TDD, Spring.NET e outros frameworks e design patterns importantes para a construção de uma boa solução em .NET.</p>
<p>Se deixarmos de lado a parte tecnológica também é possível aprender um bocado trabalhando na organização de um projeto open source. Projetos de código aberto e mantidos pela comunidade são o maior caso de sucesso de times distribuidos trabalhando juntos a fim de atingir um objetivo. Se já é difícil obter sucesso em um projeto com o time no mesmo lugar, imagine trabalhar com pessoas que você nunca viu na vida e com comunicação relativamente limitada? Um grande desafio!</p>
<p>O <a title="Mauricio Aniche - Blog" href="http://aniche.com.br/blog/" target="_self">Maurício Aniche</a> que participa do DotNetArchitects já se juntou ao projeto pra me ajudar. Já existem alguns códigos publicados no codeplex e uma documentação miníma também. Quem quiser ajudar é mais do que bem vindo! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Domain-Driven Design, Eric Evans &#8211; Livro gratuito na web</title>
		<link>http://blog.tucaz.net/2008/12/12/domain-driven-design-eric-evans-livro-gratuito-na-web/</link>
		<comments>http://blog.tucaz.net/2008/12/12/domain-driven-design-eric-evans-livro-gratuito-na-web/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 13:30:17 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[DDD]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Eric Evans]]></category>
		<category><![CDATA[Livros Gratuitos]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=182</guid>
		<description><![CDATA[Livro gratuito sobre Domain-Driven Design do autor Eric Evans disponível na web]]></description>
			<content:encoded><![CDATA[<p>Navegando, há pouco, nas minhas feeds encontrei um <a title="Giovanni Bassi - Unplugged .NET" href="http://unplugged.giggio.net/unplugged/post/Livro-de-DDD-do-Evans-de-graca-na-web.aspx" target="_blank">post que o Giovanni</a> publicou recentemente oferecendo o link para o livro &#8220;Domain-Driven Design: Tackling Complexity in the Heart of Software&#8221; do Eric Evans disponível <a title="Domain Driven Design - Gratuito" href="http://books.google.com/books?id=7dlaMs0SECsC&amp;printsec=frontcover" target="_blank">gratuitamente na web através do Google Books</a>.</p>
<p>Este é um dos livros que recomendo fortemente a leitura e que está na minha seção de indicados. Acredito que todo bom desenvolvedor deve dar uma boa lida, pois os benefícios oferecidos pela técnica são inúmeros.</p>
<p>Embora eu prefira livros impressos e tenha este é uma ótima maneira de economizar e ter o livro disponível sempre que precisar para referências.</p>
<p>Fica ai a dica! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/12/12/domain-driven-design-eric-evans-livro-gratuito-na-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terceira reunião sobre arquitetura DotNetArchitects</title>
		<link>http://blog.tucaz.net/2008/12/11/terceira-reuniao-sobre-arquitetura-dotnetarchitects/</link>
		<comments>http://blog.tucaz.net/2008/12/11/terceira-reuniao-sobre-arquitetura-dotnetarchitects/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 22:57:43 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[DotNetArchitects]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=180</guid>
		<description><![CDATA[Terceira reunião do grupo de discussão a respeito de arquitetura de software DotNetArchitects.]]></description>
			<content:encoded><![CDATA[<p>No próximo sábado (13/12/2008) , nosso grupo de arquitetura de software fará sua <a title="DotNetArchitects - Terceira reunião marcada" href="http://dotnetarchitects.net/dotnetarchitects/post/Terceira-reuniao-e-neste-sabado.aspx" target="_blank">terceira reunião</a> (nossa! como passou rápido&#8230;).</p>
<p>O local será o mesmo das outras vezes, na UNIP Jaguaré. Nesta semana o <a title="Giovanni Bassi" href="http://unplugged.giggio.net/unplugged/post/Net-Architects-Terceira-reuniao-do-grupo-e-neste-sabado.aspx" target="_blank">Giovanni</a> irá falar um pouco a respeito de Domain Driven Design.</p>
<p>A participação é aberta e muito bem vinda. Quem ainda não mandou seus dados pode fazer pelo blog do Giovanni ou pelo grupo do Google onde também está disponível a <a title="Pauta para terceira reunião DotNetArchitects" href="http://groups.google.com/group/dotnetarchitects/t/86ff07c740bfc361?hl=pt-br" target="_blank">pauta</a> para próxima reunião.</p>
<p>Na última reunião falei sobre Scrum e o<a title="Apresentação sobre Scrum" href="http://blog.tucaz.net/2008/11/27/video-da-segunda-reuniao-dotnetarchitects-com-miinha-apresentacao-online/" target="_blank"> vídeo da apresentação está disponível aqui no blog</a> e no site do grupo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/12/11/terceira-reuniao-sobre-arquitetura-dotnetarchitects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nem tudo é relacional</title>
		<link>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/</link>
		<comments>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 00:47:08 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[BinaryFormatter]]></category>
		<category><![CDATA[Modelo Relacional]]></category>
		<category><![CDATA[Serialized LOB]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=89</guid>
		<description><![CDATA[Esses dias me peguei pensando em um costume interessante que temos. Quando digo &#8220;nós&#8221;, falo de min e das pessoas com as quais já trabalhei nesses 4 anos que atuo com .NET. Fomos acostumados, em se tratando de persistência em banco de dados, de sempre utilizar modelo relacional pra qualquer tipo de armazenamento de objeto. [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias me peguei pensando em um costume interessante que temos. Quando digo &#8220;nós&#8221;, falo de min e das pessoas com as quais já trabalhei nesses 4 anos que atuo com .NET. Fomos acostumados, em se tratando de persistência em banco de dados, de sempre utilizar modelo relacional pra qualquer tipo de armazenamento de objeto. O problema é que nem sempre isso é necessário e acabamos perdendo ou tempo em codificação ou desempenho ou espaço em disco.</p>
<p>A idéia de banco de dados orientado a objetos sempre me agradou e acho uma pena não ter chegado ao mainstream. No entanto o conceito de armazenar o grafo todo de objetos é muito interessante em algumas situações. Vou usar um exemplo que talvez não seja o melhor, mas deve passar a idéia.</p>
<p>Imagine um cadastro de cliente com diversas entidades relacionadas: diversos endereços, vários telefones para contato, dependentes, etc.</p>
<div id="attachment_90" class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional01.jpg"><img class="size-full wp-image-90" style="border: 1px solid black;" title="Modelo de Classes" src="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional01.jpg" alt="Modelo de Classes" width="500" height="173" /></a><p class="wp-caption-text">Modelo de Classes</p></div>
<p>Normalmente criaríamos uma tabela para cada uma das entidades e essas tabelas teriam uma referência (FK) para a tabela principal de clientes:</p>
<div id="attachment_91" class="wp-caption aligncenter" style="width: 352px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional02.jpg"><img class="size-full wp-image-91" style="border: 1px solid black;" title="Modelo de Dados normalizado" src="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional02.jpg" alt="Modelo de Dados normalizado" width="342" height="261" /></a><p class="wp-caption-text">Modelo de Dados normalizado</p></div>
<p>Se considerássemos que um endereço ou automóvel pudesse pertencer a mais de um cliente a coisa ficaria ainda mais complicada e teríamos que criar tabelas de relacionamento N:M.</p>
<p>Para que o exemplo seja útil, vamos considerar que nesse sistema não fosse possível efetuar pesquisas utilizando como filtro nenhuma dessas entidades (em um sistema real é óbvio que requisito é um absurdo) e só seria disponibilizada uma funcionalidade de busca por meio de código (id). Mesmo com esse requisito, como pensamos sempre em de forma relacional o caminho natural seria criar o modelo de dados acima e armazenar tudo bastante normalizado.</p>
<p>No entanto existe outra opção que em determinados casos é muito interessante. Guardar o objeto inteiro no banco.</p>
<p>Em .NET, por exemplo, bastaria criar um modelo simples de dados contendo o idCliente e um campo que armazene binário (varbinary em SQL), serializar o objeto e pronto.</p>
<div id="attachment_92" class="wp-caption aligncenter" style="width: 112px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional03.jpg"><img class="size-full wp-image-92" style="border: 1px solid black;" title="Modelo de dados mais simples" src="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional03.jpg" alt="Modelo de dados mais simples" width="102" height="78" /></a><p class="wp-caption-text">Modelo de dados mais simples</p></div>
<p>public Cliente Consultar(int codigoCliente)<br />
{<br />
//Recupera do DB<br />
byte[] clienteSerializado = DaoCliente.ConsultarPorCodigo(codigoCliente);<br />
//Devolve o objeto deserializado<br />
return this.DeserializarObjeto&lt;Cliente&gt;(clienteSerializado);<br />
}</p>
<p>public void Salvar(Cliente novoCliente)<br />
{<br />
//Serializa o objeto<br />
byte[] clienteSerializado = this.SerializarObjeto&lt;Cliente&gt;(novoCliente);<br />
//Guarda o cliente no DB<br />
DaoCliente.Inserir(novoCliente.Codigo, clienteSerializado);<br />
}</p>
<p>private byte[] SerializarObjeto&lt;T&gt;(T objeto)<br />
{<br />
MemoryStream ms = new MemoryStream();<br />
BinaryFormatter formatter = new BinaryFormatter();<br />
formatter.Serialize(ms, objeto);<br />
byte[] objetoSerializado = ms.ToArray();<br />
ms.Close();<br />
return objetoSerializado;<br />
}</p>
<p>private T DeserializarObjeto&lt;T&gt;(byte[] objetoSerializado)<br />
{<br />
MemoryStream ms = new MemoryStream();<br />
BinaryFormatter formatter = new BinaryFormatter();<br />
ms.Write(objetoSerializado, 0, objetoSerializado.Length);<br />
ms.Position = 0;<br />
return (T)formatter.Deserialize(ms);<br />
}</p>
<p>Dessa maneira, sempre que precisarmos, já iremos ter o objeto completo e não seria necessário executar diversas instruções SQL ou stored procedures e muitas chamadas ao banco. Iriamos apenas executar uma chamada que nos retornaria o objeto completo e pronto para uso.</p>
<p>Essa é uma solução diferente e que pode ser útil em alguns cenários, principalmente se você não utiliza nenhum framework ORM. Contudo, é importante verificar todos os requisitos com bastante cuidado, com essa solução corremos o risco de ficar com dados desatualizados e perdemos a possibilidade de efetuar buscas por campos que estejam dentro dos objetos armazenados.</p>
<p>Acho muito legal encontrarmos formas diferentes de fazer as mesmas coisas que estamos habituados. É uma maneira muito eficiente de aprendizado e conhecimento das nossas ferramentas.</p>
<p>O que você acha?</p>
<p><strong>Editado:</strong> sem saber, acabei descrevendo o pattern Serialized Lob já catalogo pelo Fowler em seu livro PoEAA. O Bruno achou e comentou o post colocando <a href="http://martinfowler.com/eaaCatalog/serializedLOB.html" target="_blank">este link</a>. Valeu! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>DDD no Entity Framework</title>
		<link>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework/</link>
		<comments>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 05:15:18 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[EF]]></category>
		<category><![CDATA[PI]]></category>
		<category><![CDATA[POCO]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=82</guid>
		<description><![CDATA[Essa informação é não a mais nova do mundo (saiu há 3 meses atrás), mas da mesma maneira que passou desapercebido pra min e pro Giovanni Bassi (que foi onde eu vi hoje), pode ter passado pra muita gente e eu acho mais do que legítimo divulgar.
Depois do oba-oba que a comunidade fez contra o [...]]]></description>
			<content:encoded><![CDATA[<p>Essa informação é não a mais nova do mundo (saiu há 3 meses atrás), mas da mesma maneira que passou desapercebido pra min e pro <a href="http://unplugged.giggio.net/unplugged/post/Microsoft-de-olho-em-Domain-Driven-Design.aspx" target="_blank">Giovanni Bassi</a> (que foi onde eu vi hoje), pode ter passado pra muita gente e eu acho mais do que legítimo divulgar.</p>
<p>Depois do <a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/" target="_blank">oba-oba</a> que a comunidade fez contra o Entity Framework que acabou saindo meio mal acabado e ainda totalmente focado em banco de dados sem suporte a PI para POCOs no SP1 a Microsoft finalmente deu uma dentro.</p>
<p>Eles convidaram Eric Evans (criador do domain-driven design), Martin Fowler (não preciso dizer quem é, né?), Jimmy Nilsson (praticante de DDD com .NET que escreveu um <a href="http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha/" target="_blank">ótimo livro</a>), Stephen Forte e Pavel Hruby para formar um conselho com o objetivo de palpitar a respeito de como o Entity Framework deveria ser remodelado.</p>
<p>Com esse pessoal todo envolvido e mais algumas coisas que o pessoal anda soltando no <a href="http://blogs.msdn.com/efdesign/default.aspx" target="_blank">blog do EF</a>, boto fé que vem coisa boa ai pela frente!</p>
<p>A &#8220;notícia&#8221; pode ser vista com mais detalhes neste <a href="http://blogs.msdn.com/dsimmons/archive/2008/06/03/dp-advisory-council.aspx" target="_blank">link</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Applying Domain-Driven Design and Patterns with examples C# and .NET: Resenha</title>
		<link>http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha/</link>
		<comments>http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 23:22:54 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Resenhas]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Jimmy Nilson]]></category>

		<guid isPermaLink="false">http://tucaz.wordpress.com/?p=60</guid>
		<description><![CDATA[Terminei essa semana de ler o livro do Jimmy Nilson &#8220;Applying Domain-Driven Design and Patterns: with examples in C# and .NET&#8221; e vou compartilhar minhas impressões.
É um livro com 11 capítulos, 2 apendíces e aproximadamente 500 páginas. Paguei R$100,00 na Livraria Cultura e chegou em menos da metade das 8 semanas prometidas no site.
Geralmente livros [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignleft" style="width: 250px"><img src="http://ecx.images-amazon.com/images/I/51sbuQIxz9L._SL500_AA240_.jpg" alt="Applying Domain-Driven Design and Patterns" width="240" height="240" /><p class="wp-caption-text">Applying Domain-Driven Design and Patterns</p></div>
<p>Terminei essa semana de ler o livro do <a href="http://www.amazon.com/exec/obidos/search-handle-url?_encoding=UTF8&amp;search-type=ss&amp;index=books&amp;field-author=Jimmy%20Nilsson" target="_blank">Jimmy Nilson</a> <a href="http://www.amazon.com/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202" target="_blank">&#8220;Applying Domain-Driven Design and Patterns: with examples in C# and .NET&#8221;</a> e vou compartilhar minhas impressões.</p>
<p>É um livro com 11 capítulos, 2 apendíces e aproximadamente 500 páginas. Paguei R$100,00 na <a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1372086&amp;sid=19412718610721322379644546&amp;k5=2E1CA023&amp;uid=645446973683189" target="_blank">Livraria Cultura</a> e chegou em menos da metade das 8 semanas prometidas no site.</p>
<p>Geralmente livros técnicos depois de algumas página se tornam cansativos de ler. Não li nenhum outro livro deste autor anteriormente, mas o cara escreve de uma forma muito gostosa e tranquila de se ler. Nos primeiros dias eu não conseguia fechar o livro. Tive que me segurar pra não passar a madrugada lendo.</p>
<p>Quando comprei o livro imaginei que fosse unicamente a respeito de DDD, mas na prática são poucos os capítulos referentes a esse assunto.</p>
<p>O primeiro capítulo é bastante interessante (principalmente pra quem não está acostumado com agilidade, DDD e Testes) porque ele conceitua esses pontos de uma forma que é impossível não ter vontade de aplicar e ler mais sobre.</p>
<p>A partir dai e durante todo o livro ele apresenta diversos design patterns e como aplicá-los em situações práticas. Existe também um capítulo inteiro sobre TDD que passa por todos os aspectos desde o ciclo de desenvolvimento com TDD, mocks e stubs, e até técnicas de refatoração.</p>
<p>A partir do quarto capítulo que ele comça a falar propriamente dos novos aspectos da modelagem orientada ao domínio e da nova proposta de arquitetura. Sempre com <strong>muitos</strong> exemplos de código e modelos.</p>
<p>Antes de ler o livro eu havia lido muito a respeito de DDD no <a href="http://www.guj.com.br" target="_blank">GUJ</a>, no <a href="http://www.infoq.com/minibooks/domain-driven-design-quickly" target="_blank">resumo do livro do Evans</a> e mais da metade do <a href="http://domaindrivendesign.org/books/index.html#DDD" target="_blank">livro que deu origem ao resumo</a>. Exatamente nesta ordem. Então já estava bem familiarizado com os novos conceitos e já havia aplicado bastante.</p>
<p>Acho que por conta disso, me decepcionei um pouquinho, pois o Jimmy Nilson falou quase nada a respeito de Services e de interações mais complexas entre objetos. Outro ponto que me deixou bastante frustrado foi o fato dos exemplos dos repositórios serem implementados apenas com ORM (NHibernate no caso deste livro). Em Java ORM é uma realidade. Em .NET a coisa ainda está começando a andar com o <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a>, <a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx" target="_blank">EF</a> e o próprio NHibernate, mas a maioria das pessoas ainda implementa acesso a dados na mão. No fundo, acho que o fato de implementar repositório de forma elegante apenas com ORM é um problema do padrão e não do livro (esse é assunto pra um outro post que vai render pedras). Eu particularmente gosto muito de implementar na mão (mais pedras!).</p>
<p>Outro ponto que ficou por último, mas sem menos importância é UI. Ele fala de UI com MVC e MVP inclusive a respeito de como testar a UI. No entanto achei que os exemplos nesse caso não ficaram legais principalmente pelo fato de durante todo o livro o conceito de web ser enfatizado e no caso da UI os testes serem escritos com exemplos em Windows Forms.</p>
<p>Já ao final do livro alguns colegas dele falam a respeito de outros padrões e frameworks tais como: PI utilizando POCO/POJO, SOA, AOP, DI, IoC, NHibernate e SPRING. Inclusive este livro serve como um bom início para o aprendizado desses frameworks, pois os exemplos ilustram cenários bastante reais e práticos.</p>
<p>E por último mais alguns colegas explicam outras abordagens de design de aplicação orientada a domínio.</p>
<p>Se você ficou empolgado por imaginar que fosse encontrar bons exemplos de como testar sua UI nesse livro, acho que essa não é a melhor literatura. Mas para todo o restante dos assuntos é um livro altamente recomendado e que me proporcionou muito aprendizado durante a leitura.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quando utilizar propriedades ou métodos?</title>
		<link>http://blog.tucaz.net/2008/08/04/quando-utilizar-propriedades-ou-metodos/</link>
		<comments>http://blog.tucaz.net/2008/08/04/quando-utilizar-propriedades-ou-metodos/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 12:00:01 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://tucaz.wordpress.com/?p=34</guid>
		<description><![CDATA[A partir do momento que aceitamos ou escolhemos utilizar orientação a objetos acredito que devemos fazer de tudo para utilizá-la da melhor forma, ou seja, criar modelos simples (não simples demais) e que comuniquem seu objetivo de maneira clara e com fácil entendimento.
No entanto, poucas são as pessoas que realmente se preocupam se seu modelo [...]]]></description>
			<content:encoded><![CDATA[<p>A partir do momento que aceitamos ou escolhemos utilizar orientação a objetos acredito que devemos fazer de tudo para utilizá-la da melhor forma, ou seja, criar modelos simples (não simples demais) e que comuniquem seu objetivo de maneira clara e com fácil entendimento.</p>
<p>No entanto, poucas são as pessoas que realmente se preocupam se seu modelo está com o mínimo possível de qualidade (<a href="http://martinfowler.com/bliki/AnemicDomainModel.html" target="_blank">não é</a>?), vista a quantidade de modelos orientados a banco de dados que vemos por ai.  Menos pessoas ainda, são as que procuram entender e se aproveitar das sutilezas existentes nos objetos para tornar o modelo mais claro e ter como boa conseqüência a comunicação de suas intenções facilitada.</p>
<p><em>Bons designers utilizam-se da linguagem pra facilitar seu trabalho.</em></p>
<p>O ponto que me motivou a escrever sobre isso é o motivador para utilização de propriedades e métodos. Desde a <a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objeto" target="_blank">teoria mais básica de orientação a objetos</a> aprendemos que objetos são classes (entidades) que possuem estado (propriedades) e comportamento (métodos) próprio.</p>
<p>Em .NET possuímos propriedades nativamente. Em java obtemos propriedades através de métodos get() e set(), por exemplo. Diretamente ou não, todas as linguagens orientadas a objetos fornecem mecanismos para utilização de propriedades. Mas quando devemos utilizar propriedades ao invés de métodos?</p>
<p>Conforme a própria teoria, propriedades devem refletir o estado de um objeto, ou seja, as características que o definem naquele exato momento de sua vida. Como exemplo simples teríamos dentro de um objeto do tipo Cliente as propriedades: Nome, Telefone, Idade, Sexo, etc. No entanto, a partir do momento em que para responder a uma pergunta sobre seu estado o objeto precise efetuar algum tipo de processamento deveremos transformar a então propriedade em um método, pois propriedades devem ser utilizadas para descrever estado que seja sabido &#8220;de bate pronto&#8221; pelo objeto em questão. Qualquer outro tipo de resposta a perguntas feitas para o objeto deve ser respondida através de métodos.</p>
<p>Um exemplo um pouco mais concreto: vamos imaginar que estamos desenvolvendo um sistema de controle de usuários e que no momento de uma exclusão de usuário precisamos saber se ele possui ou não emails.</p>
<p>Podemos modelar desta maneira:</p>
<div id="attachment_37" class="wp-caption aligncenter" style="width: 251px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/08/class1.jpg"><img class="size-medium wp-image-37" src="http://blog.tucaz.net/wp-content/uploads/2008/08/class1.jpg?w=241" alt="Utilizando propriedades" width="241" height="115" /></a><p class="wp-caption-text">Utilizando propriedades</p></div>
<p>Claro que existem exceções, mas normalmente um usuário não sabe se possui emails (a não ser que fique de 5 em 5 minutos apertando o botão send/receive do outlook! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) e no caso desta pergunta teria que sair de onde está, ir até sua mesa, abrir seu programa de email e verificar se possui ou não algum email. O administrador poderia checar, mas deveria também executar uma série de operações até descobrir se o usuário possui ou não emails. Sendo assim, acredito que essa operação deveria ser comunicada de forma explicita por meio de um método para que quem estivesse utilizando essa API soubesse que uma operação (processamento) irá ocorrer para checar se existem ou não emails.</p>
<p>Outro motivo para utilização de métodos nesses casos é a possível necessidade de passagens de parâmetros para essas verificações. Ainda no nosso cenário de controle de usuários, vamos assumir que um novo requisito deve ser implementado: somente os usuários que não receberam emails na última hora podem ser removidos. Se utilizarmos propriedades como no exemplo acima como iríamos fazer? Criar outra propriedade chamada &#8220;RecebeuEmailNaUltimaHora&#8221;? Ou poderíamos modelar dessa forma:</p>
<div id="attachment_39" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/08/class2.jpg"><img class="size-medium wp-image-39" src="http://blog.tucaz.net/wp-content/uploads/2008/08/class2.jpg?w=300" alt="" width="300" height="128" /></a><p class="wp-caption-text">Utilizando métodos</p></div>
<p>Desta maneira, acredito que o mundo real seja mais bem representado e o utilizador da API irá utilizar os métodos com mais cuidado, pois o modelo comunica que para fazer essa verificação é necessário processamento (que pode ou não ser pesado). Outro ponto a favor é que podemos ter (quanto menos melhor) diversos métodos para execução de operações, mas caso esse tipo de checagem deva ser feito de diversas maneiras não podemos sair criando uma propriedade para cada um dos cenários senão corremos um sério risco de desconfigurar a identidade do objeto por ter propriedades demais.</p>
<p>Como tudo em OO, não devemos ter isso como uma regra, mas sim verificar o que é melhor para cada cenário. Acredito que mais do que a sugestão apresentada nesse post, o mais importante é a mensagem de que devemos modelar com cuidado procurando abstrair nosso domínio da maneira mais fiel possível e comunicando o máximo através das ferramentas que a OO nos oferece.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/08/04/quando-utilizar-propriedades-ou-metodos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

