들어가는 글: 드디어 데이터 입력을 넘어 (기능)을 구현해봅니다 :-)
오늘의 내용을 한눈에 보시려면 아래 깃헙 commit 링크를 확인하세요.
깃헙 링크: https://github.com/yudong80/coding-samguk/commit/cba94fea1f3221c5f9c959395c87470729569a82
다시 낙양의 지도입니다. 필요할 때마다 다시 기억해주세요.
11 낙양
12 홍농
22 완
23 신야
19 허창입니다.
게임 삼국지에는 다음과 같은 군사 메뉴가 존재합니다.
오늘은 여기에서 가장 쉬운(?) 군사 이동 (1.군사 -> 1.이동) 을 구현합니다.
즉, 인접한 지역에 대해 장수를 이동하며 이때 장수에 배속된 병사들이 함께 움직이는 것입니다.
군사 이동을 하려면 (인접) 의 개념이 있어야 하며 이것은 이미 ProvinceMap.setNetwork() 메서드에 구현되어 있습니다. 기억을 위해 다시 소환합니다.
파일: coding.samguk.ProvinceMap.java
메서드: setNetwork()
이렇게 관계가 맺어져 있습니다.
낙양 -> {홍농, 완, 허창}
홍농 -> {낙양}
완 -> {신야, 낙양, 허창}
신야 -> {완}
허창 -> {낙양, 완}
즉 이 방향으로만 군사 이동을 할 수 있습니다.
군사이동은 땅(Province)의 기능이므로 여기에 구현합니다.
파일: coding.samguk.Province.java
메서드: transfer()
보조 메서드: isTransferable()
깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/Province.java
왜 두 개의 메서드로 나누었을까요?
좋은 메서드의 원칙은 (예외를 정상적인 코드와 분리하라) 입니다.
transfer() 메서드는 정상적인 기능을 담당하고 isTrasferable()은 이 기능이 수행될 수 있는지 기본 조건을 확인합니다.
이렇게 나누어 놓으면 누가 이 코드를 읽더라도 논리가 명확하게 보입니다.
조금 어려운 말로 코드의 가독성(readability)이 좋아진다고 합니다.
군사 이동은 결국
0) 인접 지역인지 확인 (사전 조건)
1) 출발지의 장수 제거 (병사도 함께 제거)
2) 목적지의 장수 추가 (병사도 함께 추가)
로 나뉩니다.
다음과 같이 Province.removeGeneral() 메서드를 구현합니다.
파일: coding.samguk.Province.java
메서드: removeGeneral()
실제 군사 이동을 수행하고 잘 되었는지 확인합니다.
파일: coding.samguk.App.java
메서드: test군사_이동()
깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/App.java
주석에 나와 있듯이 홍농(12)에 있는 장수 우금(1500명)을 낙양(11)으로 이동합니다.
위 메서드를 실행한 결과는 다음과 같습니다.
좋은 프로그래머는 BEFORE 와 AFTER가 어떻게 변화하는지
언제든지 확인할 수 있도록 테스트 코드를 만듭니다.
그래야 이후에 다른 변경 사항이 생겨도 기존의 기능이 문제없는지 빠르게 알 수 있거든요.
코딩하다보니 setNetwork() 메서드의 데이터를 잘못 넣었더라구요.
이렇게 코딩을 진행하다보면 이전의 실수를 종종 발견하기도 합니다.
뭐가 틀렸는지 궁금하시면 아래 내용을 다시 읽어보세요
낙양 -> {홍농, 완, 허창}
홍농 -> {낙양}
완 -> {신야, 낙양, 허창}
신야 -> {완}
허창 -> {낙양, 완}
나머지 군사 기능들도 하나씩 구현해보도록 하겠습니다.
감사합니다.
2021.8.22