Gostaria de saber a opinião de vocês quanto ao seguinte:
Em um projeto que tenho participado existe uma arquitetura toda definida onde existem classes utilizadas apenas para constantes. (Não são interfaces de constantes para implementação).
Existe até o caso de criar classe para definir constantes para números.
Ex.:
ClasseNum.UM, ClassNum.CENTO_E_SETENTA_E_CINCO e assim vai.
Eu não acho muito elegante usar este tipo de constante.
P/ tentar aliviar a aparência deste código alguns preferem somar as constantes, tipo:
ClassNum.CEM + ClassNum.SETENTA + ClassNum.CINCO.
Mas na minha opinião o melhor mesmo seria criar alguma DSL e poder escrever algo do tipo:
ClassNum.CENTO.e(ClassNum.DEZ)
Com uma DSL bem definida não seria necessário criar uma constante nova a cada número que tenha que ser adicionado na aplicação.
É isso pessoal, gostaria de saber a opinião de vocês quanto ao que acham que é melhor.
Acho estranho a abordagem da sua empresa para constantes!
Tecnicamente, a finalidade da constante é abstrair um valor (que pode mudar) de modo que eu não tenha altera-lo em todos os lugares caso ele mude. Para isso eu defino um nome que represente o meu valor como NOME_DO_ARQUIVO_DE_CONFIGURACAO. Eu posso colocar qualquer valor para essa constante, mas todo mundo vai saber que ela indentifica o nome do arquivo de configuração.
Agora se eu uso uma constante com o nome CENTO_E_CINCO, o que ela representa? O número 105? Se for assim Não faz sentido, pois se eu quiser mudar o valor da constante para 110 ela deixa de representar o meu valor 105!
Acretido que usar uma DSL não resolve o seu problema, que deve ser outro. Provavelmente estão usando constantes de maneira incorreta.
[quote=pmlm]Ter 165 ou ter Constants.CENTO_SESSENTA_CINCO, é exactamente a mesma coisa.
As constantes devem ter nomes lógicos para o que representam e não nomes relativos ao seu valor actual.
[/quote]
Realmente concordo muito com o que disse.
Porém é uma regra da empresa a qual não podemos mudar aqui na equipe.
Então eu gostaria de ver qual abordagem acham “menos estranha” dentro deste cenário =P
Eu acho que usar uma classe para constantes com números não é legal, pois podemos ter uma classe gigantesca cheia de números definidos.
Alguns começaram a somar as constantes p/ obter o valor desejado e assim economizar linhas de código na classe de constantes.
Eu achei mais interessante a DSL p/ tornar o código mais dinâmico…
[quote=adolfo_eloy][quote=pmlm]Ter 165 ou ter Constants.CENTO_SESSENTA_CINCO, é exactamente a mesma coisa.
As constantes devem ter nomes lógicos para o que representam e não nomes relativos ao seu valor actual.
[/quote]
Realmente concordo muito com o que disse.
Porém é uma regra da empresa a qual não podemos mudar aqui na equipe.
Então eu gostaria de ver qual abordagem acham “menos estranha” dentro deste cenário =P
Eu acho que usar uma classe para constantes com números não é legal, pois podemos ter uma classe gigantesca cheia de números definidos.
Alguns começaram a somar as constantes p/ obter o valor desejado e assim economizar linhas de código na classe de constantes.
Eu achei mais interessante a DSL p/ tornar o código mais dinâmico…
[/quote]
Nesse caso acredito que uma DSL faça mais sentido mesmo já que vocês estão usando constantes indevidamente! Com certeza faria mais sentido que o uso que vocês estão fazendo agora.
Trabalhei em um projeto em que se fazia exatamente isso. O motivo é que o cliente usava checkstyle, e entre as verificações que ele fazia estava a proibição de valores literais no código (magic numbers), ou seja, era obrigado a usar constantes sempre.
Aí o pessoal, por uma mistura de desinformação e preguiça começou a burlar a regra usando constantes UM, DOIS, TRES, CENTO_E_SETENTA_E_CINCO, etc.
Como os colegas bem disseram aí em cima, defina as constantes pelo seu significado e não pelo valor, porque desse jeito é a mesma coisa que não ter. Tente trabalhar essa questão aí com sua equipe, pode ser que só esteja assim porque ninguém quis ter o trabalho de “levantar a bunda da cadeira” para questionar.
Você também deve ter o cuidado de se ficar criando constantes demais na sua aplicação.
Constantes no java geralmente são declaradas como estáticas e final e assim como métodos estáticos, mesmo sendo declarados em uma classe específica, são alocados em memória tão logo a aplicação se inicia, e só são retirados de lá tão logo a aplicação se fecha.
Estou com a maioria aqui, pois constantes só devem ser declaradas para valores imutáveis, afinal porque que as mesmas levam esse nome de Constantes, e também com valores que definam o seu nome, como por exemplo: O valor de PI que é igual a 3,14161816…, todos sabem que este valor sempre será o mesmo para PI, então você pegar um número aproximado desta dízima e defini-la com o nome PI. Outro exemplo para constantes é criar valores númericos para opção de Menu, exemplo:
public class MinhaClasse {
....
public static int STATUS = 0;
public static final int INSERIR = 1;
public static final int ATUALIZAR = 2;
public static final int APAGAR = 3;
....
.....
.....
}
public class OutraClasse {
.....
MinhaClasse.STATUS = MinhaClasse.INSERIR;
.....
.....
switch (MinhaClasse.STATUS)
case MinhaClasse.INSERIR: ........ ;break;
case MinhaClasse.ATUALIZAR ..... ;break;
case MinhaClasse.APAGAR ..... ;break;
}
}
Assim como já foi dito, não faz sentido voce somar 165 + 5, ou somar MinhaClasse.CENTO_SESSENTA_CINCO + MinhaClasse.CINCO, qual das sentenças seria mais fácil digitar :?: :?: :?: