<?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>DEV Community: Edson Cunha</title>
    <description>The latest articles on DEV Community by Edson Cunha (@edsoncunha).</description>
    <link>https://dev.to/edsoncunha</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%2F402737%2F8ad39872-bffd-4624-854c-20e446fe6d97.jpeg</url>
      <title>DEV Community: Edson Cunha</title>
      <link>https://dev.to/edsoncunha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edsoncunha"/>
    <language>en</language>
    <item>
      <title>Dicas para revisão de código e equipes saudáveis</title>
      <dc:creator>Edson Cunha</dc:creator>
      <pubDate>Mon, 27 Jul 2020 12:39:36 +0000</pubDate>
      <link>https://dev.to/edsoncunha/dicas-para-revisao-de-codigo-2o8f</link>
      <guid>https://dev.to/edsoncunha/dicas-para-revisao-de-codigo-2o8f</guid>
      <description>&lt;h1&gt;
  
  
  Primeiro, as premissas:
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1) Ninguém é dono/a do código
&lt;/h2&gt;

&lt;p&gt;Pessoas vêm e vão. É parte da vida. Além disso, um projeto de software é feito em equipe. As pessoas do time precisam se sentir confortáveis para mexer no código e co-proprietárias dele (atenção para o prefixo "co-"!).&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Receber comentários não é um demérito
&lt;/h2&gt;

&lt;p&gt;Isso é parte da construção coletiva de um projeto, e decorre naturalmente da premissa 1. Além disso, ninguém sabe absolutamente tudo. &lt;/p&gt;

&lt;h1&gt;
  
  
  Agora, as dicas:
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1) Desapegue
&lt;/h2&gt;

&lt;p&gt;Ideias melhores do que as suas podem vir de colegas que estão revisando. &lt;/p&gt;

&lt;h2&gt;
  
  
  2) Incentive a revisão no seu código
&lt;/h2&gt;

&lt;p&gt;Mesmo se você for uma liderança ou referência técnica, incentive que revisem seu código. Ou melhor: especialmente se você for, faça isso para dar o exemplo! Lembre-se da premissa 1: todo mundo tem propriedade do código. Subiu um pull request? Incentive as pessoas a revisarem.&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Seja gentil
&lt;/h2&gt;

&lt;p&gt;Hoje, você está revisando o código de alguém. Amanhã, alguém vai revisar o seu. Lembre-se que a pessoa escreveu aquele código dando o melhor de si nas circunstâncias que teve para gerá-lo.&lt;/p&gt;

&lt;h2&gt;
  
  
  4) Seja propositivo/a
&lt;/h2&gt;

&lt;p&gt;Ao apontar um problema, pode ser que a pessoa não saiba como resolvê-lo. Por isso, sempre proponha alternativa(s).&lt;/p&gt;

&lt;h2&gt;
  
  
  5) Receba as sugestões de bom grado
&lt;/h2&gt;

&lt;p&gt;Você aprende algo novo e o código fica melhor com a colaboração proposta. Se você discordar, debata amigavelmente. &lt;/p&gt;

&lt;p&gt;Quando todo mundo participa do código de cada pessoa, a equipe fica mais parceira e se fortalece tecnicamente.&lt;/p&gt;

&lt;p&gt;Desapegue!&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>collaboration</category>
      <category>codereview</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Organizando o código com máquinas de estados</title>
      <dc:creator>Edson Cunha</dc:creator>
      <pubDate>Fri, 05 Jun 2020 17:20:29 +0000</pubDate>
      <link>https://dev.to/edsoncunha/organizando-o-codigo-com-maquinas-de-estados-2igf</link>
      <guid>https://dev.to/edsoncunha/organizando-o-codigo-com-maquinas-de-estados-2igf</guid>
      <description>&lt;p&gt;É nosso dever, enquanto profissionais que fazem software, deixar nossos códigos em ordem. Às vezes, porém, sentimos que vai ficando cada vez mais difícil modificar determinadas partes do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;p&gt;Com o tempo, fica cada vez mais difícil resolver bugs e acrescentar requisitos. Não poder excluir um pedido depois que ele já foi enviado, não poder excluir um usuário se ele já fez uma compra, verificar os estados de vários flags, colocar ifs com base nesses flags em várias partes do código, e por aí vai.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fedsoncunha.github.io%2Fimages%2F2019%2F12%2F02%2Fposte.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fedsoncunha.github.io%2Fimages%2F2019%2F12%2F02%2Fposte.jpg" alt="Poste com muitos, muitos gatos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código, depois de algumas entregas...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;De modo geral, os sintomas são estes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aparecem atributos remetendo a estados e datas. Exemplos: &lt;code&gt;data_criacao&lt;/code&gt;, &lt;code&gt;data_alteracao&lt;/code&gt;, &lt;code&gt;data_exclusao&lt;/code&gt;, &lt;code&gt;criado&lt;/code&gt;, &lt;code&gt;inativo&lt;/code&gt;, &lt;code&gt;cancelado&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Existem variações importantes de comportamento associadas a datas e/ou flags. Se o estado é &lt;code&gt;criado&lt;/code&gt;, algumas ações são possíveis, se &lt;code&gt;excluido&lt;/code&gt;, as ações possíveis são outras, e assim por diante.&lt;/li&gt;
