Défi
Nous souhaitons créer un réseau social en JavaScript. Chaque membre du réseau est représenté par un pseudo (chaîne de caractère).
Voici un programme que nous allons factoriser pas à pas :
const friendList = []
let addFriendChoice = true
console.log('Ajoutons un premier ami')
while (addFriendChoice) {
const pseudoFriend = prompt('Quel est son pseudo ?')
friendList.push(pseudoFriend)
addFriendChoice = prompt('Souhaitez-vous ajouter un autre ami? O ou N?') === 'O'
}
console.log('Retirons un ami de votre liste')
const friendToRemove = prompt('Quel est son nom?')
// A compléter
console.log("Voici votre liste d'amis:", friendList)
Question
Compléter le code afin de supprimer l'ami demandé, s'il existe.
Indice
Il suffit de parcourir la liste d'amis et de supprimer l'ami correspondant. On ne retournera pas d'erreur si la personne n'est pas trouvée.
Indice
Pour supprimer le i-ème élément d'une liste, il faut utiliser l'instruction suivante :
friendList.splice(i, 1)
Indice
Une fois l'ami trouvé et supprimé, il n'est plus nécessaire de continuer la recherche. L'instruction break
permet de sortir d'une boucle.
Solution
for (let i = 0; i < friendList.length; i++) {
if (friendToRemove === friendList[i]) {
friendList.splice(i, 1)
break
}
}
Maintenant que notre programme est complet, nous allons le modulariser.
Question
Proposer une fonction qui se chargera d'ajouter un ami. Elle prendra comme paramètre la liste d'amis et retournera la nouvelle version de la liste d'amis suite à l'ajout. La fonction s'appellera addFriend
.
Indice
Le corps de la fonction sera sensiblement similaire au code existant pour ajouter un ami. Il comportera en plus une instruction return
.
Solution
function addFriend (friends) {
const pseudoFriend = prompt('Quel est son pseudo ?')
friends.push(pseudoFriend)
return friends
}
Question
Faire de même pour retirer un ami et on nommera la fonction removeFriend
.
Solution
function removeFriend (friends) {
const friendToRemove = prompt('Quel est son pseudo ?')
for (let i = 0; i < friends.length; i++) {
if (friendToRemove === friends[i]) {
friends.splice(i, 1)
break
}
}
return friends
}
Question
Les deux fonctions addFriend
et removeFriend
comportent une duplication : la partie du code qui demande les informations sur l'ami à ajouter ou à enlever est identique.
Créer une fonction sans paramètre :
Qui demandera à l'utilisateur un pseudo
Qui retournera la chaîne de caractères correspondante.
Cette fonction sera nommée infoFriend()
.
Solution
function infoFriend () {
const pseudoFriend = prompt('Quel est son pseudo ?')
return pseudoFriend
}
Cette factorisation a un autre avantage : si on veut demander stocker plus d'informations sur les amis, la modification de la demande ne devra être faite qu'à un seul endroit.
Question
Donner le programme complet avec les fonctions.
Indice
Pour éviter tout effet de bord, il faut envoyer une copie d'une liste aux fonctions plutôt que la liste elle-même. Pour faire une copie d'une liste il faut utiliser l'instruction suivante :
liste.slice()
Indice
N'oubliez pas de faire appel à la fonction infoFriend()
dans les fonctions d'ajout et de suppression.
Solution
function infoFriend () {
const pseudoFriend = prompt('Quel est son pseudo ?')
return pseudoFriend
}
function addFriend (friends) {
friends.push(infoFriend())
return friends
}
function removeFriend (friends) {
const friendToRemove = infoFriend()
for (let i = 0; i < friends.length; i++) {
if (JSON.stringify(friendToRemove) === JSON.stringify(friends[i])) {
friends.splice(i, 1)
break
}
}
return friends
}
let friendList = []
let addFriendChoice = true
console.log('Ajoutons un premier ami')
while (addFriendChoice) {
friendList = addFriend(friendList.slice())
addFriendChoice = prompt('Souhaitez-vous ajouter un autre ami? O ou N?') === 'O'
}
console.log('Retirons un ami de votre liste')
friendList = removeFriend(friendList.slice())
console.log("Voici votre liste d'amis:", friendList)
Notez que si le code est plus long, il s'adaptera mieux aux changements. Pour faire évoluer le code et permettre de mettre à jour un ami, ou pour ajouter un ami à un autre endroit, il suffira de ré-utiliser les fonctions addFriend
et infoFriend
.
La modularisation du code est donc un processus un peu plus coûteux au départ, mais qui évite une factorisation pénible et plus longue par la suite.