Código Limpo – Parte 01

Já pensou no que as pessoas dizem sobre você após lerem seu código? Não me refiro apenas às pessoas das quais hoje você convive, imagine sobre a primeira empresa que você trabalhou, será que seu código é elogiado? Se seu companheiro de trabalho for ler e entender seu ultimo código, será que ele poderá ter um surto psicótico? O que você pensa, hoje, sobre a qualidade do código que deixaram para você alterar? Qual o nível de habilidade você daria para essa pessoa?

A pergunta que vai ecoar é: “Após analisarem nosso código, eles poderão nos indicar como referência para desenvolvimento?” (ouch!).

Para que isso aconteça, devemos adotar certas boas práticas e costumes enquanto estivermos fazendo nosso “if de cada dia”. Como esse conteúdo é extenso, vou dividi-lo em várias partes.

Como exemplo, iremos utilizar um sistema de consulta à informações das partidas de futebol. Eis um breve resumo: “O sistema Futebol Show tem por objetivo informar dados das partidas. O sistema deve conter: data/horário das partidas agendadas, local da partida, times que estarão jogando (e seus jogadores), trio de arbitragem. Ao final de cada jogo, o sistema retornará a quantidade de gols (total, e gol marcado por cada jogador), o resultado, soma dos cartões aplicados pelo juiz”.

1 – Classes

  • É aconselhável que as classes tenham nomes de substantivos. No nosso exemplo, poderíamos identificar: Partida, Estádio (local da partida), Time, Arbitragem, Jogadores. Isso lhe ajudará a pensar e entender o que está sendo feito, e para onde o sistema está caminhando. Dar-te-á uma melhor visão do contexto. Imagine se colocássemos Estádio como String na classe Partida. Se pedissem para adicionar mais tarde capacidade de pessoas, teríamos que criar mais um atributo em Partida, a classe partida começaria a perder sua Coesão, pois quem deve saber a capacidade de pessoa no estádio é o Estádio, não a Partida.
  • Nome das classes no singular. Se você acabasse de ler uma classe nomeada como Jogadores. O que vem a sua cabeça? Provavelmente, um conjunto de Jogadores. Bem óbvio, mas acreditem, já vi acontecer de encontrar nome de classes no plural. E ao questionar o porquê, não me disseram (ninguém sabia), sendo que a função da classe era de ser um objeto único mesmo. Nomeando corretamente sua classe, irá trazer mais clareza ao propósito da classe.

2 – Métodos

  • O nome dos métodos devem indicar um verbo. Após ler a ação no nome, já temos uma boa idéia do que ele irá realizar. Por exemplo:
    match.goal(value);

    O que esse código faz? O que ele retorna? Lá se vai um tempo para ter que entrar na classe, analisar o método… Imaginem se fosse escrito assim:

    match.getGoalsByPlayer(player);

    Ao ler o nome do método (com o verbo), já dá para ter uma noção do retorno, e inclusive, um provável comportamento do método.

  • É indicado que cada método mantenha um único objetivo. Imagine se você for chamar o método para buscar o total de pessoas presentes na partida:
    List presentAudience = match.getTotalPresentAudience();

    Mas ao executar o método, a seguinte mensagem é retornada:

    Exception in thread "main" main.DaoPublicException
      at main.DaoPublic.updateTotalProfitMatch(DaoPublic.java:6)
      at main.PresentAudience.getPresentAudience(PresentAudience.java:7)
      at main.match.getPresentAudience(match.java:7)
      at main.Principal.main(Principal.java:13)

    Espere, porque um método de atualizar renda da partida está sendo executado onde uma simples consulta deveria ser feita? Seu método tem que ser “Coeso”. Caso não haja outra opção, como última escolha, altere o nome do método para que o desenvolvedor que usar o método esteja ciente do que vai ocorrer. (Sei que o nome ficou feio, mas…).

    match.getPresentAudienceAndUpdateProfit();
  • Identação: “Deve ser a primeira regra do desenvolvedor”. O problema é que cada pessoa tem seu modo predileto, e às vezes não condiz com o padrão da empresa. Uma coisa é certa, não sei qual o padrão que você irá adotar, mas, por favor, sempre adote um. Abaixo dois códigos onde que, em sua leitura, fica clara a diferença de leitura:
            public int calculateScoredGoals()
        {int total = visitorTeam.getScoredTeam() +
    houseTeam.getScoredTeam();
                return total
            ;}
      public int calculateScoredGoals(){
        int total = visitorTeam.getScoredTeam() +
        houseTeam.getScoredTeam();
        return total;
      }

    Não importa qual a sua identação, apenas adote uma que facilite a leitura não só sua, mas de toda empresa.

  • Não devemos preservar referências retornadas por métodos que não terão utilizade depois. Vamos imaginar um método de atualização, que retorna a lista com os objetos que foram atualizados para caso queira utilizar:
      public void updateMatchDate() {
        //... Some code
        List expelledPlayers = DaoFactory.getDaoMatch().updatePlayers(expelledPlayers);
        //... More code, but none of them accessing expelledPlayers
      }

    Qual o motivo de ter criado a referência para a lista? Para que? Bastaria chamar o método e pronto. A lista será atualizada e você terá uma referência a um objeto alocado na memória que não será utilizado.

Esse foi o primeiro post sobre esse assunto, ainda falta muito pela frente!

Caso queria debater sobre essas idéias, podem postar que eu responderei. Gosto de aprender com a experiência de todos.

12 thoughts on “Código Limpo – Parte 01

        • João, boa tarde.

          Na verdade nessa época, quando escrevi o primeiro post sobre Clean Code, eu não tinha dinheiro para comprar o livro do Clean Code. =/

          Acabou que consegui comprar depois, e garanto que foi de muito boa valia.

          Mas creio que você está equivocado quanto ao conteúdo do primeiro capítulo do livro, segue abaixo:
          There Will Be Code
          Bad Code.
          The Total Cost of Owning a Mess
          The Grand Redesign in the Sky
          Attitude
          The Primal Conundrum
          The Art of Clean Code?
          What Is Clean Code?
          Schools of Thought
          We Are Authors
          The Boy Scout Rule
          Prequel and Principles

          Eu concordo e indico para qualquer pessoa a leitura do livro.

          Obrigado pela visita.

  1. Será que alguém aí nos comentários está com recalque? Ou será só mais um que não lê, não estuda, mas na hora de criticar perde a oportunidade de ficar calado e só fala besteira…?

    Muito bom o seu post! Sempre visito seu blog e tem me ajudado muito! Parabéns!

    • Lilian, boa tarde.

      Agradeço o apoio, mas no momento não existe código em português. E como escrevo tudo em português e inglês fica inviável escrever o código em duas linguagens.

      Obrigado pela visita, e desculpe a demora em responder. Estive muito ocupado nesse último mes.

Leave a Comment