7
votes

Tout ou null avec des énums?

J'ai remarqué que je l'ai fait de manière incohérente dans le même projet. À certains endroits, j'aurai une énumération avec une option de toutes toutes, et dans d'autres, j'aurai mon énuméro comme un type nullable avec une valeur null indiquant tout (ou aucun filtre.)

Je l'ai remarqué quand je devais écrire quelque chose comme si (région! = null && région! = régions.all) . .

Y a-t-il une raison d'aller d'une manière ou d'une autre?


2 commentaires

Les noms d'enum doivent être supérieurs en maquillage


J'ai l'impression que c'est une question d'inadéquation d'impédance d'objet relationnelle. Dans le côté de l'application, il est logique d'avoir des options telles que "toutes" "toutes les régions de la côte ouest" et "toutes les régions de la côte est". Cependant, je suis souvent en train d'utiliser l'énumé sur Int directement comme un sqlparameter. Dans ces méthodes, je devrais vérifier pour chacune de ces instances et les convertir en sql approprié. (Au lieu de "et de la région = 1" J'aurais besoin de "et de la région (2, 4, 5)"). Malheureusement, les SQLParameterers ne fonctionnent pas non plus avec des listes.


3 Réponses :


7
votes

Utilisation de régions.All est plus explicite en ce qui concerne la transmission de la signification. Vous pouvez "attribuer" ce sens à null et l'ordinateur irait bien avec elle. Les lecteurs de votre programme devraient toutefois être décéchés de sorte que la signification de la façon dont vous utilisez la valeur null Enum ou de lire vos commentaires. régions.all , d'autre part, est auto-documentant et auto-explicite.


0 commentaires

2
votes

où enums que vous devez spécifier soit un type "Tous" ou "NULL", je vais habituellement avec l'attribut drapeau & et et et et et et | . C'est une solution beaucoup plus flexible.

comme pour faire un type nullable ou avoir une option soit "tout", je pense que si cela a du sens pour vous, alors je ne vois aucun problème avec ça. Je préfère simplement utiliser des drapeaux.


2 commentaires

Un membre Tout est utile pour [indicateurs] Enums aussi ... Il n'y a aucune règle que tous les drapeaux doivent être mutuellement exclusifs.


@Benvoigt - totalement. Lorsque j'ai ces types de combinaisons fréquentes, je ferai un tout = 0x111 ou autre. Vous pouvez également faire quelque chose comme pizzaandbreadsticks = 0x101 s'il s'agit d'un combo fréquent que vous souhaitez une définition explicite pour.



2
votes

Généralement, nous utilisons null pour signifier "non spécifié" ou "inexistant" ou "non applicable". Donc, dans le cas d'un filtre, il est logique de permettre à NULL, car cela signifie «pas de filtrage».

De plus, un énumé appelé régions a probablement des valeurs telles que nord-est , sud-est , midwest , Southwest et West . Maintenant, veuillez me corriger si je me trompe, mais je ne pense pas qu'il y ait une région intitulée "All" aux États-Unis. Au cours de mon séjour de plusieurs ans, j'ai entendu le météorologue sur la télévision parlant de la météo à l'ouest et de la météo dans le sud-est, etc. mais jamais de la météo à un endroit appelé "tout". Donc, je suis enclin à croire qu'il n'y a pas de telles régions. Par conséquent, y compris «tous» dans une énumération de régions est un hack. Soudainement, les régions Enum ne concerne pas les régions; Au lieu de cela, il s'agit de régions et / ou de filtrage de celui-ci. Les changements de ce type sont au courant de la programmation et d'éviter généralement.


4 commentaires

Je ne suis pas d'accord avec toujours affectant NULL à une variable Enum. Il ne faut rien pour créer une valeur de Aucun ou tout qui décrit parfaitement ce que null signifie réellement dans ce contexte.


@ Hand-e-Food Oui, bien sûr, il ne prend rien. Et ensuite, vous avez une liste des objets «dirigeants régionaux» chacun d'un domaine «région», et il est parfaitement valable d'avoir un gestionnaire régional qui gère une région appelée «aucune» ou une région appelée «aucune». Félicitations, vous venez de violer un principe fondamental de l'intégrité des données.


Je vois votre point maintenant que l'ajout de membres indiscret à ce qui devrait être une énumération discrète est incompatible. Quelque chose ne reste pas assis avec moi en utilisant null , mais ça me fait penser.


@ E-WOOD WOOD bien, certaines alternatives que je peux penser, ce serait: 1) Un autre Enum appelé REGIONSTOSEARCHFOR quels miroirs et ajoute tout à la fin, ou 2) A struct contenant une région et un indicateur indiquant s'il faut filtrer par cette région ou l'ignorer. Tu pensais que Null était mauvais? Essayez-en un! Peut-être que maintenant l'approche nulle ne sonne pas si mal après tout.