Pessoal, como vocês geralmente fazem numa situação em que a regra de negócio fala de um valor específico de um objeto?
Exemplo:
a) em um sistema que tenha um cadastro de pessoas e um dos atributos de pessoas é da classe Escolaridade. Daí tem um módulo do sistema que é publicação de artigos e tem uma regra dizendo: se o autor não tiver diploma então publique com o status de “revisar”. Caso contrário publique normalmente.
Neste caso a gente precisaria no sistema ter um valor para o status revisar e um grupo de escolaridades inferiores a tal? Acho feio fazer uma classe de constantes tipo:
public class Constantes {
public static final Integer STATUS_A_REVISAR = new Integer(6);
}
E se o valor do status mudar? E se deletarmos este status?! Isso deveria ficar numa classe? Por que não no BD ou num properties?
E vocês geralmente fazem uma classe do tipo Status com id e descrição ou simplesmente colocam um atributo Integer na classe Artigo?
Tambem seria interessante usar uma estrutura do tipo
classArtigo{privateStatusArtigostatus;publicvoidsetRevisar(){this.status=StatusArtigo.REVISAR;/* Outras regras relacionadas a mudança de status poderiam entrar aqui*/}
M
mzugaib
O que eu acho feio é que no banco de dados vamos ter uma tabela de status. O enum é um espalho desta tabela. Beleza. Mas quando a tabela mudar? Tenho que recompilar o código. Isso não contraria os princípios de oo? Seja pra alterar o valor, o nome, adicionar ou excluir status?
A
andreymb
Se sua tabela no banco mudar, retirando ou adicionando status por exemplo, acho bastante improvável que você não tenha que alterar nenhuma regra de negócio em seu código fonte, o que por si só já lhe obrigaria a recompilar o código. Não vejo onde isto afeta os pricípios de OO.
gostei deste design pattern!
porem acho que pra ele funcionar comigo o enum teria que ter conhecimento da classe artigo, um relacionamendo bidirecional
pcalcado
mzugaib:
gostei deste design pattern!
porem acho que pra ele funcionar comigo o enum teria que ter conhecimento da classe artigo, um relacionamendo bidirecional
Provavelmente não é o que você precisa então. Enum não é um design pattern, é um construto da linguagem, mas leia sobre o Pattern State.
M
mzugaib
pcalcado:
mzugaib:
gostei deste design pattern!
porem acho que pra ele funcionar comigo o enum teria que ter conhecimento da classe artigo, um relacionamendo bidirecional
Provavelmente não é o que você precisa então. Enum não é um design pattern, é um construto da linguagem, mas leia sobre o Pattern State.
Mas eu estava falando do State que faz uso de Enum! O que eu quis dizer é que acho que nos métodos equivalentes ao “Turn on” e “Turn off” eu teria que passar Artigo ou no próprio construtor do Enum? ? ou seja, o Enum ter conhecimento da classe Artigo.
pcalcado
Desculpe, eu ainda não entendi direito o que você quer fazer. Para mim, no seu post inicial você queria fazer algo como:
E se você precisa guardar o estado deste enum numa tabela pode fazer algo como o andreymb mostrou para ter um valor no enum, que é o armazenado na tabela.
Banzai10
Se a enum ficar em um assembly separado,
você pode recompilar somente o assembly dele, que pode ser mantido debaixo de uma interface o que não ocasionaria
grandes transtornos, inclusive dependendo do tamanho da aplicação podes começar a utilizar versionamento de assemblys.