Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesSalut tout le monde,
une petite question théorique ici. J'écris actuellement un tutoriel sur les scripts JSL pour mes collègues et j'essaie donc de m'assurer de bien comprendre le fonctionnement de JSL.
J'ai lu une fois sur un forum que vous devriez toujours utiliser une instruction 'Else' dans une boucle 'If', même si cela impliquait d'ajouter Empty() comme instruction 'Else'.
Pour voir la différence, j'ai essayé de jouer avec l'éditeur de script :
y=if(1>2, 1);
z= if (1>2, 1 , Empty());
Show (y);
Show (z);
Show (Is Missing (y) );
Show (Is Missing (z) );
Show (Is Empty (y) );
Show (Is Empty (z) );
x= If (y==z, "true", "false");
Show (x); <BR /><BR />// results :<BR />y = .;<BR />z = Empty();<BR />Is Missing(y) = 1;<BR />Is Missing(z) = 1;<BR />Is Empty(y) = 0;<BR />Is Empty(z) = 1;<BR />x = .;
Ainsi, la valeur Empty() est à la fois une valeur manquante et une valeur vide mais '.' est manquant mais pas vide. Quelle différence cela fait-il ? Étant donné qu'ils renvoient tous les deux une valeur manquante lorsqu'ils sont utilisés dans des opérateurs de comparaison, pourquoi devrais-je m'embêter à utiliser Empty() comme instruction 'Else' ?
Cela illustre également le fait que lorsque la condition testée dans l'instruction if renvoie manquante, elle n'est ni vraie ni fausse, donc la boucle ne renvoie aucune des deux instructions, ce qui est toujours bon à garder à l'esprit !
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesFWIW Je n'utilise jamais une instruction ELSE si je n'ai pas de condition ELSE.Maintient mon code simple et serré.Je suis conscient que if() est une fonction et je sais comment l'utiliser en tant que telle.C'est peut-être un vestige d'autres langues que j'ai utilisées.
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesJe conviens que la programmation informatique en général et les scripts JMP en particulier sont des sujets sérieux. Enregistrer des scripts et pirater ensemble des scripts écrits par d'autres ne vous mènera que très loin. La confusion et la frustration en résultent généralement.
Je suis désolé que notre formation ne soit pas une option. Notre cours d'introduction est mature (environ deux décennies) et bien reçu. Je ne connais aucune autre formation pour JSL, gratuite ou payante. Il peut y avoir des vidéos gratuites qui couvrent des sujets spécifiques, mais je doute qu'elles véhiculent l'état d'esprit. Ils sont généralement de style « comment faire » ou « livre de cuisine ».
Peut-être qu'un autre membre de la communauté connaît une formation qui vous conviendrait.
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesEh bien, je ne veux certainement pas restreindre ma créativité en ayant un état d'esprit limitatif. Je suppose que je manque probablement de formation dans ce domaine. J'ai commencé à écrire des scripts en JSL il y a quelques mois, principalement en itérant sur des scripts existants et en consultant l'index des scripts et le pdf du guide des scripts. Maintenant, je pense que j'ai besoin de quelque chose d'un peu plus sérieux si je veux libérer le potentiel de JSL.
Connaissez-vous des ressources en ligne (gratuites) pour Apprendre JSL ? Je sais que cela peut être une question délicate car vous êtes un membre du personnel et votre entreprise propose des cours payants, mais actuellement ce n'est pas une option pour moi.
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesVous posez de grandes questions.
Mon point de base est que, comme pour tout langage de programmation informatique, la syntaxe et les idiomes JSL sont nos amis, mais nous n'en sommes pas les esclaves. Ma question, "Qu'attendez-vous?" visait uniquement à souligner que nous avons besoin de la réponse à cette question chaque fois que nous écrivons ou modifions du code. Une réponse claire fait toute la différence pour notre code.
Oui, les fonctions sont un élément clé pour écrire des scripts. Par définition, chaque fonction renvoie un résultat. Mais nous sommes parfois plus intéressés par un effet secondaire de la fonction que par le résultat renvoyé. Par exemple, la fonction V List Box() renvoie une référence à l'objet de zone d'affichage qu'elle crée. Je pourrais être plus intéressé par la boîte elle-même (l'effet secondaire) que par la référence.
De nombreux scripteurs novices pensent que If() et For() sont des instructions ou des commandes. Ce sont des fonctions. L'état d'esprit de déclaration peut limiter votre créativité. L'état d'esprit est important. Le script suivant montre deux approches pour accomplir la même chose, mais la seconde approche ne viendrait jamais à l'esprit de quelqu'un avec un état d'esprit énoncé.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
mean weight = Col Mean( dt:weight );
// assign within the If() function call
dt << New Column( "Condition 1", Numeric, Continuous );
For Each Row(
If( :weight < mean weight, dt:Condition 1 = -1, dt:Condition 1 = 1 );
);
// assign with the returned result from the If() function call
dt << New Column( "Condition 2", Numeric, Continuous );
For Each Row(
dt:Condition 2 = If( :weight < mean weight, -1, 1 );
);
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesBonjour Marc Bailey,
Merci pour ces éclairages
en effet, je pensais que c'était bizarre d'avoir à utiliser Empty() comme une autre instruction. J'ai essayé de chercher le post qui mentionnait cette pratique mais je ne le trouve plus, donc je ne peux pas demander à l'utilisateur pourquoi il pense que c'est utile.
En réponse à votre question : Qu'essayez-vous de faire avec la fonction conditionnelle If() ? Qu'attendez-vous qu'il revienne ?
Eh bien, il est facile d'oublier que JSL est un langage basé sur des fonctions et que les fonctions renvoient des valeurs. Donc, généralement, je n'utilise pas vraiment ce que renvoie l'instruction If. Je n'explorais cela que comme un moyen de comprendre les principes fondamentaux de JSL. En pratique, je me demande, quelle est l'utilité d'utiliser les valeurs renvoyées à partir d'une instruction If ?
Tout ce à quoi je peux penser, c'est de gagner de la place dans un script ou de le rendre un peu plus rapide. Mais j'ai l'impression que si j'essayais d'être intelligent de cette façon, cela reviendrait me hanter plus tard et générerait des erreurs/bogues.
Quel est ton opinion là-dessus ?
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesLa façon dont j'utilise Is Empty() consiste à voir si une variable a déjà été affectée.Évitant ainsi une erreur de syntaxe pour :
names default to here(1);
show(z);
on peut vérifier si la variable "z" a déjà été référencée :
Names Default To Here( 1 );
If( Is Empty( z ) == 0,
Show( z )
);
Un meilleur exemple est celui ci-dessous.
Names Default To Here( 1 );
x=1;
If( x > 2, z = 7 );
If( Is Empty( z ) == 0,
Show( z )
);
Puisque JSL est un langage interprété, il suit le flux logique du JSL Donc, si x <= 2, JSL n'exécutera pas (ne regardera même pas) z = 7, et donc sans la vérification pour voir si z est vide () est nécessaire car JSL donnerait une erreur de syntaxe.
Dans votre exemple, vous utilisez une autre forme d'attribution de la valeur à z
names default to here(1);
z=(if(1>2, 7));
show(z);
La variable z prendra la valeur 7 si 1>2, mais si elle n'est pas vraie, z n'est plus assignée, donc elle prendra une valeur manquante, ".".L'avantage ici est qu'une fois l'affectation effectuée, JSL a traité la variable z et n'aura pas d'erreur de syntaxe si z est référencé plus tard dans le déroulement du programme.
Cela nous amène à la question de savoir si l'on doit affecter Empty() à la suite d'un retour de false dans une fonction If().
names default to here(1);
z=(if(1>2, 7, Empty()));
show(z);
Cela se résume alors simplement à, ne voulez-vous pas avoir z comme valeur manquante et préférez-vous vérifier Is Empty () vs Is Missing () .Personnellement, je préfère la route de la valeur manquante, car elle laisse Empty () comme vérification que z n'a jamais été attribué. .
Re : Pourquoi toujours utiliser une instruction else et la différence fondamentale entre les valeurs vides et manquantesJ'écris depuis plus longtemps que la plupart des gens (1998). Je suis auteur et enseigne tous nos cours de scénarisation. Je ne suis pas au courant d'une "meilleure pratique" qui recommande de toujours inclure un argument pour la condition "autre" ou d'utiliser vide dans les cas où il n'y a pas de valeur de retour spécifique. Je ne l'ai certainement jamais manqué ou payé pour ne pas l'utiliser. Je pense que cette question est un autre cas de "ça dépend". Qu'essayez-vous de faire avec le conditionnel Si() fonction? Qu'attendez-vous qu'il revienne ?
La valeur de retour par défaut du Si() la fonction est manquant lorsque le premier argument est évalué à faux et qu'il n'y a que deux arguments. Vous avez démontré ce comportement avec la valeur stockée dans y . Le Si() fonction s'est comportée comme telle depuis que JSL a été introduit pour la première fois dans JMP 4 en 2000.
Vous pouvez fournir un troisième argument au Si() fonction qui est évaluée et renvoyée lorsque le premier argument est évalué comme faux. Vous avez démontré ce comportement avec la valeur stockée dans z où vous avez fourni le Vide() fonctionnent comme le troisième argument.
Manquant représente une valeur inconnue. Il représente le plus souvent des valeurs de données inconnues ou le résultat de l'évaluation d'une expression numérique impossible telle que Log( -1 ). je pense que manquant a beaucoup de sens en tant que valeur de retour par défaut pour une condition qui n'est pas représentée par un argument.
Vide est juste cela. Il représente l'état où il n'y a rien. Par exemple, si vous appelez Tableau de données actuel() sans argument lorsqu'aucune table de données n'est ouverte, il renvoie vide .