2017-01-31 1 views
1

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!

Répondre

0

Vous pouvez (et devez) utiliser la première méthode. Il n'y a aucun inconvénient à utiliser la première méthode et il est probablement plus efficace de toute façon puisque vous ne créez qu'un seul objet par instance MineBoard. Cela signifie également que l'ajout/suppression de propriétés privées est beaucoup plus facile. De plus, depuis l'intérieur de votre instance MineBoard, vous pourrez facilement parcourir toutes les propriétés privées en utilisant simplement Object.keys(_mineBoardPrivateData.get(this)) (essayez de le faire avec la deuxième méthode).

+0

Votre raisonnement a du sens pour moi - merci pour les commentaires! –