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;
public static final Integer SAO_PAULO = 3;
private Long idDemanda;
private String nomeClusterPrincipal;
private Map<Integer, Boolean> mapaDeClusters =
new HashMap<Integer, Boolean>();
}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