<?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>Saga do programador &#187; principiosOO</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/principiosoo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Wed, 18 Aug 2010 13:34:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Analisando o codigo escrito anteriormente.</title>
		<link>http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 16:42:57 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[principios]]></category>
		<category><![CDATA[principiosOO]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=381</guid>
		<description><![CDATA[Terminei meu post anterior com a pergunta: "Este código está bom? Porque?"
Para analizar um código, assim como qualquer outra coisa, nós precisamos de parâmetros. Precisamos nos basear em algo que saibamos que seja bom, para assim podermos determinar se outra coisa é tão boa quanto, melhor, ou até pior.
Com código não é diferente. Então antes [...]]]></description>
			<content:encoded><![CDATA[<p>Terminei meu post <a href="http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/">anterior</a> com a pergunta: "Este código está bom? Porque?"</p>
<p>Para analizar um código, assim como qualquer outra coisa, nós precisamos de parâmetros. Precisamos nos basear em algo que saibamos que seja bom, para assim podermos determinar se outra coisa é tão boa quanto, melhor, ou até pior.</p>
<p>Com código não é diferente. Então antes de respondermos a pergunta feita no inicio deste texto, precisamos definir o que é um código bom, ou melhor, que caracteristicas deve ter um codigo para ser considerado bom. Vamos agora recorrer a alguns principios OO para nos municiar de paramêtros para assim julgarmos o codigo em questão</p>
<p><a href="http://www.objectmentor.com/omTeam/martin_r.html">Robert Martin</a>, o uncle Bob, escreveu a muito tempo sobre os principios OO num documento chamado: <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">PrinciplesOfOod</a>. Dos principios OO descritos neste artigo, pelo menos 5 ficaram bastante famosos, e são conhecidos pela sigla <strong>SOLID</strong>, são eles:<br />
<span id="more-381"></span><br />
<strong><a href="http://www.codingefficiency.com/2009/07/18/solid-s-single-responsibility-principle/">S</a></strong><a href="http://www.codingefficiency.com/2009/07/18/solid-s-single-responsibility-principle/">ingle Responsibility Principle (SRP)</a> - <em>A classe deve ter uma única responsabilidade, uma única razão de existir.</em></p>
<p><em><span style="font-style: normal;"><strong><a href="http://www.codingefficiency.com/2009/07/20/solid-o-open-closed-principle/">O</a></strong><a href="http://www.codingefficiency.com/2009/07/20/solid-o-open-closed-principle/">pen Closed Principle (OCP)</a> - <em>A classe deve ser aberta para extensão (sublcasses e sobrescrita de metodos) e fechada para modifiação *</em></span></em></p>
<p><strong><a href="http://www.codingefficiency.com/2009/07/21/solid-l-liskov-substitution-principle/">L</a></strong><a href="http://www.codingefficiency.com/2009/07/21/solid-l-liskov-substitution-principle/">iskov Substitution Principle (LSP)</a> - <em>Resumidamente ele serve para nos aletar para heranças sem sentido.</em></p>
<p><strong><a href="http://www.codingefficiency.com/2009/07/23/solid-i-interface-segregation-principle/">I</a></strong><a href="http://www.codingefficiency.com/2009/07/23/solid-i-interface-segregation-principle/">nterface Segregation Principle (ISP)</a> - <em>Defende que uma classe deve depender apenas dos métodos que usa de uma outra classe. Interfaces são um mecanismo para isso.</em></p>
<p><strong><a href="http://www.codingefficiency.com/2009/07/27/solid-d-dependency-inversion-principle/">D</a></strong><span><a href="http://www.codingefficiency.com/2009/07/27/solid-d-dependency-inversion-principle/">ependency Inversion Principle</a></span><a href="http://www.codingefficiency.com/2009/07/27/solid-d-dependency-inversion-principle/"> (ISP)</a> - <em>Defende que componentes maiores devem depender não de componentes menores, mas sim de uma abstração deles.</em></p>
<p><em>*Pode ser discutido, principalmente se você estiver trabalhando em um modelo de dominio incremental, ou seja, você vai descobrindo as necessidades de suas classes durante o desenvolvimento de software. Neste cenário o principio OCP pode ser radical demais. Lembre-se é preciso ter bom senso.</em></p>
<p>Dos principios descritos por Robert Martin, ficaremos apenas com o SRP. Sabendo agora que <em>uma classe deve possuir apenas uma úncia responsabilidade.</em> Quantas responsabilidades podemos identificar na classe Principal do post <a href="http://www.sagadoprogramador.com.br/2009/10/esse-codigo-que-acabei-de-escrever-esta-bom/">anterior</a>?</p>
<p>Podemos identificar facilmente 3 responsabilidades. São elas:</p>
<p>1 - Controla a execução da aplicação.</p>
<p>2 - Cadastra um novo DVD</p>
<p>3 - Lista todos os DVD's cadastrados</p>
<p>Agora ficou facil ver que a classe Principal está <em>ferindo </em>o SRP. A resposabilidade desta classe deveria ser apenas: <em>Controlar a execução da aplicação. </em>Precisamos retirar da classe Principal as demais responsabilidades. Como faremos isso?</p>
<p>A melhor solução é remover todo o código "extra" da classe Principal. Mas o grande problema, é que sem esse codigo nossa aplicação vai parar de funcionar! Este código não pode simplesmente desaparecer. O que nós precisamos fazer e leva-lo para outro lugar. E como estamos programando segundo o paradigma de Orientação a Objetos, vamos precisar de novas classes para cada uma das responsabilidades descritas acima.</p>
<p>Teriamos as seguintes classes com as seguintes responsabilidades:</p>
<p><em><span style="color: #333399;">Classe</span><span style="color: #0000ff;">:</span></em><em> Principal </em></p>
<p><em><span style="color: #333399;">Responsabilidade</span></em><em>: Controlar a execucao da aplicação</em></p>
<p><em><span style="color: #333399;">Classe</span><span style="color: #0000ff;">:</span> CadastrarDvd </em></p>
<p><em><em><span style="color: #333399;">Responsabilidade</span></em><em>:</em> Cuidar da lógica de inclusao de um dvd</em></p>
<p><em><span style="color: #333399;">Classe</span><span style="color: #0000ff;">:</span> ListarTodosDvds</em></p>
<p><em><em><span style="color: #333399;">Responsabilidade</span></em><em>:</em> Cuidar da lógica de exibicao dos dvd's</em></p>
<p>Após estas alterações vamos perceber que a classe Principal ficou bem melhor.</p>
<p>Mas será que isso foi suficiente? Apenas esta alteração terá salvado a vida de nossa pequena aplicação?</p>
<p>Tente aplicar você mesmo o SRP em nossas novas classes e comente a respeito. No proximo post continuamos nossa <em>saga</em>.</p>
<p>Abraços.</p>
<p>Sergio Azevedo Junior</p>
<p>Confira abaixo como ficaram nossas classes:</p>
<p>Principal</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> <span style="color: #003399;">Principal</span> <span style="color: #009900;">&#123;</span>
  <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: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
    Scanner scan <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Scanner<span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span> opcao <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------------- Controle de Dvds e Cds ---------------&quot;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   1 - Cadastrar Novo Dvd &quot;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   2 - Listar Dvd's &quot;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;   3 - Terminar &quot;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;------------------------------------------------------&quot;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; Escolha uma opção:--&amp;gt; &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      opcao <span style="color: #339933;">=</span> scan.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>opcao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">new</span> CadastraDvd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">executa</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">new</span> ListaTodosDvds<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">executa</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>opcao <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>CadastraDvds</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> CadastraDvd <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> executa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">PrintStream</span> ps <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">File</span> file <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dvds.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
      ps <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintStream</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      Dvd dvd <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Dvd<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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Titulo.: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setTitulo</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sinopse: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setSinopse</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Genero.: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setGenero</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ano....: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setAno</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Duracao: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      dvd.<span style="color: #006633;">setDuracao</span><span style="color: #009900;">&#40;</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getTitulo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getSinopse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getGenero</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getAno</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      ps.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>dvd.<span style="color: #006633;">getDuracao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
      br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ps <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
        ps.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>ListaTodosDvds</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> ListaTodosDvds <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> executa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">FileNotFoundException</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;------------- Lista de Dvd's -------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Scanner reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Scanner<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dvds.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>reader.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><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;">println</span><span style="color: #009900;">&#40;</span>reader.<span style="color: #006633;">nextLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/12/analisando-o-codigo-escrito-anteriormente/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
