[우아한테크코스 백엔드 4기] 레벨1 - "체스" STEP 1 회고

헌치·2022년 4월 17일
1

우아한테크코스

목록 보기
16/30

🔗 관련 링크

깃허브 링크
작성한 코드


⚙️ 구현 기능 목록

입력

  • 체스 게임 시작을 위해 입력해야 할 명령어의 문구를 출력한다.

  • 체스 게임 시작을 위해서 명령을 입력받는다.

    • 게임 명령은 start, move, end로 구성된다.
    • [예외처리] 구성외의 입력은 받을 수 없다.
    • move {원래 칸} {이동할 칸} 의 형태로 입력받는다.
      • [예외처리] move 뒤 값이 {원래 칸} {이동할 칸} 형태여야 한다.
    • 게임이 끝났을 경우
      • status를 입력받울 수 있다.
      • [예외처리] start, move, end를 입력받을 수 없다.

명령 수행

  • 체스 게임을 시작한다
  • 체스 게임에서 말의 이동을 수행한다.
    • 위치가 변경될 때 마다 체스판을 출력한다
  • 체스 게임을 끝낸다.

체스 판 초기 세팅

  • 체스 판은 게임 시작시 초기화 된다.
    • 체스 판은 가로 8, 세로 8의 길이로 구성한다.
    • 체스 말을 배치한다
      • 위 : 대문자 줄 RNBQKBNR , 둘째줄은 P로 이뤄진다
      • 중간: 나머지 부분은 .으로 배치한다.
      • 아래 : 소문자 첫줄 p, 둘째줄은 rnbqkbnr

말 이동

  • 첫번째 전달 인자는 현재 위치, 두번째는 이동할 위치로 구성된다.
  • 현재 위치에서 이동할 위치로 갈 수 있는지 검증한다.
    • [예외처리] 현재 위치의 말은 해당 턴에 이동가능한 색의 말이어야 한다.
    • [예외처리] 이동할 위치가 체스판을 벗어날 수 없다.
    • [예외처리] 이동할 위치에 같은 색깔의 말이 있어선 안된다.
    • [예외처리] 이동할 위치가 말이 이동 가능한 규칙에 해당해야 한다.
  • 이동할 위치로 말을 이동한다.
    • 이동할 위치에 말이 존재할 경우 다른 색깔의 말을 제거한다.
    • 이동한 위치에 말이 존재하지 않을 경우 현재 위치를 비우고 이동할 위치로 말을 변경한다.

게임 종료

  • King이 잡혔을 때, 게임을 종료한다.

점수 계산

  • 각 말들이 점수를 가질 수 있다.
    • 퀸 : 9점
    • 룩 : 5점
    • 비숍 : 3점
    • 나이트 : 2.5점
    • 폰 : 1점
    • 킹 : 0점
  • 킹이 잡히면 점수를 계산한다
    • 같은 세로줄에 같은 색의 폰이 있는 경우, 폰은 0.5점이다.

출력

  • 체스판을 출력한다
  • 각 진영의 점수와 어느 진영이 이겼는지를 출력한다.

⛳ 피드백

@사이드 피드백

1.PR 가이드

  • 이미 끝났다고 생각한 PR 대화도 Unresolve로 처리하자
  • 미션과 무관한 파일들은 .gitgnore에 추가하자
  • 파일 끝에 개행을 추가하자

2.네이밍

  • getter는 주로 인스턴스 변수를 불러올 때 사용
  • 되도록 줄임말은 쓰지 않기

3.Controller 패키지

  • ~~controller 클래스만 있을 필요 없음
  • 흐름을 제어하는 역할인 Command 객체는 Controller 패키지 안인 편이 어울림

@불변 구조로 설계하자

