Skip to content

Conversation

@dev-ny
Copy link

@dev-ny dev-ny commented Mar 18, 2025

No description provided.

- 매직 넘버, 매직 스트링(상수로 추출되지 않은 유의미한 값)을 상수로 추출하여 유지보수와 가독성을 높임 nyahn A minute ago
- while 문 안에서 스캐너가 계속 생성되기 때문에 상수로 선언해 줌.
+ 의도적인 예외처리: AppException.java
+ Cell 객체 생성
+ BOARD 를 Cell 객체 타입으로 변경
+ 새로운 도메인 지식을 발견했을때 과감하게 사고 전환(isOpened -> isChecked)
+ Cell 객체에서 물어볼 수 있는 것들은 Cell 객체에 물어봄
- main 에서는 게임 실행만 하도록 변경
- 지뢰찾기 class 를 만들어 지뢰찾기 게임 class 는 따로 실행되도록 함
  + Minesweeper.java 에서 이제 main 에서 실행되지 않으므로 함수들 static 삭제
- SRP에 따라서 사용자 입출력을 나눠봤음.
- SRP에 따라서 GameBoard.java 클래스 생성 및 구현
- col: ASCII code 로 계산하도록 변경
- row: String.substring 으로 뒤에 두자리 숫자 이상도 받을 수 있도록 변경
- BoardIndexConverter 하는 부분 단일책임원칙에 의해 분리
- 알파벳 j 이상에서도 가능하도록 IntStream.range 만들어주고 char 로 만들고 char -> String 만들어서 List 로 묶어준 후 join 해주기
- 게임 난이도를 인터페이스로 생성
  + 난이도 조정시 구현체로 난이도가 변경된 구현체를 넣어줄 것
  + GameBoard.java 생성시 인터페이스를 주입받아 row, col, landminecount 받을 수 있게 하여 게임을 유동적으로 할 수 있게 함 = OCP 만족
+ Cell2 를 상속구조로 만들고
+ turnOnLandMine 과 같은 기능을 부모에서 선언하면 자식들 중에서는 필요없는 자식이 있음. 이 경우에는 throw UnSupported..Exception 을 던짐 -> 그럼 다른 곳에서 쓸때 지원하는 객체인지 확인을 하고 사용하는 로직이 들어감 -> 좋지 않음(LSP 준수하지 않음)
+ 다시 LSP에 맞는 코드로 변경함. 현재 결과는 LSP 를 잘 만족한 상속구조가 됐음
- Game Interface 생성
- Minesweeper Game Interface 상속 받도록 함
- AnotherGame 추가(initialize 가 필요 없음)
  + 이 경우 Game클래스에서 initialize 선언부가 변경되면 AnotherGame 클래스에서도 변경을 해주어야 됨. 같이 수정이 되어야 하기 때문에 문제 점이 있음. -> ISP 원칙에 위배!
- Interface 분리! GameInitializable, GameRunnable
- AnotherGame 은 사용하지 않는 initialize() 함수는 제거하고 GameRunnable 만 받아서 run 함수만 구현
- InputHandler.java, OutputHandler.java 구현
- Minesweeper.java 는 InputHandler.java 와 OutputHandler.java 인터페이스만 알고있고 콘솔에 대한건 모르도록 함.
- 고수준 모듈(Minesweeper) 이 추상화(InputHandler, OutputHandler) 에만 의존하고 있음.
- 원래는 고수준 모듈이 저수준 모듈(ConsoleOut/InputHandler) 를 참조했지만 추상화에 의존하도록 함!
- OutputHandler 를 보면...
- print, show 같은 기능인데 단어를 다르게 사용. 함수명을 통일시켜 줘야함
- show 가 좀 더 추상적인 느낌.
- OutputHandler 에서는 console 적인 느낌보다는 추상적인 단어를 쓰는게 좋음 -> print 를 show 로 변경
- Cell 의 isFlagged, isOpened 를 별도의 객체로 분리를 해서 각각의 자식객체에서 조합의 형태로 가져다가 사용하는 형태로 변경해보겠다.
- 추상 클래스인 Cell 을 지우고 Cell 이 상속구조에서 두가지 필드를 CellState 객체로 분리했고 각각의 자식클래스들이 CellState 와 각각의 조합 형태로 이루어져 있고 Cell 을 인터페이스로 다시 만든 것은 GameBoard 와의 관련점 때문에 스펙들을 남겨두고 인터페이스(Cell)를 관련하는 구현체(자식cell) 들을 변경 해줌.
- 이후 CellPosition 기반으로 변경
- row, col 다 따로 노는데 두개가 있어야 의미가 있어서 CellPosition 으로 만듦.
- CellPosition 이 VO 역할을 하기 위해 유효성에 대해 처리했는데 -1 등의 개념에 대해 처리하려고 하다보니 RelativePosition 을 만듦.
- 지뢰 위치가 중복될 수 있는 상황 수정
- UserAction 을 Enum 으로 수정하여 적용 함
- Cell 을 보니 Cell 을 어떻게 그리는가에 대한 책임이 있었음. SRP 위반. 이 부분 ConsoleOutputHandler 의 책임으로 해야 됨.
- 이러니 Cell 이 어떤 상태인지가 필요해. 현재 Cell 의 현재 상태를 찍어주는 것
- CellSnapshotStatus Enum 생성
- CellSnapShot 도 보면 지금 Value Object 와 같음. SnapshotStatus 가 같고 nearbyLandmines 가 같으면 같은 Cell
- 그럼 equals 와 hashCode 재정의 해줘야지
1. 5개의 구현체 만듦.
2. CellPosition 따라 snapshot 을 board 로부터 가져오고,
snapshot 을 통해서 CellSignFinder 에 CellSign 좀 찾아달라고 책임을 다 부여함.
3. ConsoleOutputHandler 에서는 CellSign 어떻게 생겼는지 모름. CellSignFinder 에게 snapshot 줄테니 맞는거 찾아줘~
- CellSignProvider Enum 클래스에서 CellSignProvidable 을 상속받아서 안에 오버라이드 함수를 Enum 값 안에서 구현함.
- Enum 에게 snapshot 에 맞는 문양 가져와줘! 라는 기능 구현
- cellSignFinder 주석 처리
- StudyCafePassMachine
- StudyCafeLockerPass
 + 불필요한 getter, setter 함수 삭제
dev-ny added 9 commits March 16, 2025 00:12
- 설정 정보라는 것을 하나로 관리를 해보자! 나중에 설정정보들이 더 추가되면 계속 Minesweeper 생성자를 바꿔야 하니까! GameApplication 에도 생성해줘야하고!
  + GameConfig 추가
- gameStatus 를 Enum 으로 주석 없어도 의도를 확인할 수 있도록 함
- while 문의 조건을 변경
- 게임이 끝난 후 result 를 while 문 밖으로 내보낼 수 있음.
- GameBoard 에 계속 물어보고 Minesweeper 가 관리하지말고 GameBoard 에서 끝낼 수 있도록 함
- Game 진행에 대한 것들은 GameBoard 가 실질적인 관리를 하고 Minesweeper 는 게임을 실행하고, 여러가지 출력이나 이런 것들을 담당해줌(외부와의 소통)
+ InputHandler git 추가(빠진거)
<GameBoard>
+ public 먼저, private 나중
+ 그룹화해서 비슷한 메서드들끼리 배치
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant