Je suis le cours Udemy ES6 Javascript: le guide complet du développeur
Stephen Grider
seul. Ce cours est ma première exposition à javascript. Il contient un exercice intéressant (pour moi) sur la détection des parenthèses équilibrées. J'ai écrit une fonction avec les fonctionnalités auxquelles je m'attendais, mais je n'ai pas utilisé de fonctions de grosse flèche. Je n'ai probablement pas utilisé d'autres fonctionnalités d'ECMAScript 6 que j'aurais pu utiliser. J'aimerais avoir des suggestions pour améliorer mon code.
function balancedParens(inputString){ const errMsg1 = 'ERROR: expression will NEVER be balanced'; const errMsg2 = 'ERROR: unbalanced!'; const successMsg = 'parens are balanced.'; const chars = inputString.split(""); let count = 0; for ( let i = 0; i < chars.length; ++i ) { if ( count < 0 ) { console.log(errMsg1); return false; } if ( chars[i] === "(" ) { ++count; } else if ( chars[i] === ")" ) { --count; } } if ( count < 0 ) { console.log(errMsg1); return false; } else if ( count == 0 ) { console.log(successMsg); return true; } else { console.log(errMsg2); return false; } } balancedParens("()()(i)"); //correctly returns true balancedParens("()()())"); //correctly returns false
Ma fonction détecte les parens qui ne peuvent jamais être équilibrées et se retire tôt, ce que l'exemple du cours n'a pas fait. Je souhaite conserver cette fonctionnalité au fur et à mesure que je refactore et améliore mon code.
Le cours recommande fortement de ne pas utiliser de boucles for, mais je ne pouvais pas penser à une meilleure façon d'implémenter mes fonctionnalités. Et je ne voyais pas comment l'utilisation de fonctions de grosse flèche améliorerait le code. J'attends donc avec impatience les suggestions et les commentaires.
4 Réponses :
Mon opinion personnelle est que les fonctions fléchées fonctionnent mieux lorsque vous n'avez pas à lier this au contexte de fonction actuel. À ce stade, cela n'a aucun sens pour vous, mais les fonctions de flèche n'ont pas leur propre mot-clé , ce qui signifie que la valeur de this sera pris en dehors de la portée lexicale de la fonction de flèche. Ils sont également bons pour les rappels (la même règle ci-dessus s'applique), également lorsque vous avez besoin d'écrire une expression courte, cela a l'air soigné. Tout dépend de vous, assurez-vous simplement de savoir comment ceci se comporte et tout ira bien.
Je pense que votre code est correct. C'est simple et facile à comprendre. Cependant, ce n'est certainement pas ce que les hipsters javascript actuels penseraient être cool ou quoi que ce soit.
Malheureusement, sans utiliser une structure de boucle traditionnelle comme une boucle for, vous ne pouvez pas sortir tôt lorsque les parens ne peuvent jamais être équilibrés. Donc, honnêtement, votre fonction est probablement plus efficace que ce qu'ils recherchent. Mais en général, les hipsters javascript ne se soucient pas vraiment de l'efficacité du code.
C'est peut-être plus ce qu'ils recherchent:
const balancedParens = inputString => // We don't need curly brackets here because we're doing everything // on one "line" and just returning inputString.split('') // Reduce is the substitute for your for loop here. // It iterates over each character and stores the return value in "sum" // on each iteration .reduce((sum, char) => { if (char === '(') return sum + 1; else if (char === ')') return sum - 1; else return sum; // This comparison makes the entire function return true if // our reduce resulted in zero, otherwise false }, 0) === 0; const logResult = result => result ? console.log('parens are balanced.') : console.log('ERROR: unbalanced!'); logResult(balancedParens('()()(i)')); logResult(balancedParens('()()())'));
Si vous n'êtes pas familier avec la fonction de réduction sur le tableau, vérifiez-la ici: https://developer.mozilla.org/ fr-FR / docs / Web / JavaScript / Reference / Global_Objects / Array / Reduce
C'est une fonction d'ordre supérieur (c'est-à-dire une fonction qui prend une fonction comme l'un de ses arguments). C'est un cas d'utilisation courant pour les grosses flèches simplement parce que la notation finit par être beaucoup plus laconique.
Remarque: je pourrais être sceptique quant à tout cours qui "déconseille fortement" les boucles. Mais peut-être qu'ils essaient simplement de vous amener à utiliser les nouvelles fonctionnalités JS.
Cet exercice faisait partie de la section sur Array.prototype.reduce (). Cependant, je ne l'ai pas utilisé à cause de ce que vous avez souligné - cela ne semblait pas être la solution la plus efficace. J'aime votre code javascript hipster, mais vos commentaires sur mon code m'ont également beaucoup aidé.
La fonction de réduction peut être utilisée pour parcourir la chaîne et renvoyer une valeur unique. réduire
Les fonctions fléchées sont utilisées pour la portée lexicale de ceci. Fonctions fléchées
Mise à niveau des fonctionnalités ES5 - lier, appeler et appliquer.
p >
const errMsg1 = 'ERROR: expression will NEVER be balanced'; const errMsg2 = 'ERROR: unbalanced!'; const successMsg = 'parens are balanced.'; balancedParanthesis = (string) => { return string.split("").reduce((count, char) => { //returns boolean expression if(count < 0 ){return count;} else if(char === '('){++count;} else if(char === ')'){ --count;} return count; },0) } let count = balancedParanthesis("()()"); //let count = balancedParanthesis("((())"); //let count = balancedParanthesis(")((())"); if ( count < 0 ) { console.log(errMsg1); } else if ( count == 0 ) { console.log(successMsg); } else { console.log(errMsg2); }
Merci. La 3e instruction if (pour vérifier le bon parent) ne devrait-elle pas être une autre if à la place?
@BugBuddy Je pensais que les déclarations étaient indépendantes les unes des autres. Mais nous n'avons besoin que d'eux pour s'exécuter, donc if-else peut être utilisé. Avoir mis à jour le code
Je ne suis pas sûr du contexte, mais il n'y a aucune raison de croire que les boucles for sont intrinsèquement mauvaises. Vous voudrez peut-être être conscient de l'impact sur les performances de l'imbrication des boucles for, mais les boucles for classiques sont assez souvent utilisées et il n'y a aucune raison de ne pas les utiliser.
En ce qui concerne les fonctions fléchées, dans votre cas, les avantages pourraient être que votre code est plus concis et plus facile à lire. Les fonctions fléchées ne sont qu'une manière abrégée d'écrire des fonctions. Le plus souvent, la lisibilité est plus importante que les améliorations de performances minces que vous pouvez ou non obtenir en utilisant les fonctions fléchées, les flux et les fonctionnalités de programmation fonctionnelle fournies dans ES6.
Pour votre cas, il peut être intéressant d'utiliser certaines fonctions fléchées pour rendre votre code plus concis. Vous pouvez donc remplacer la boucle for en diffusant le tableau char et en utilisant .forEach
.
De manière générale, vous voulez éviter de mélanger console.logs avec votre logique à moins que vous ne débogiez. Il serait donc probablement plus agréable d'avoir une fonction de journalisation séparée ou de consigner vos résultats au niveau supérieur du programme (dans ce cas, où vous appelez la fonction)