가위바위보 구현 코드들을 보면 케이스 문을 많이 쓰거나 혹은 비슷한 구조의 if 문이 중복된 경우가 많습니다.
케이스문이 줄줄이 나오는 것이나 비슷한 구조가 반복되는 것이나 모두 "나쁜 냄새"(
BadSmell )입니다. 조금이라도 나쁜 냄새가 나면 바로바로 냄새 제거를 해야 합니다. 예컨대, 반복되는 케이스문은 테이블 프로그래밍(Table/Data Driven Programming)으로 해결할 수 있습니다.
그리고, 사고의 도구들을 적극적으로 활용하기 바랍니다. 스테이트 다이어그램이나, 심지어는 x,y 좌표계를 사용하는 것, 혹은 서브루틴을 통해 문제를 소문제(subproblem)로 나누는 것도 아주 훌륭한 사고의 도구가 됩니다 -- 문제의 복잡도를 낮춰주기 때문이죠.
예컨대, 다음과 같은 소문제가 있겠죠:
- 텍스트화일로부터 입력자료 읽고 해석하기
- 둘 중에 누가 이겼는지 판단하기
- 사람별로 이긴 횟수, 진 횟수 누적하기
- 결과 보여주기
이중에서 두번째 "판단하기"를 TDD와 리팩토링을 통해 다음과 같이 만들었습니다.
~cpp
GAWI=1
BAWI=2
BO=3
def getWinner(p1,p2):
"""return 1 when p1 wins, 2 when p2 wins, 0 when a tie"""
if p1>=p2:
return p1-p2
else:
return p1-p2+3
여기서 한단계 더 리팩토링이 가능할까요?
def getWinner(p1,p2):
"""return 1 when p1 wins, 2 when p2 wins, 0 when a tie"""
return (p1+2*p2)%3
>>> getWinner(GAWI,BO)
1
>>> getWinner(BO,GAWI)
2
>>> getWinner(BAWI,GAWI)
1
>>> getWinner(BO,BO)
0
사실은 이런 종적 상태로서의 프로그램이 중요한 것이 아니고, 어떻게 이런 프로그램에 도달할 수 있었는지, 그 사고와 프로그래밍의 과정이 중요합니다.