while (!movedPosition.equals(to)) {
	positions.add(movedPosition);
	movedPosition = movedPosition.advancePosition(direction);
  • 위의 구조는 값(movedPosition)을 재할당하게 됨. 불변 X
    - 값이 불변이 아닌 경우에, 참조로 인해서 찾기 어려운 버그를 만들어낼 수 있다.
  • for문을 통해 목적지까지 이동한 새로운 포지션을 매번 생성하고, 그 값을 리스트에 담자

@전략패턴에 테스트 코드용 전략을 만들어도 될까?

  • 고민되지만, 경우에 따라 하나의 방법
  • BUT 실제 환경과 동일한 방식의 테스트가 이뤄지지 않는다
  • 가능하다면 Fixtures 안에 해당 로직을 넣자!
  • (통합테스트/인수테스트는 이후 스프링과 함께 알아갈 예정)

@도메인과 OutputView 사이 의존을 끊자

  • 인자 값으로 getterDTO를 사용하자
    - Viewgetter로 값을 넘기는 것은 괜찮다!
    • 정 불안하면 getter를 더 안전하게 만들자!(VO, copyOf()...)

🖋 소감

미친듯이 바빴고 즐거웠다

이번 미션은 전 기수부터 악명이 자자했다.
실제로 구현사항을 하나씩 읽는데 눈앞이 캄캄했다.
체스 룰을 잘 몰랐기 때문에 각 기물(말)들의 이동패턴 부터, 승리 조건까지 공부해야 했다.

온라인 vs 오프라인

이번 페어프로그래밍 때 유독 협업용 인텔리제이 플러그인 Code With Me가 말썽이었다.
핑도 높고 자꾸 인텔리제이가 꺼졌다. 대안으로 TeamViewer를 사용했지만 단축키가 씹히는 문제가 있었다.
결국 페어 루키가 내쪽 지역으로 와 같이 코딩했다.

사실 페어 프로그래밍을 이전까진 거의 온라인으로 진행했다.
코로나 이슈도 있었고, 굳이 움직이기 귀찮았기 때문이었다.
막상 만나서 페어프로그래밍을 하니, 온라인으로 진행할 때와 비교해 생각치 못한 장점들이 있었다.

  1. 의사소통 비용이 줄었다.

온라인으로 대화할 때는 서로의 말에 반응하는 속도가 느리다.
이게 신경쓰이고 스트레스로 다가온다. 서로 말이 겹쳐 어색해질 때 특히😅
오프라인으로 만나니 목소리도 더 잘 들리고 비언어적인 부분까지 포괄해 의사소통이 가능했다.

  1. 펜과 종이를 쓸 수 있다.

물론 온라인에서도 아이패드를 연동하거나 기타 협업툴을 쓰면 되지만
직접 그려가며 설명하기엔 오프라인이 좋았다.

  1. 진행이 루즈해지지 않는다

이거 하겠다고 밖에 나왔으니 최대한 빨리 끝내고 싶은 마음이 생긴다.
자연스럽게 집중력이 높아지고 서로의 설명들을 잘 이해하게 된다.

  1. 밖에 나가게 된다

요새 혼밥이 유행이지만 아직 2인분부터 주문 가능한 곳도 많고,
집에 있으면 굳이 나가서 사먹지 않게된다.
바깥바람도 쐬고 맛있는 것도 먹을 수 있다.

그래서 내 생각엔 오프라인 페어프로그래밍이 더 좋다.
앞으로는 오프라인으로 페어 프로그래밍을 해야 하는데 기대된다👍

miro 사용기

예전 조별 과제 때 사용했던 디자인씽킹 툴이다.
미리 구조설계를 빠르게 고민할 수 있다.
이때의 설계 다수가 끝까지 갔던 것 같다.
이번 체스미션 구조가 많이 복잡해서 코드 작성 전에 설계고민을 해보는 것이 큰 도움이 되었다.
앞으로도 많이 쓸 생각이다!

profile
🌱 함께 자라는 중입니다 🚀 rerub0831@gmail.com

2개의 댓글

comment-user-thumbnail
2022년 4월 17일

좋은 글이네요^^

1개의 답글