Houve, por exemplo, um jogo de computador com personagens heterossexuais. O gênero do personagem será armazenado no campo de gênero. Você pode tornar esse campo um número inteiro ou uma seqüência de caracteres, mas um bom programador procura tornar o estado incorreto dos objetos inexprimível e, portanto, muito provavelmente, iniciará uma enumeração para o piso. Agora, criar um personagem com o sexo errado é simplesmente impossível!
E no jogo há um banco de dados no qual todos os jogadores estão armazenados, e também é necessário registrar o sexo deles. Seria bom tornar impossível a adição de um personagem com um sexo incorreto ao banco de dados, porque não apenas o código funcionará com ele, no qual nada, exceto enum, é fornecido para os sexos, mas também para as pessoas vivas. E os seres humanos, como sabemos, e se esforçam para entrar no banco de dados que não é necessário para entrar.
Felizmente, especialmente para tais casos, em muitos bancos de dados também têm a oportunidade de fazer uma coluna de tipo de enumeração, limitando, assim, a gama de valores que podem ter dados desta coluna. E isso vai tirar proveito de um desenvolvedor experiente, que não quer que seu projeto foi algo não no Feng Shui.
No cliente, o programador também não é tolo e também sabe que estados incorretos devem ser inexprimíveis e, para isso, o gênero do caractere deve ser enum.
Perfeito!
No entanto, se você olhar de perto, poderá encontrar uma pequena falha, que acaba levando a problemas. O campo, que detém o chão, não é chamado sexo e gênero, o que significa que ele escolheu para designer de jogos. Mais cedo ou mais tarde, ele descobrirá que existem substancialmente mais de dois sexos, diferentemente dos sexos, e desejará adicionar o gênero GENERIC_TEEN. Então todo mundo vai ficar estúpido.
A necessidade do cliente para atualizar constantemente
Os primeiros a cair são os caras que escreveram o código do cliente, porque valores incorretos do parâmetro gender começarão a vir do servidor para cada espirro. E quando um personagem vem com o gênero da existência de que o cliente não sabe o servidor, o jogo como um programador como o cliente simplesmente não vai começar. Agora, quando novos gêneros precisa liberar novas versões do cliente e executar a atualização forçada, que todos nós amamos tanto.
No servidor enum, é bom, porque se algum valor desconhecido for encontrado lá, é claramente um erro que precisa ser encontrado e corrigido, mas no cliente, a aparência de um valor desconhecido é uma situação regular que ocorre regularmente em versões desatualizadas do cliente e, portanto, há enum - um mal que deve ser erradicado e destruído o mais rápido possível.
O novo código não poderá funcionar com o banco de dados antigo
Além disso, de acordo com as recomendações dos melhores criadores, o novo código deve ser capaz de trabalhar com os dados do circuito de idade, e, em seguida, verifica-se que todo o sistema pode entrar em colapso apenas por causa do fato de que o código é adicionado ao novo gênero.
Portanto, a enum nos incomoda no banco de dados e, nesse caso, precisamos armazenar as seqüências de caracteres do campo, ou ints, ou qualquer outra coisa, nas quais, se necessário, você pode escrever um valor que não é fornecido antecipadamente.
E alguém vai dizer, ok, ok, sobre os danos enum cliente e no banco de dados, ele é mais obstáculo do que ajuda, mas no código do servidor, a enumeração é de grande benefício. Ele não vai se oferecer para remover o código enum no servidor? Será!
O código antigo não poderá trabalhar com o novo banco de dados
Atualmente, recomenda-se ao programador não apenas escrever o código para que ele funcione normalmente com o banco de dados antigo, mas também desenvolver o esquema de dados para que o código ligeiramente desatualizado também possa trabalhar normalmente com ele.
E se você usar enum no servidor para sexo, tudo desmoronará novamente, apenas depois que algo estiver errado com o novo código e você precisará reverter tudo imediatamente para a versão anterior, e os novos gêneros já entraram no banco de dados.
E, portanto, a enumeração do código do servidor com o passo medido de um soldado vai a algum lugar na direção da floresta mais próxima, para nunca mais voltar dali, porque tudo o que pode destruir o sistema na hora errada é ruim, e o mal não tem lugar em nosso código acolhedor.
Talvez martelar um enum e sempre usar cordas?
Resumindo, como diria o Ursinho Pooh - esse é um tipo de enigma errado, e leva o programador a escrever o código errado! A enumeração realmente tem que colocar as coisas imutáveis e fundamentais que não mudam ao longo dos anos, ao invés de sexo, são adicionados e desaparecem a cada lançamento! Cada tarefa possui sua própria ferramenta, e o enum não é a ferramenta que você precisa usar para armazenar valores, cujo espectro possível está em constante expansão.
Se uma variável puder usar apenas alguns valores conhecidos anteriormente e tudo o que não estiver incluído nesses valores levar a um erro, usar enum é uma boa ideia, mas se não for, se os valores inesperados caírem regularmente na variável, use enum é igual a dar um tiro no próprio pé, e é melhor não fazer isso, a menos que você seja, naturalmente, um masoquista.
Esta situação particular é interessante porque não havia sinais adicionar aos novos valores enum, para não mencionar o fato de que os novos valores serão exibidos regularmente. Como soubemos que haveria mais de dois sexos?
Portanto, de acordo com o princípio KISS, o enum no primeiro estágio é uma escolha boa e correta. Um programador experiente criará enum e corrigirá que, quando um valor adicional aparecer, você precisará executar imediatamente os eventos necessários para que o enum desapareça do código.
Infelizmente, a experiência mostra que, de fato, a adição de um novo gênero vai lidar com qualquer outra pessoa, e ele, sem pensar duas vezes, adiciona um novo valor de enumeração, um descanso sobre este assunto. Portanto, se houver alguma dúvida, é melhor seguir uma regra simples: ela é armazenada em algum lugar, exceto pelo código - significa não enum, e esse é o ponto.
Então, enum não deve estar no código relacionado a gênero?
Apesar do que acabei de dizer, a enumeração no código ainda pode ser muito útil, mesmo que contenha valores que se enquadram no banco de dados. Só não usá-los para armazenar valores que são puxados a partir do banco de dados, é necessário comparar que vem do banco de dados para o valor desejado. Por exemplo, quando um programador deseja escrever que, se o gênero do personagem for GENERIC_TEEN, ele não poderá colocar álcool em seu inventário, você poderá criar um enum Gender com o método value que retorna uma string e escrever um código que verificará se o personagem tem um campo de gênero e Gender.GENERIC_TEEN .value () e isso será bom, porque não permitirá que o programador cometa um erro no valor do status.
O código deve evoluir
Decisões que nos serviram bem em algum momento podem se tornar desconfortáveis com o tempo. E você precisa ter certeza de que o código reflete o estado atual do projeto, e não um conjunto de muletas, com as quais a solução criada no joelho alguns anos atrás se estende ao "aqui e agora". Caso contrário, será uma fonte inesgotável de fakapov e lulz para todos que já teve alguma coisa a ver com o projeto, seja ele um programador, testador ou diretamente aos consumidores.