web-dev-qa-db-fra.com

Quand l'évaluation des courts-circuits est-elle mauvaise?

Pour être un peu plus clair, je dirai que j'ai passé beaucoup de temps avec différentes langues. Mais jusqu'à présent, il a été soit utilisé tout le temps, soit il ne le prend pas du tout en charge.

Maintenant, le travail me fait commencer sur des projets qui nécessitent VB.net et je vois qu'il offre les deux sens en termes de ET et ET ÉGALEMENT . Le premier ne court-circuite pas et le second le fait.

Cela m'amène donc à me demander pourquoi? Comme le configurer comme celui-ci semble impliquer qu'il arriverait assez souvent que l'on veuille changer de mode. Mais je ne peux penser à aucune situation où ce serait une mauvaise chose à utiliser Court-circuit .

Je sais que cela pourrait très bien devenir plus une option, donc si j'ai besoin de mettre cela à un autre endroit, dites-moi simplement où.

Bien que j'espère qu'il y ait au moins une réponse officielle, à savoir pourquoi avoir les deux options serait mieux que de toujours faire Court-circuit , quand il est disponible.

12
Kit Ramos

Certains termes d'une expression logique peuvent avoir des effets secondaires. Il est parfois nécessaire de s'assurer que tous les effets secondaires se produisent dans l'ordre indiqué, et aucun n'est ignoré et c'est le résultat de l'évaluation qui guide la logique:

if not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

Dans d'autres cas, vous ne souhaitez évaluer aucun des termes restants si une évaluation antérieure renvoie faux.

if IsAirborne() and not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

Certains vont/ont fait valoir que s'appuyer sur le comportement de court-circuit dans le deuxième exemple est une mauvaise forme, mais cela entre dans le style de codage et les systèmes de croyance. Il existe de très bons morceaux de code dans le monde qui dépendent de presque toutes les fonctionnalités d'un langage, et c'est exactement ainsi.

ANDALSO de VB est net et semble être une tentative de rendre la pratique plus acceptable.

Comme JimmyJames le souligne dans sa réponse, il peut y avoir des implications mesurables en termes de performances autour de l'évaluation des courts-circuits. Les langages qui ne fournissent pas le mécanisme évaluent toujours chaque terme de l'expression, tandis que ceux qui le fournissent peuvent générer des instructions de branche supplémentaires. Quoi qu'il en soit, cela dépend beaucoup du nombre d'étapes de traitement nécessaires pour évaluer chacun des termes et également des architectures du compilateur et du processeur. Normalement, vous ne vous souciez pas de ces choses jusqu'à ce que vous ayez un goulot d'étranglement mesuré dans le code et que vous deviez trouver un moyen de le réduire. Toute règle de faire ou de ne pas autoriser l'évaluation de court-circuit dans votre code aurait à peu près la même chance de ralentir le code et d'optimiser tôt peut être une perte de temps totale, alors mesurez toujours, puis optimisez.

5
jwdonahue

Apparemment, votre question n'est pas de savoir si les courts-circuits sont bons ou mauvais en général, mais pourquoi VB.NET fournit des opérateurs avec et sans. Dans cet esprit, la réponse à

quand l'évaluation des courts-circuits est-elle mauvaise?

est tout simplement: quand il viole la compatibilité descendante .

Ok, maintenant vous pouvez dire que VB.NET n'est pas très rétrocompatible avec les anciens VB6 ou VBA, mais au moins certaines parties du langage le sont. La décision de Microsoft de conserver l'ancien ET et OR sémantique (sans court-circuitage) a rendu une énorme catégorie d'erreurs moins susceptible de se produire lors du portage d'anciens programmes VB à VB.NET.

D'un autre côté, les concepteurs du langage VB.NET ont probablement partagé votre opinion sur le fait que le court-circuit était une bonne chose. Si je me souviens bien, les premières versions préliminaires de VB.NET ont fourni ET ou OR opérateurs avec court-circuit, mais les commentaires des développeurs ont dû être si mauvais que MS retire cette décision avant VB.NET La version 1.0 est apparue. Les concepteurs ont donc décidé de l'implémenter en termes de nouveaux mots clés ANDALSO et ORELSE comme compromis entre la compatibilité descendante et l'utilité.

À mon humble avis, c'était une bonne décision. J'ai dû porter plusieurs programmes plus anciens au cours de la dernière décennie, et ne pas avoir à effectuer une analyse d'impact lourde pour chaque expression logique, y compris AND et/ou OR (jeu de mots voulu) a rendu cette tâche beaucoup plus facile et plus économique. D'un autre côté, chaque fois que je dois écrire une nouvelle expression logique dans VB.NET, mon choix par défaut pour les opérateurs sont les formes de court-circuit, c'est ce à quoi je suis habitué en C, C++, C # etc. , et cela me permet d'écrire plusieurs idiomes sous une forme plus concise (même si ANDALSO a besoin de 4 caractères de plus pour taper).

Si vous n'êtes pas convaincu, je vous recommande de lire le grand article de Joel Spolsky sur Casques Martiens , ce qui explique pourquoi les premières décisions de conception dans le développement de logiciels ne peuvent pas être facilement révoquées après que le composant ou le langage ou l'API en jeu a atteint une base d'utilisateurs d'une certaine taille.

20
Doc Brown

ils deviennent mauvais, dès que vous commencez à compter sur les effets secondaires des expressions que vous attendez à exécuter dans l'évaluation d'un résultat global booléen.

.

3

Avertissement: C'est un peu ésotérique dans la mesure où dans presque tous les cas, les développeurs ne devraient pas s'en inquiéter. Mais ... il peut y avoir un impact sur les performances en raison de l'évaluation conditionnelle car elle crée une ramification lors de l'exécution. Un fonctionnement sans court-circuit ne se ramifie pas et est plus prévisible.

La raison pour laquelle cela importe rarement est que le coût est généralement faible et également généralement compensé par le coût de l'évaluation de la deuxième (ou troisième, etc.) condition. Cela n'aura jamais d'importance que dans les routines de calcul coûteux lorsque des performances élevées sont requises et cela pourrait ne pas avoir d'importance non plus.

1
JimmyJames

Pascal n'a pas défini si AND et OR utilisent ou non l'évaluation de court-circuit, vous offrant le pire des deux mondes.

C et C++ ont des opérations au niveau du bit & et | ce qui en pratique vous donne des opérations sans court-circuit. Et les compilateurs sont libres d'évaluer comme bon leur semble si cela ne fait pas de différence observable.

0
gnasher729