Boa noite.
Depois de muito tempo, cá estou com uma dúvida nas melhores práticas.
O caso é o seguinte:
Tenho uma classe, chamada ARS. A classificação de uma ARS é definida por 3 atributos:
[list]Ocorrencia: Intervenção Manual, Investigação e Correção[/list]
[list]Complexidade: Complexa, Média, Simples e Muito Simples.[/list]
[list]detstatus: Procedente ou Improcedente[/list]
Existe uma funcionalidade na aplicação que é a pontuação de cada ARS baseada nesses 3 atributos. Isso gerou o IF abaixo (com valores fictícios) que estou “doido” para eliminar, pois, até para mim, que foi quem desenvolveu a aplicação, é difícil de dar manutenção:
/**
* Business logic for ARS's score
* @return the score of ARS
*/
public double getScore() {
if (this.detStatus == null) {
detStatus = "";
}
if ((isInvestigacaoProcedente()) && (isComplexa())) {
return 150.0;
}else if ((isInvestigacaoProcedente() || isIntervencaoManualProcedente()) && (isMedia())){
return 35.0;
}else if (((isInvestigacaoProcedente() || isIntervencaoManualProcedente()) && (isSimples())) ||
((isInvestigacaoImprocedente()) && (isMedia())) ||
((isIntervencaoManualImprocedente()) && (isComplexa()))){
return 15.0;
}else if (((isInvestigacaoProcedente()) && (isMuitoSimples())) ||
((isInvestigacaoImprocedente()) && (isSimples()) ||
(isIntervencaoManualImprocedente()) && (isMedia()))){
return 7.5;
}else if ((isInvestigacaoImprocedente()) && (isComplexa())) {
return 12.5;
}else if (((isIntervencaoManualProcedente()) && (isMuitoSimples())) ||
((isIntervencaoManualImprocedente()) && (isSimples()))){
return 11.0;
}else {
return 0.0;
}
}
Com o Design Patterns da GoF e o Padrões de Projeto em Java do Steven John Metsker debaixo do braço, fui a luta e achei que os os padrões State ou Strategy pudessem resolver meu problema.
Mas antes de definir entre os dois padrões, preciso definir a modelagem.
Pensei em criar uma hierarquia que começasse de ARSStatus descesse para ocorrencia, depois para complexidade e depois para procedencia (detstatus). Acontece que desta forma, eu teria uma quantidade absurda de classes na hierarquia (40).
Tendo isso em vista, pensei em criar classes que combinassem os valores desses 3 atributos e fazer um override do método pontuar() em cada uma delas. Dessa forma, eu teria 24 classes. Entretanto, o que me preocupou foi o tamanho dos nomes das classes =).
Um ex: IntervencaoManualMuitoSimplesImprocedente :shock:
Estou inclinado a usar essa segunda abordagem, pois, apesar do nome grande, me parece que IntervencaoManualMuitoSimplesImprocedente é uma classe do sistema.
Qual a melhor abordagem para esse caso, a primeira? a segunda? ou nenhuma delas?
Obrigado.
Abraços!