Se débarrasser de laide si les déclarations
J'ai ce vilain code:
if ( v > 10 ) size = 6;
if ( v > 22 ) size = 5;
if ( v > 51 ) size = 4;
if ( v > 68 ) size = 3;
if ( v > 117 ) size = 2;
if ( v > 145 ) size = 1;
return size;
Comment puis-je me débarrasser de plusieurs instructions if?
- Avez-vous vraiment dire, 5 et 6 pour être dans cet ordre?
- Non, je n'ai pas, mon erreur.
- FWIW, je ne pense pas que c'est particulièrement laid. Il est facile de voir ce qui se passe, il est facile d'ajouter en plus de cas, c'est clair. La seule chose que j'avais envisager de le faire est d'ajouter une liste où les valeurs sont stockées, mais à part ça, je n'ai pas de problème avec ça.
- Toutes ces réponses et aucun on a choisi un switch, qui est clairement plus adapté pour cela.
- Comment alors? Ce n'est pas une '==' comparaison.
- Ce code n'est pas laid! Un "amateur" solution ne fera que rendre votre code plus illisible et difficile à maintenir dans le futur.
- Je ne vois pas pourquoi un interrupteur de 145 cas est moins moche. Regardez de plus près, un
>
est utilisé comme équation, pas==
. - Donc, ce n'est que le code ne s'v <= 10?
- sans doute un cas de défaut?
- Vous ne mentionnez pas où vous avez besoin de ce type de code. Tous ces numéros de magie, je me demande où est-ce utilisé.
- Cette question est liée au quotidien WTF (donc beaucoup de points de vue): forums.thedailywtf.com/forums/p/20192/234306.aspx On a plus a suggéré un
switch
à l'intérieur d'unwhile
, qui n'a pas de réponse avant dans cette rubrique. Je ne sais pas si je l'aime plus que l'opérateur ternaire un. Il est également moins efficace. - le commutateur à l'intérieur du while est énorme, les frais généraux (ouais je sais, je devrais en parler). Le comparant est le chemin à parcourir, qui jamais vous le faites. Mais imaginez le gaspillage de cycles pour une boucle si le nombre où les plus éloignées.
- Pour ceux qui sont tentés de prendre la boucle-et-conception de commutateur au sérieux ... c'est une blague! C'est l'une des DailyWTF classique de gags, comme
enum BOOL { TRUE, FALSE, FILE_NOT_FOUND };
. (Ouais, je sais, expliquant la plaisanterie est boiteux. Mais je ne veux pas de maintenir le code de certains mauvais sap qui l'a pris au sérieux.) - IMO ce qui est laid sur le code est l'utilisation de numéros de magie / codé en dur constantes. Pour mes yeux, les multiples IFs ne sont pas un problème, ils sont simple, efficace et lisible, les valeurs des constantes qui sont illisibles...
- Cette question a suscité un assez grand nombre de créatrice des réponses qui sont toutes de mauvaises idées dans la vie réelle de la programmation...
- Donc, beaucoup de upvotes sur une réponse simple à une question simple, lorsque la dur de questions et de réponses, ne pas obtenir de upvoted que beaucoup. Est StackOverflow dysfonctionnel?
- Je vous remercie de votre commentaire, mais c'est le souhait et comme les autres ce qu'ils veulent faire.
- La LISIBILITÉ sur if..then..else construction en Java(!?) Cette question est l'exemple parfait d'un morceau de code à titre d'exemple et toujours gérer pour faire un non-constructif/controverse/offtopic. Si vous n'aimez pas if..then..else - faites votre propre DSL de développement, si vous ne savez pas sur l'existence de l'interrupteur ... je suppose - apprendre Java mots-clés. Je ne peut que l'aider par downvoting
- Donner une seconde pensée, cette question a sa propre façon de stimuler la créativité.. un très étrange et inhabituelle de l'effet (un codage concours sur mindless problème). Comment des tags à cette question "laid"?
Vous devez vous connecter pour publier un commentaire.
Ce qui est mieux pour votre cas.
En option, vous devez choisir l'Interrupteur Cas où la mesure du possible,
Update:
Si vous avez analysé la valeur de 'v' en général réside dans le bas de la fourchette(<10) dans la plupart des cas que vous pouvez ajouter ce.
further :
Vous pouvez également modifier la condition de la séquence, en fonction de votre analyse. Si vous savez que la plupart des valeurs sont inférieures à 10, puis, en second lieu, la plupart des valeurs se situent entre 68-117, vous pouvez modifier la condition de la séquence en conséquence.
Modifications:
readable
. Je ne dis pas qu'il est mieux vu de la performance, Il dépend de nombreux facteurs.size
variable.switch
mieux: vous pouvez faireswitch(true) {case size > 146: ... case size > 117: ...
v == 9
?size
est de retour 😀Comment une telle approche:
Fonctionnellement: (Démontré en Scala)
steps
sans se rendre compte de l'ordre est important. Alternativement, un tri inverse sursteps
avant la boucle pourrait fonctionner, trop.6
et pas1
à la fin si il n'y a pas de match (alors qu'il y a un bug dans la mise en œuvre originaleif v <= 10
)À l'aide de la
NavigableMap
API :HashMap
serait la meilleure solution si vous êtes à la fixer à l'aide de la carte seulement.HashMap
ne fonctionne pas ici.NavigableMap
permet de trouver le plus proche de clé (inférieure ou supérieure) pour une valeur donnée, ce qui est important dans notre cas.Le problème le plus évident avec l'OPs solution est de ramification, je vous suggère une régression polynomiale. Il en résultera une belle dépourvu de branches expression sur le formulaire
Vous bien sûr de ne pas obtenir un résultat exact, mais si vous pouvez tolérer de la déviance, c'est une très performant alternative. Depuis la " un congé non modifié le comportement de la fonction originale de valeurs où
v<10
est impossible de modèle avec un polynôme, j'ai pris la liberté d'en supposant un maintien d'ordre zéro interpolation pour cette région.Pour un 45-polynomiale de degré avec les coefficients suivants,
vous obtenez une belle courbe ajustée:
Et comme vous pouvez le voir, vous obtenez un 1-norme d'erreur de seulement de 1,73 à travers l'ensemble de la gamme de 0 à 200*!
*Les résultats de
v∉[0,200]
peut varier.if's
mais l'op déclaré que son code étaitugly
, et destiné à le rendre plus lisible...avez-vous fait croire que c'est plus joli...?if/else-if/else
construire a un problème avec la enchaînés ternaire?:
de l'opérateur. Ils sont parfaitement parallèles l'un à l'autre.?:
de manière cryptique. D'accord avec badp trop, ni l'OP du code ou de la accepté de répondre à face avec une valeur par défaut "autrement" cas.Le code d'origine semble bien pour moi, mais si vous n'avez pas l'esprit de plusieurs retours que vous pourriez vous préférez l'approche tabulaire:
Voir les multiples de retour ou pas de discussion dans org.life.java's réponse.
Il y a une tonne de réponses et suggestions ici, mais honnêtement, je ne vois pas l'un d'eux "plus joli" ou "élégante" que la méthode d'origine.
Si vous avez eu des dizaines ou des CENTAINES d'itérations pour vérifier que je pouvais facilement voir s'en aller de certains de boucle, mais honnêtement, pour la poignée de comparaisons que vous avez eu, le bâton avec les si de et de progresser. Il n'est pas laid.
(173-v) / 27
pour supprimer le-
. Il ne fonctionne pas pour les grands nombres, et à proximité de l'un des seuils. Mais intéressant...Voici ma chance...
Mise À Jour: Correction. Solution précédente a donné les réponses incorrectes pour les valeurs exactes (10,22,51...). Ce défaut de paiement d'un de 6 pour le si val < 10
binarySearch
. +1 pour l'utilisation de la~
opérateur surbinarySearch
résultat, je n'ai jamais pensé à ce sujet. Remarque : vous pouvez vous débarrasser de lasize
tableau, il n'est pas 5,6 mais de 6,5.Je n'ai plus de version pour vous. Je ne pense pas vraiment que c'est le meilleur, car cela ajoute à la complexité inutile, au nom de la "performance" quand je suis 100% sûr que cette fonction ne sera jamais un rendement de porc (à moins que quelqu'un est le calcul de la taille dans une boucle serrée, un million de fois ...).
Mais je présente ce tout simplement parce que j'ai pensé que l'exécution d'un hard-codé binaire de recherche à d'intéressants. Il n'a pas l'air très binaire-y, car il n'y a pas assez d'éléments pour aller plus en profondeur, mais il a le mérite de il renvoie un résultat en moins de 3 tests au lieu de 6 comme dans le post original. Le retour des déclarations sont également dans l'ordre par la taille, ce qui contribuerait à la compréhension et/ou de modification.
où
7
est la valeur par défaut (x <= 10
).Edit: au départ, je ne savais pas que cette question est au sujet de Java. Cette expression n'est pas valide en Java, mais qu'il est valide en C/C++. Je vais laisser la réponse, car certains utilisateurs ont trouvé très utile.
Mon commentant capacité n'est pas encore, espérons que personne ne va dire "à juste titre" basé sur de ma réponse...
Jolie-ing le laid code pourrait/devrait être défini comme essayer de réaliser:
De l'OMI, la réponse donnée par org.life.java était la plus jolie et très facile à lire. J'ai bien aimé aussi l'ordre dans lequel les conditions ont été écrits, pour des raisons de lecture et de performance.
Regardant par-dessus tous les commentaires sur ce sujet, au moment de mon écriture, il semble que seule org.life.java soulevé la question de la performance (et peut-être mfloryan, trop, indiquant quelque chose "de plus"). Certainement, dans la plupart des situations, et compte tenu de cet exemple, il ne devrait pas porter un ralentissement notable toutefois vous l'écrivez.
Cependant, en regroupant vos conditions et de manière optimale la commande les conditions peuvent améliorer les performances [utile, en particulier si cette boucle].
Tout cela étant dit, la nidification et des conditions de commande (qui sont plus complexes que l'exemple) apportées par la détermination de réaliser aussi vite que possible l'exécution sera souvent moins lisible le code, et le code qui est plus difficile à changer. Je me réfère de nouveau à #3, pragmatisme... en équilibrant les besoins.
Ici est un objet-orienté solution, une classe appelée
Mapper<S,T>
que les cartes de valeurs à partir de n'importe quel type qui implémente comparable à n'importe quel type de cible.Syntaxe:
Code:
Edit: finalement remplacé la méthode map() avec un plus efficace (et plus court) version. Je sais: une version qui recherche les partitions serait encore plus rapide pour les grands tableaux, mais je suis désolé: je suis trop paresseux.
Si vous pensez que c'est trop lourd, pensez à ceci:
Sûr, tous ces éléments peuvent être facilement enlevés, mais le code sera moins complet, moins utilisable ou moins stable.
if
états avec 54 lignes de Java (sans compter le code à fait utilisation cette chose). D'ailleurs, quand était orientée objet en soi un avantage?java.util.*
votre code ne compile sur cette ligne dans le constructeur pour Mapper:final U[] copy = Arrays.copyOf(source, source.length);
Mapper<Integer, Integer> map = Mapper.from(145, 117, 68, 51, 22, 10).to(1, 2, 3, 4, 5, 6); System.out.println(map.mapAll(Arrays.asList(11, 23, 52, 69, 118, 146)));
retourne[1, 2, 3, 4, 5, 6]
où je m'attends à tout à fait le contraire. Ce serait beaucoup plus facile de repérer et de corriger dans une chaîne de if.Mapper.descending().from(..).to(..)
, mais je préfère trier mes données d'entrée, comme c'est la plus intuitive de la façon de faire les choses.if (v > 145) /* ... */; else if (v > 117) /* ... */
), depuis l'instruction if est au moins souple.~sourceOffset
. s'il vous plaît, modifier, c'est un beau morceau de codeEst-il mathématique sous-jacente à cette règle? Si donc vous devriez l'utiliser: mais seulement si elle vient du domaine du problème, et pas seulement une formule qui arrive à s'adapter à la cas.
Vous pourrait le réécrire dans les BRAS de code. C'est seulement 7 cycles pire des cas et un mince 164 octets. Espérons que cela aide. (note: ce n'est pas testée)
En réalité, si les tailles sont susceptibles de changer, de le faire dans la base de données pourrait être une bonne stratégie de rechange:
Et une procédure stockée ou une fonction:
Juste pour être complet, permettez-moi de suggérer que vous pourriez mettre en place un tableau des TAILLES avec 145 éléments de la réponse pourrait être retournés directement de taille[v]. Pardonnez-moi de ne pas écrire l'ensemble de la chose. Vous devez assurez-vous que v était à portée, bien sûr.
La seule raison pour laquelle je peux penser pour le faire de cette façon serait si vous étiez sur le point de créer le tableau une fois et d'utiliser des milliers de fois dans une application qui a dû être très rapide. Je le mentionne comme un exemple de compromis entre la mémoire et de la vitesse (pas le problème, il était une fois), et aussi entre le temps de configuration et la vitesse.
La réponse évidente est d'utiliser Groovy:
Un doublures sont toujours mieux. Retourne 7 pour l'indéfini cas où v <= 10.
pourquoi quelqu'un n'ont pas suggéré d'instruction switch. il est de loin meilleure que si d'autre échelle.
C'est mon exemple de code, à l'aide de SortedSet. Vous définissez les limites une fois.
Puis l'utiliser par la suite cette façon, pour plusieurs valeurs de v (et initialisées à la taille)
SortedSet<Integer>
, pasSortedSet<int>
. En outre, cette approche a déjà été prises de manière plus efficace à l'aide deNavigableMap.lowerEntry()
ici: stackoverflow.com/questions/3786358/...Il est intéressant de noter qu'il y a plein de belles réponses pour un simple "laid" question. J'aime mfloryan la réponse de meilleur, mais je voudrais pousser plus loin en supprimant les codée en dur de tableau à l'intérieur de la méthode. Quelque chose comme,
Il devient maintenant de plus flexibles et permettent de traiter tout tableau donné dans l'ordre décroissant, et la méthode trouverez l'index où la valeur " v " appartient.
PS. Je ne peux pas encore de commentaires sur les réponses.
Si vous voulez vraiment le plus rapide big-O de la complexité en temps de la solution pour ce type particulier de répondre à cette question est en constante recherche.
par la suite
Ce que nous faisons ici, c'est le marquage de tous les résultats possibles de v dans la gamme et l'endroit où elles tombent, et puis nous avons seulement besoin de test pour des conditions aux limites.
Le problème, c'est qu'il utilise plus de mémoire et bien sûr, si maxBoundary est beaucoup plus grande qu'il sera très inefficace de l'espace (ainsi que prendre plus de temps pour initialiser).
Cela peut parfois être la meilleure solution pour la situation.
Exécute le nécessaire si les déclarations seulement.
Encore une autre variation de la (moins prononcée que celle de la réponse par George)