&lt;li&gt;Fica cada vez mais sofrido acrescentar novas ações e corrigir problemas conforme o tempo passa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Um Estudo de Caso
&lt;/h2&gt;

&lt;p&gt;Imagine que você tem que fazer um site de reclamações sobre empresas, o Resmungue Aqui :)&lt;/p&gt;

&lt;p&gt;Os requisitos básicos são os seguintes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma reclamação pode ser editada quantas vezes a pessoa quiser, até que decida submetê-la.&lt;/li&gt;
&lt;li&gt;Uma vez submetida, ela entra em estágio de avaliação.&lt;/li&gt;
&lt;li&gt;O site torna públicas apenas as reclamações aprovadas.&lt;/li&gt;
&lt;li&gt;Reclamações aprovadas podem ser respondidas por representantes de empresas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você implementa e o código está bonito, pequeno, tudo certo.&lt;br&gt;
Depois de um tempo, chegam mais modificações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reclamações em avaliação não podem ser editadas por ninguém.&lt;/li&gt;
&lt;li&gt;Reclamações em avaliação podem ser aprovadas ou reprovadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais um tempo se passa e você tem que implementar o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reclamações reprovadas podem ser editadas para nova análise.&lt;/li&gt;
&lt;li&gt;Reclamações já aprovadas, se editadas, voltam à fase de análise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consegue imaginar a dificuldade crescente em lidar com esse código e todas as variações (atuais e futuras!) das reclamações do Resmungue Aqui?!&lt;/p&gt;
&lt;h2&gt;
  
  
  Solução
&lt;/h2&gt;

&lt;p&gt;Uma das maneiras mais eficientes de lidar com a complexidade é fazer desenhos.&lt;br&gt;
Podemos então fazer um mapeamento entre os estados e as transições possíveis entre eles. Para isso, construímos uma &lt;em&gt;máquina de estados&lt;/em&gt;, que nada mais é do que um  &lt;em&gt;grafo direcionado&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fedsoncunha.github.io%2Fimages%2F2019%2F12%2F02%2Freclamacao-estados.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fedsoncunha.github.io%2Fimages%2F2019%2F12%2F02%2Freclamacao-estados.png" alt="Estados das reclamações"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os vértices são os estados e as arestas são as ações que levam de um estado a outro. Se uma reclamação é submetida, ela passa do estado de &lt;code&gt;Rascunho&lt;/code&gt; para o estado de &lt;code&gt;Em avaliação&lt;/code&gt; por meio da ação &lt;code&gt;submeter()&lt;/code&gt;, que conecta os dois estados.&lt;/p&gt;

&lt;p&gt;A partir desse modelo, fica bem mais fácil compreender quais ações são possíveis conforme o estado de uma reclamação. Ele nos ajuda a gerenciar a absorver melhor a complexidade, além de podermos usá-lo para conversar sobre os requisitos do projeto.&lt;/p&gt;
&lt;h3&gt;
  
  
  Como implementar a máquina?
&lt;/h3&gt;

&lt;p&gt;Agora, ficou mais fácil compreender que cada estado (vértice do grafo) pode ser envelopado em uma classe específica. Pela sua concisão, todos os exemplos de código do texto serão dados em Kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Rascunho&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmAvaliacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reprovado&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Aprovado&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  O pulo do gato
&lt;/h4&gt;

&lt;p&gt;As ações na reclamação variam conforme seu estado corrente. Portanto, cada estado trata a ação à sua maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;editar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;submeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;aprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;reprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;acaoNaoSuportada&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nc"&gt;NotSupportedException&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Rascunho&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;submeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// seu código&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;editar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// seu código&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;aprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;acaoNaoSuportada&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;reprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;acaoNaoSuportada&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmAvaliacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;submeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;acaoNaoSuportada&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;editar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;acaoNaoSuportada&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;aprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// seu código&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;reprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// seu código&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// etc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, escrevemos o código para que o objeto &lt;code&gt;reclamacao&lt;/code&gt; &lt;em&gt;repasse&lt;/em&gt; as ações &lt;code&gt;submeter()&lt;/code&gt;, &lt;code&gt;editar()&lt;/code&gt;, &lt;code&gt;aprovar()&lt;/code&gt; e &lt;code&gt;reprovar()&lt;/code&gt; ao seu estado corrente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;conteudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;editar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;editar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;submeter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;aprovar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;reprovar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&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;h4&gt;
  
  
  E as mudanças de estados?
