2 votes

Comment améliorer mon code (Connecter les arguments dans les fonctions) - Beginner in JavaScript

Je commence à apprendre à coder et j'ai créé un programme simple pour évaluer les tests.

Le problème est que je dois modifier quatre arguments pour chaque "test" afin que le code fonctionne correctement. Que puis-je changer pour que je n'aie à en changer que deux ?

J'espère m'être expliqué, l'anglais n'est pas ma première langue. Et désolé pour le titre non descriptif mais je ne savais pas comment le formuler.

function score (pointsObt, pointsTest) {
    return 100 / pointsTest * pointsObt;
};

function verdict (pointsObt, pointsTest){
  if (score (pointsObt, pointsTest) >= 75) {
    return 'Yay, you did it'
  }
  else {
    return "You did it! But bad."
  }
};

console.log (verdict(50, 50));
console.log ('Your score: ' + score(50, 50));

2voto

trincot Points 10112

Vous pouvez faire le verdict renvoie à la fois le score et le verdict dans une seule structure de données. Il peut s'agir d'un tableau avec deux valeurs ou d'un objet simple avec deux propriétés. Voici comment cette dernière idée pourrait fonctionner :

function score (pointsObt, pointsTest) {
    return 100 / pointsTest * pointsObt;
};

function verdict (pointsObt, pointsTest) {
  let percentage = score (pointsObt, pointsTest);
  let message = percentage >= 75 ? "Yay, you did it" : "You did it! But bad.";
  return { percentage, message };
};

let { percentage, message } = verdict(50, 50);
console.log (message);
console.log ('Your score: ' + percentage);

Explication

J'ai changé le if...else à une expression qui utilise la construction opérateur ternaire ( ? y : ). De cette façon, vous pouvez effectuer une seule mission tout en faisant la distinction entre les deux résultats.

Dans le return un nouvel objet est créé avec deux propriétés qui correspondent exactement à ce que les variables portant les mêmes noms ont comme valeurs (c'est un objet de type notation littérale des objets courts introduite dans EcmaScript 2015)

L'appelant dans le code principal peut obtenir cet objet à partir de l'appel. J'ai utilisé un affectation destructrice pour extraire immédiatement les deux propriétés de l'objet retourné dans deux variables ayant les mêmes noms que les propriétés de l'objet.

Avantages

Dans votre mise en œuvre, non seulement vous fournissez deux fois les mêmes arguments, mais - ce qui est peut-être plus important - vous calculez deux fois le même score. Dans la solution proposée, score n'est plus appelé deux fois, mais une seule fois.

1voto

Hendermarkson Points 166

Vous pourriez utiliser une variable pour que cela fonctionne

function score (pointsObt, pointsTest) {
    return 100 / pointsTest * pointsObt;
};

function verdict (pointsObt, pointsTest){
  if (score (pointsObt, pointsTest) >= 75) {
    return 'Yay, you did it'
  }
  else {
    return "You did it! But bad."
  }
};

var pointsObt= 50;
var pointsTest= 50;

console.log (verdict(pointsObt, pointsTest));
console.log ('Your score: ' + score(pointsObt, pointsTest));

1voto

Always Helping Points 13526

Vous pouvez faire tout cela avec une seule fonction. Pas besoin d'avoir une autre fonction score avec un retour de celui-ci.

One vous donnera les deux le score et le verdict séparément.

Utilisation d'une seule fonction avec score et verdict

//Global vars
let percScore; //Score will be stored here
let myNumber = 50; //Change this number only to see different verdict and and score

function verdict(pointsObt, pointsTest) {
  //Score
  percScore = 100 / pointsObt * pointsTest
  //Verdict
  if (percScore >= 75) {
    return 'Yay, you did it'
  } else {
    return "You did it! But bad."
  }
};

console.log(verdict(myNumber, myNumber));
console.log('Your score: ' + percScore);

Utilisation d'une variable globale avec des fonctions distinctes avec score et verdict séparément.

Détails

Il suffit de changer le myNumber global var et vous verrez le score et le verdict changer également. En savoir plus sur les variables globales aquí

let myNumber = 50; //Change this number only to see different verdict and and score

function score(pointsObt, pointsTest) {
  return 100 / pointsTest * pointsObt;
};

function verdict(pointsObt, pointsTest) {
  if (100 / pointsObt * pointsTest >= 75) {
    return 'Yay, you did it'
  } else {
    return "You did it! But bad."
  }
};

console.log(verdict(myNumber, myNumber));
console.log('Your score: ' + score(myNumber, myNumber));

1voto

Tigger Points 1904

Vous avez raison, cela peut être beaucoup simplifié.

Ce n'est qu'une option.

// Merge the two functions
function verdict(pointsObt, pointsTest){
  // Get the score (well, percentage) 
  var score = (100 / pointsTest * pointsObt);
  // Use a ternary as there are only the two options to
  // work out what to print.
  var msg = (score >= 75) ? "Yay, you did it" : "You did it! But bad." ;
  // Only a single console.log() call is needed if you
  // use a \n (new line) at the correct point
  console.log(msg+"\nYour score: "+score+"%");
};

// Call 3 different results.
verdict(50, 50);
verdict(5, 50);
verdict(40, 50);

// You could even do this. Drop all the results in to
// an array, then loop the array. Assuming all results
// are out of a max of 50.
var results = [45,35,26,48];
results.forEach(r => verdict(r,50));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X