Je veux valider un objet qui possède trois propriétés booléennes, dont une, et une seule, doit être vraie. Quelle est la meilleure façon de vérifier cela ?
J'ai trouvé ça :
var t1 = obj.isFirst ? 1 : 0,
t2 = obj.isSecond ? 1 : 0,
t3 = obj.isThird ? 1 : 0;
var valid = (t1 + t2 + t3) === 1;
Cela fonctionne bien, mais cela ressemble un peu à une solution d'amateur :-)
Y a-t-il une meilleure façon de procéder ? En utilisant XOR (^) par exemple ?
5 votes
obj.isFirst + obj.isSecond + obj.isThird === 1
en supposant qu'il est certain qu'il s'agit de booléens et non de quelque chose de différent. Vous pouvez ajouter une conversion explicite si vous le souhaitez (par ex.Number(obj.isFirst)
), mais javascript convertit aussi implicitement.0 votes
En rapport : Pourquoi n'y a-t-il pas de xor logique en JavaScript ? dont les réponses comprennent des alternatives.
11 votes
Ressemble un peu à une solution de bricoleur, je peux vous assurer que les pros écrire un code qui ressemble exactement à ça. Arrêtez de vous préoccuper de l'apparence de votre code, personne ne le regardera, assurez-vous que le compilateur peut le lire et qu'il fait ce qu'il doit faire.
1 votes
@ASDFGerte Je ne savais pas qu'on pouvait additionner des booléens comme ça, ça va rendre mon code un peu plus propre. Je vais utiliser ce
6 votes
@Michiel en tant que personne qui pourrait potentiellement avoir à venir maintenir le code que vous écrivez, s'il vous plaît ne faites pas cela. Cela ne fait rien d'autre que de rendre votre code plus difficile à lire et à maintenir à l'avenir et n'offre aucun avantage.
2 votes
Les programmeurs perdent énormément de temps à penser ou à s'inquiéter de la vitesse des parties non critiques de leurs programmes, et ces tentatives d'efficacité ont en fait un impact négatif important lorsque le débogage et la maintenance sont pris en compte. Nous devrions oublier les petits gains d'efficacité, disons environ 97% du temps : l'optimisation prématurée est la racine de tous les maux. Pourtant, nous ne devrions pas laisser passer nos chances dans ces 3 % critiques. comme écrit par un lauréat du prix Turing. Il n'y a vraiment rien à optimiser ici.
0 votes
Avec le recul, j'ai de petites réserves sur mon commentaire posté. Bien que la conversion de true/false en 1/0 existe depuis longtemps (au moins au début du C), les conversions implicites doivent généralement être évitées. De plus, ce n'est toujours pas ce que je considérerais comme instantanément clair à la lecture. Cependant, bien que la réponse de bambam soit légèrement meilleure (pas de conversions implicites et peut-être un peu plus facile à lire), je ne la regarde toujours pas en pensant "c'est ça !". Peut-être que c'est aussi bien que cela, sans écrire une fonction pour cela qui a un nom descriptif, ou un commentaire.
4 votes
@Liam cette citation fait référence aux personnes qui se préoccupent du temps d'exécution. Elle n'est pas applicable ici, car cette question porte sur la lisibilité, l'évitement des erreurs (en étant plus évident, plus facile à lire) et la facilité de remaniement.
4 votes
Juste une note, pas une réponse : Je pense que c'est un mauvais modèle. C'est mieux d'avoir :
obj.position = (1|2|3)
0 votes
Si vous ne pouvez avoir qu'une seule position, alors vous devez stocker la position à la place.
0 votes
Je pense que votre implémentation actuelle est la plus lisible/maintenable/extensible.