&lt;/h4&gt;

&lt;p&gt;Até agora, movemos com sucesso as responsabilidades que dependem de cada estado. Mas como &lt;em&gt;mudar&lt;/em&gt; de um estado a outro? O que fizemos até aqui foi &lt;em&gt;delegar&lt;/em&gt; o comportamento específico a cada estado.&lt;/p&gt;

&lt;p&gt;Existem pelo menos três maneiras de fazer as transições:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a) uma classe gerenciadora, que tenha a visão do todo e gerencie as comutações. Alguns frameworks, como o Spring, funcionam desta maneira. Por um lado, essa abordagem facilita no entendimento global de quais são as possibilidades daquela máquina de estados. Por outro, ela tende a favorecer classes inchadas, o que não gosto.&lt;/li&gt;
&lt;li&gt;b) cada estado indica o estado seguinte, conforme a ação que é disparada dentro dele. Prefiro esta abordagem. Com ela, os testes unitários ficam bem mais expressivos e elegantes.&lt;/li&gt;
&lt;li&gt;c) um comutador que receba tanto os estados quanto as ações como objetos. É a opção (a) com esteroides, e fica bem bacana.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por brevidade, seguirei a abordagem (b). Nela, portanto, se o estado vigente é &lt;code&gt;EmAvaliacao&lt;/code&gt; e ele processar a ação &lt;code&gt;aprovar()&lt;/code&gt;, é o próprio código da classe &lt;code&gt;EmAvaliacao&lt;/code&gt; que atualizará o estado da nossa &lt;code&gt;reclamacao&lt;/code&gt; para &lt;code&gt;Aprovado&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmAvaliacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;EstadoReclamacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;aprovar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Reclamacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;reclamacao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estado&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aprovado&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Falar é de graça&lt;/strong&gt;&lt;br&gt;
Você pode conferir o &lt;a href="https://github.com/edsoncunha/tutorials/tree/master/pt-br/maquina-de-estados/kotlin" rel="noopener noreferrer"&gt;código-fonte no Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O que achou? Se quiser discutir implementações específicas, envolvendo linguagens e frameworks de mercado, deixe um comentário ou mande uma mensagem.&lt;/p&gt;

