2017-01-31 11 views
1

이제 ES6 WeakMap 기능의 사용 사례를 배우기 시작했습니다. 나는 그것에 대해 많이 읽었지 만, 나는이 특별한 질문에 대한 답을 찾을 수 없었다.WeakMap.set 메서드를 사용하지 않고 JavaScript WeakMap 키/값 쌍의 값을 변경하면 단점이 있습니까?

재미 있고 실용적인 Node.js Minesweeper 게임을 구현하고 있습니다. MineBoard라는 클래스를 만들었습니다.이 클래스는 게임에 필요한 모든 데이터와 메서드를 저장합니다. 나는 _uncoveredCount (발견 된 사각형의 수)와 _winningCount (이길 필요가있는 사각형의 수)와 같은 일부 멤버가 사용자에게 접근하기 어려운 상태를 유지하기를 원합니다. 이 게임이 제작에 들어 가지 않더라도, 나는 아직도 그것을 바랄 수 없게하고 싶다.) 그리고 private 멤버를 알리는 _ 접두사의 명명 규칙만으로는 충분하지 않다.

이렇게하려면 - 위의 두 예제를 저장하는 WeakMap과 다른 개인 멤버를 구현했습니다.

방법 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 
} 

- 눈에도 훨씬 쉽게. 그러나 필자가 보았던 WeakMap 구현의 예제는 아래 스타일을 따른다.

방법 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 
} 

그래서 내 질문입니다 - 내가보고 있지 않다 방법 1을 사용하여 어떤 단점이있다? 따라서 간단한 솔루션과 IMO를 읽고 코드를 쉽게 이해할 수 있습니다.

감사합니다.

답변

0

첫 번째 방법을 사용할 수 있습니다. 첫 번째 방법을 사용하는 데에는 단점이 없으며 MineBoard 인스턴스 당 하나의 개체 만 만들기 때문에 더 효율적입니다. 또한 사설 속성을 추가/제거하는 것이 훨씬 쉽다는 것을 의미합니다. 또한 MineBoard 인스턴스 내부에서 Object.keys(_mineBoardPrivateData.get(this))을 사용하는 모든 개인 속성을 쉽게 반복 할 수 있습니다 (두 번째 방법으로 시도해보십시오).

+0

의견을 보내 주시면 감사하겠습니다. 의견을 보내 주셔서 감사합니다. –