brunch

[코딩삼국지] #10 징병과 모병

들어가는 글: 우와! 드디어 10번째 글입니다.

깃헙 링크: https://github.com/yudong80/coding-samguk/commit/43e0fad70fea0d1f4c50bb617bd4bca49261d7aa


1. 징병과 모병 기능


오늘은 군사를 모으는 기능을 구현합니다.

징병은 군역이 있는 시민들을 병사로 징집하는 것이며,

모병은 돈을 주고 용병을 고용하는 것입니다.


20210831-1.png 징병과 모병 기능


당연히 모병이 비싸겠죠?


징병의 경우 실험을 해보니,

1) 무력이 중요함 (최대 2명의 장수, 무력 최대 200)

2) 최대 징병수는 15,000명

3) 병사 1명당 금 0.1 , 군량 1이 필요

4) 실제 징병수는 100이하에서 올림 (예, 계산후 14,150명 => 14,200명)


모병의 경우

1) 매력이 중요함 (최대 2명의 장수, 매력 최대 200)

2) 최대 모병수는 15,000명

3) 병사 1명당 금 0.4 , 군량 2이 필요 => 엄청 비쌈!!

4) 실제 모병수는 100이하에서 버림 (예, 계산후 8,750명 => 8,700명)


2. 구현 방법


한마디로 징병과 모병은 로직은 같고 필요한 변수만 다른 구조입니다.

결국 병사를 모으는 것이니까요.


파일: coding.samguk.Province.java

메서드: requestDraftArmy() , draftArmy()

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/Province.java

20210831-2.png


왜 2개로 나누었을까요?

1) requestDraftArmy()는 무력과 지방의 자원을 고려한 최대 징병수를 반환합니다.

2) draftArmy()는 실제로 징병하고 필요한 지원을 소모합니다.


한편 모병의 경우도 비슷합니다. 위의 두 코드와 모양이 비슷합니다.

파일: coding.samguk.Province.java

메서드: requestRaiseArmy() , raiseArmy()

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/Province.java

20210831-3.png


보시면 새로운 클래스 이름이 보입니다.

바로 GeneralUtils 와 ArmyUtils 클래스에 대해 알아봅니다.


3. GeneralUtils 코딩


Province와 General 클래스가 자꾸 커집니다.

한 클래스는 응집력을 높이기 위해 관련성이 강한 것들로 잘 분산해두어야 합니다.

클래스가 필요이상 커지면 가독성이 떨어지고 오류의 가능성이 늘어납니다.


GeneralUtils 클래스는 General 클래스를 보좌하는 유틸리티 클래스입니다.

현재는 static 메서드들만 포함하고 있습니다.


파일: coding.samguk.GeneralUtils.java

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/GeneralUtils.java

20210831-4.png


첫번째는 총 전투력을 , 두번째는 총 매력을 계산하여 반환합니다.

물론 이 메서드들이 Genera.java 클래스에 있어도 됩니다.

그런데 왜 분리할까요? 잘 생각해보세요.


4. ArmyUtils 코딩


같은 방식으로 군대 관련 유틸리티 클래스를 만들었습니다.

파일: coding.samguk.ArmyUtils.java

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/ArmyUtils.java


이 클래스는 꽤 기므로 세 부분으로 나눠서 봅니다.


1) 상수 선언

20210831-5.png


2) 징병 / 모병 주요 로직

20210831-6.png

3) 보조 로직 : 올림 / 버림 관련

20210831-7.png


5. 테스트 코딩


위 로직이 정상동작하는지 확인합니다.

파일: coding.samguk.AppTest.java

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/AppTest.java


20210831-8.png


FIXME는 왜 붙어 있을까요?

>> 테스트 코드를 급하게 짜다보니 초기화하는 부분을 빼먹었는데요..

(이게 싱글턴 클래스여서..) 일단 테스트는 무조건 PASS 해야 하므로

ProvinceNet.forceInitialize() 메서드를 만들었습니다.

>> 나중에 고칠 예정입니다 ^^;;


남아있는 TODO 들

20210831-9.png


6. 테스트 결과


테스트는 항상 PASS 해야 합니다.

20210831-10.png


음.. 설명이 넘 부족한거 같은데

다음에는 좀더 적어볼께요 ^_^


감사합니다.

2021.8.31

keyword
매거진의 이전글[코딩삼국지] #9 나머지 테스트 케이스