&lt;p&gt;(Publicado originalmente em &lt;a href="https://edsoncunha.github.io/simplificando-codigo-com-padrao-state" rel="noopener noreferrer"&gt;https://edsoncunha.github.io/simplificando-codigo-com-padrao-state&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>codequality</category>
    </item>
    <item>
      <title>Lessons from learning music: how to get better at software</title>
      <dc:creator>Edson Cunha</dc:creator>
      <pubDate>Fri, 05 Jun 2020 17:11:38 +0000</pubDate>
      <link>https://dev.to/edsoncunha/lessons-from-learning-music-how-to-get-better-at-software-9cm</link>
      <guid>https://dev.to/edsoncunha/lessons-from-learning-music-how-to-get-better-at-software-9cm</guid>
      <description>&lt;p&gt;Programming is only for geniuses. Music is only for the gifted few. Right?&lt;/p&gt;

&lt;p&gt;As a professional software developer and musician in training, I don’t think so. These are long journeys, where genius is not mandatory. Here are some tips that music can give a career in software and vice versa:&lt;/p&gt;

&lt;h2&gt;
  
  
  Take one step at a time
&lt;/h2&gt;

&lt;p&gt;No one plays a solo or writes a sophisticated program with half a dozen classes. This ability is gained in small daily doses, with much repetition. Those who learn to play wind instrument first learn to produce the notes, then connect them, and only then study scales to be able to perform melodies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F7209%2F6960939955_df60b8523b_z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F7209%2F6960939955_df60b8523b_z.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As per the cliché, it takes much more perspiration than inspiration. What matters isn’t how long the step is, but to not stop walking at all. The experience is accumulated during the journey.&lt;/p&gt;

&lt;p&gt;No one learns programming by just opening an IDE. Before that, people learn to interpret and solve problems, structure the solution in plain English or pseudo-code and only then start to work with code at all. There is a lot of ground to cover between inception and major architecture design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do your bodybuilding
&lt;/h2&gt;

&lt;p&gt;Professional musicians study each day from their first contact with the instrument. Among French horn players (which has the most beautiful sound in the world!), there is even a debate about whether or not to have a day off.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F3892%2F14906759648_d183590e2e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F3892%2F14906759648_d183590e2e.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to be able to play, musicians practice regularly so that their movements are precise and automatic and their bodies and minds are always in a position to play.&lt;/p&gt;

&lt;p&gt;If you are already programming daily, it is very likely that this strengthening happens naturally. If not, try to exercise. Even with all his decades of experience Uncle Bob practices katas everyday to test and keep his skills sharp. Repetition makes us write code more automatically and frees the brain for other concerns. This is very important as we cannot pay attention to everything at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hit the nail on the head
&lt;/h2&gt;

&lt;p&gt;When you study a solo, for example, you don’t spend much time going over what already sounds good enough. Instead, you practice the stretches that are often bad or not good enough. These are played bar by bar, slow at first then faster, until things are better and the song is played well from start to finish.&lt;/p&gt;

&lt;p&gt;Do you already write code comfortably but are unsure about writing tests? Set aside some time for yourself. Read Kent Beck’s TDD book , or Steve Freeman and Nat Price’s version , then start cooking!&lt;br&gt;
Anticipating a future discussion: delivering tested code is your obligation!&lt;/p&gt;

&lt;h2&gt;
  
  
  Rest, alternate and insist
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F7189%2F6965845383_f5635dfa53_w_d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F7189%2F6965845383_f5635dfa53_w_d.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The muscles and brain get tired. Sometimes we get stuck at some point and repetition at a slower pace doesn’t help. Coffee and small talk usually helps. The next day, coming back to the problem with rested muscles and brain, the struggle evaporates like magic.&lt;/p&gt;

&lt;p&gt;Are you reading a snippet of a technical book you can’t understand? Get up and drink some water. Go do something else and then go back to reading. It’s late in the day, you’ve been racking your brain for 40 minutes and still can’t find the root cause of that bug? If it’s not very urgent, get up and go home. You will come back the next day and find out the solution in just 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn from multiple sources
&lt;/h2&gt;

&lt;p&gt;Everyone has a unique story. The best musicians in the world go through various teachers and this is absolutely normal as everyone has their own strengths, experiences and levels of knowledge in music making. When starting a class, my first teacher will always make me play several scales (major, minor, harmonic minor… etc), whilst the second will require my bass to sound like a foghorn.&lt;/p&gt;

&lt;p&gt;Drinking waters from various sources makes you understand water better. Donald Knuth, the greatest living computer scientist, advises us to read code from more experienced people. Read books from people in the industry too. They exist in large numbers and are excellent for learning from professionals with decades of experience. Did you buy a book and see no value in it? Keep it, because the Dunning-Kruger effect is probably running through your veins. I assure you that after a few years you will have had many problems in practice — and the knowledge of that book will most likely help you alleviate this pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pay attention to your surroundings
&lt;/h2&gt;

&lt;p&gt;Rehearsal is when you learn from your peers. You need to bring your part ready from home. It is time to understand how harmonies, melodies, solos and accompaniment fit together, work on the interpretation and make the audience cry in their chairs — of emotion, preferably.&lt;/p&gt;

&lt;p&gt;It’s true we have no essay in this format in the software industry. But we do not work alone. Soft skills and good communication are key. I don’t know a company or coworker who is interested in people who just do their part and who doesn’t connect with what happens around them. Don’t isolate yourself behind the headset. Listen to the environment. Tell your opinions. Help your peers. Allow them to help you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer environments where it is safe to make mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F3446%2F3245065570_f2412c8f87_c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F3446%2F3245065570_f2412c8f87_c.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you tried singing to the point you crack your voice? Have you blown a note so high the note actually cracked? It’s a must! :-)&lt;/p&gt;

&lt;p&gt;Having the time and place to make mistakes without being punished is critical to gaining the courage to try. Courage, in turn, is transformative.&lt;/p&gt;

&lt;p&gt;There are many ways to catch problems before they are eventually deployed to production. Good companies, besides encouraging the use of this tooling, understand that people are in different stages of development. They get more experienced people to nurture those who are coming and encourage them to try.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Who will be in the trenches beside you?&lt;br&gt;
  -- Does it matter?&lt;br&gt;
  -- More than the war itself&lt;br&gt;
  (Ernest Hemingway)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Originally published at &lt;a href="https://edsoncunha.github.io/licoes-da-musica-para-evoluir-no-desenvolvimento-de-software/" rel="noopener noreferrer"&gt;https://edsoncunha.github.io/licoes-da-musica-para-evoluir-no-desenvolvimento-de-software/&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>career</category>
    </item>
  </channel>
</rss>
