terça-feira, 29 de março de 2011

Qualidade na Prática - Enums no lugar de Constantes - Parte I

No projeto atual, tive a oportunidade de pensar numa situação em que fica claro o poder do Enums no Java. O código que será mostrado é uma síntese do que seria o problema se eu não lançasse mão deste recurso da linguagem Java. Nesta primeira parte, verificaremos o problema e a opção com constantes.

A necessidade: Realizar a carga de Clusters principal e impactados em uma Demanda. A origem desta carga é uma arquivo CSV, onde as colunas são o número da demanda, Cluster principal e todos os clusters existentes no sistema. Quando o Cluster é impactado, existe um X no campo.

Primeiro passo: transformar os "X" em 1 e outras informações em "0".

Assim, um simples split devolve um array com as partes de cada linha, com a informação se o Cluster está impactado (1) ou não (0).

Bem, precisamos ler esse array e a primeira solução que vem a cabeça, no sentido de melhorar um pouco a comunicação do código, seria usar constantes.

Uma observação é que o módulo de leitura não precisa conhecer as classes Demanda e Cluster, já que suas responsabilidades são ler o arquivo e disponibilizar a informação. Para a segunda tarefa, outra estrutura pode ser criada, já contendo as constantes de definição dos índices:

public class ImpactadorCluster { 

    public static final Integer RIO_DE_JANEIRO = 2;
    public static final Integer SAO_PAULO = 3; 

    private Long idDemanda;
    private String nomeClusterPrincipal;
   
    private Map<Integer, Boolean> mapaDeClusters =
        new HashMap<Integer, Boolean>();
}

É fácil notar que o uso de constantes já nos trouxe um problema: temos um Integer completamente solto e sem sentido como parametrização do Map. Nada deixa claro que este Integer, key do Map, é o índice de alguma coisa. Na minha opinião, só este fato já serviria para descartar esta solução.

Mas este prejuízo à clareza do código não é o único problema. Para o leitor fazer o seu trabalho, é necessário que informações sejam colocadas no Map. Para fazer isso, só existe uma forma: chamar put de Map, manualmente, tantas vezes quanto o número de clusters do sistema, definido nas constantes, assim:

mapaDeClusters.put(ImpactadorCluster.RIO_DE_JANEIRO, partes[ImpactadorCluster.RIO_DE_JANEIRO].equals("1"));
...

Obviamente, não para por aí. Se temos um problema para colocar dados no Map, provavelmente, temos problemas para tira-los de lá também. Quando conseguirmos tirar os dados do Map, surge outro problema. Precisamos recuperar o Cluster do repositório, baseado no seu nome. Como fazer?

Bem, não pensei em outra solução que não fosse um Map relacionando o índice com uma String, que representa o nome do Cluster no repositório.

É fácil perceber como a clareza do código está prejudicada e, provavelmente, vários comentários seriam necessários para ajudar a manter e evoluir essa solução.


Assim, existe uma maneira melhor de relacionar índice, nome do cluster e impacto?

No livro Effective Java do Joshua Bloch, encontramos o seguinte:
An enumerated type is a type whose legal values consist of a fixed set of constants, such as the seasons of the year, the planets in the solar system, or the suits in a deck of playing cards.
A parte II deste post será sobre essa abordagem.

Nenhum comentário:

Postar um comentário