작성
·
132
·
수정됨
0
안녕하세요. 30:40 강의 구간에서 발생한, 메서드 추출 이슈에 관하여, 원인이 무엇인지 궁금해서 질문 드립니다.
발생한 문제는
지뢰를 밟았을 때, 모든 지뢰 구간이 노출 된다거나,
셀을 열었을 때 엉뚱한 곳도 같이 열리는 현상이 나타납니다.
문제 발생 지점은 updateCellAt 메서드 사용 구간 입니다.
private void initializeEmptyCells(CellPositions cellPositions) {
List<CellPosition> positionList = cellPositions.getPositionList();
updateCellsAt(positionList, new EmptyCell());
}
private void initializeLandMineCells(List<CellPosition> landMinePositionList) {
updateCellsAt(landMinePositionList, new LandMineCell());
}
...
private void updateCellsAt(List<CellPosition> positionList, Cell cell) {
for (CellPosition position : positionList) {
updateCellAt(position, cell);
}
}
상위 호출 부분으로 넘어가서,
제 생각에 initializeEmptyCells 와 initializeLandMineCells 메서드 호출로 넘기는 인자가, 공유될 대상이었나 라고 생각해볼 수 있었습니다.
cellPositions 나 landMinePositionList 모두 새로운 컬렉션으로 리턴되어서, 공유되지 않다고 생각되었습니다.
public void initializeGame() {
CellPositions cellPositions = CellPositions.from(board);
initializeEmptyCells(cellPositions);
List<CellPosition> landMinePositionList = cellPositions.extractRandomPositions(landMineCount);
initializeLandMineCells(landMinePositionList);
...
}
그러면 어느 부분이 메서드 추출로 인해, 공유될 대상이 발생한 원인이었나가 궁금합니다.
답변 1
0
안녕하세요, 김용기 님!
강의에서도 설명하고 있지만, new EmptyCell()
, new LandMineCell()
로 하나의 인스턴스를 생성한 뒤에, updateCellsAt()으로 동일한 인스턴스를 넘겨주고 있어서 발생한 문제입니다.
모든 셀에는 각각 다른 인스턴스가 생성되어 들어가야 각자 상태를 관리할텐데, 리팩토링 중의 착오로 모든 자리에 같은 셀 인스턴스가 위치하게 되어 문제가 발생한 것이죠.
도움이 되셨기를 바랍니다.
감사합니다 🙂