Je commence tout juste à apprendre les cas d'utilisation de la fonction ES6 WeakMap. J'ai beaucoup lu à ce sujet, mais je n'ai pas été en mesure de trouver une réponse à cette question particulière.Y a-t-il des inconvénients à changer la valeur d'une paire clé/valeur JavaScript WeakMap sans utiliser la méthode WeakMap.set?
Je suis en train de mettre en œuvre un jeu de démineur Node.js pour le terminal - juste pour le plaisir et la pratique. J'ai créé une classe appelée MineBoard qui va stocker toutes les données et méthodes nécessaires pour que le jeu fonctionne. Je veux que certains membres, tels que _uncoveredCount (nombre de cases découvertes) et _winningCount (nombre de cases non couvertes nécessaires pour gagner) restent inaccessibles à l'utilisateur. Bien que ce jeu ne soit pas en production, je voudrais quand même qu'il soit imbattable;) - et la convention de nommage du préfixe _ pour signaler les membres privés ne suffit pas. Pour ce faire, j'ai implémenté une WeakMap pour stocker les deux exemples ci-dessus, ainsi que d'autres membres privés.
MÉTHODE 1:
let _mineBoardPrivateData = new WeakMap();
class MineBoard {
constructor(size, difficulty) {
this.size = size || 10;
this.difficulty = difficulty || 1;
_mineBoardPrivateData.set(this, {});
_mineBoardPrivateData.get(this).winningCount = someMethodForDeterminingCount();
_mineBoardPrivateData.get(this).isGameOver = false;
_mineBoardPrivateData.get(this).uncoveredCount = 0;
//more code
}
generateNewBoard() {
//code
}
uncoverSquare() {
//more code
_mineBoardPrivateData.get(this).uncoveredCount++;
}
//more code
}
Il est plus facile pour moi de le faire de cette façon ci-dessus - et aussi beaucoup plus facile sur les yeux. Cependant, la plupart des exemples d'implémentations de WeakMap que j'ai vus suivent le style ci-dessous.
MÉTHODE 2:
let _winningCount = new WeakMap();
let _isGameOver = new WeakMap();
let _uncoveredCount = new WeakMap();
//more instantiations of WeakMap here
class MineBoard {
constructor(size, difficulty) {
this.size = size || 10;
this.difficulty = difficulty || 1;
_winningCount.set(this, someMethodForDeterminingWinningCount());
_isGameOver.set(this, false);
_uncoveredCount.set(this, 0);
//more private data assignment here
}
generateNewBoard() {
//code
}
uncoverSquare() {
//more code
_uncoveredCount.set(this, _uncoveredCount.get(this) + 1);
}
//more code
}
Alors ma question est - ce qu'il ya des inconvénients à l'utilisation Méthode 1 que je ne vois pas? Cela rend la solution plus simple et IMO plus facile à lire et à suivre le code.
Merci!
Votre raisonnement a du sens pour moi - merci pour les commentaires! –