<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Amanda</title>
    <description>The latest articles on Forem by Amanda (@a_mandou).</description>
    <link>https://forem.com/a_mandou</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F311390%2F35d94937-110b-4de2-afae-a7b9502d6468.png</url>
      <title>Forem: Amanda</title>
      <link>https://forem.com/a_mandou</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/a_mandou"/>
    <language>en</language>
    <item>
      <title>Princípio da Responsabilidade Única - Princípios S.O.L.I.D.</title>
      <dc:creator>Amanda</dc:creator>
      <pubDate>Mon, 23 Nov 2020 00:26:32 +0000</pubDate>
      <link>https://forem.com/womakerscode/principio-da-responsabilidade-unica-principios-s-o-l-i-d-3acc</link>
      <guid>https://forem.com/womakerscode/principio-da-responsabilidade-unica-principios-s-o-l-i-d-3acc</guid>
      <description>&lt;h3&gt;
  
  
  O que são os princípios S.O.L.I.D.?
&lt;/h3&gt;

&lt;p&gt;S.O.L.I.D. é um acrônimo para 5 princípios para design de software, voltados à programação orientada a objetos. Eles foram introduzidos por Robert C. Martin em um &lt;a href="https://fi.ort.edu.uy/innovaportal/file/2032/1/design_principles.pdf"&gt;artigo&lt;/a&gt;. Estes princípios ajudam a escrever um código melhor nos quesitos de entendimento, manutenção e melhor reaproveitamento.&lt;/p&gt;

&lt;h5&gt;
  
  
  Esse acrônimo significa:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt;ingle Responsibility Principle (Princípio da Responsabilidade Única)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O&lt;/strong&gt;pen/Closed Principle (Princípio do Aberto/Fechado)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt;iskov Substitution Principle (Princípio da Substituição de Liskov)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I&lt;/strong&gt;nterface Segregation Principle (Princípio da Segregação de Interfaces)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt;ependency Inversion Principle (Princípio da Inversão de Dependências)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste artigo será apresentado o primeiro dos princípios do S.O.L.I.D., o Single Responsibility Principle. Usaremos a linguagem C# para todos os exemplos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Single Responsibility Principle(SRP)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma classe deve ter um e somente um motivo para mudar, ou seja, ela deve ser responsável por apenas uma parte específica de um sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso significa que cada classe deve ser especializada, podendo fazer apenas um trabalho e não vários. Assim, focando na sua atividade principal.&lt;/p&gt;

&lt;p&gt;Quando uma classe tem muitas responsabilidades, existe mais chances dela precisar de ser modificada e também de possuir mais bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo prático
&lt;/h3&gt;

&lt;p&gt;Vamos usar exemplo inspirado na franquia dos jogos do Mario, da Nintendo. Abaixo temos a classe Cogumelo, ela representa os itens de cogumelo que dão um benefício ao entrar em contato com o jogador.&lt;/p&gt;

&lt;p&gt;Esta classe contém três métodos: &lt;code&gt;darBeneficio()&lt;/code&gt;, &lt;code&gt;sumir()&lt;/code&gt; e &lt;code&gt;somBeneficio()&lt;/code&gt;. Dessa forma, ela é responsável por dar o benefício ao Mario, e ao entrar em contato com o personagem o item desaparece e reproduz o som de feedback. Porém, a função principal do item é de dar uma vantagem a quem o obtém.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cogumelo&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;darBeneficio&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;//lógica para atribuir o beneficio ao Mário&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sumir&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;//lógica para desaparecer o cogumelo&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;somBeneficio&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;//lógica para reproduzir o som beneficio na tela&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa abordagem, a classe Cogumelo tem mais de uma ação e responsabilidade. No caso da modificação do som de feedback, por exemplo, isso acarretaria em uma mudança na classe Cogumelo como um todo. Consequentemente um erro em &lt;code&gt;somBeneficio()&lt;/code&gt;, iria impactar os outros métodos da classe. Assim nesse acoplamento há maiores chances de produzir um bug.&lt;/p&gt;

&lt;p&gt;Além disso, ao reutilizar os métodos &lt;code&gt;somBeneficio()&lt;/code&gt; e &lt;code&gt;sumir()&lt;/code&gt; em outros itens faria com que instâncias de Cogumelo existam em outras classes. Assim, mais classes seriam dependentes de Cogumelo, o que gera um acoplamento maior no sistema e tornam mudanças mais difíceis. Outro fator é que essas outras classes teriam acesso ao método &lt;code&gt;darBeneficio()&lt;/code&gt;, mesmo sem precisar dele.&lt;/p&gt;

&lt;p&gt;Aplicando o princípio da responsabilidade única, separando as responsabilidades pelos comportamentos que são realizados, obtemos a modificação abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cogumelo&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;darBeneficio&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;//lógica para dar beneficio&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Some&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sumir&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;//lógica para desaparecer o cogumelo&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReprodutorSom&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;somBeneficio&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;//lógica para reproduzir o som beneficio na tela&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;     
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma acima, é possível reutilizar as classes em outros objetos do jogo, como as moedas, blocos e outros itens diferentes. Também com esta modificação todas as três classes ficam mais coesas, tendo apenas uma responsabilidade, o que facilita a manutenção do código e evita mais bugs no futuro. &lt;/p&gt;

&lt;p&gt;Um dos possíveis problemas que podem acontecer ao não usar o SRP, é o alto acoplamento entre classes, dificuldade de reaproveitamento de código e a falta de coesão. Estes três fatores atrapalham a realização de futuras modificações, deixando as classes muito dependentes entre si e dificultando o seu entendimento.&lt;/p&gt;

&lt;p&gt;Logo, o single responsibility principle ajuda na manutenção de um projeto e na legibilidade dele. Além de ser base para outros princípios e padrões de projetos, como o Factory, Builder e o Command.&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
