가위바위보 구현 코드들을 보면 케이스 문을 많이 쓰거나 혹은 비슷한 구조의 if 문이 중복된 경우가 많습니다.

케이스문이 줄줄이 나오는 것이나 비슷한 구조가 반복되는 것이나 모두 "나쁜 냄새"(Moa: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


사실은 이런 종적 상태로서의 프로그램이 중요한 것이 아니고, 어떻게 이런 프로그램에 도달할 수 있었는지, 그 사고와 프로그래밍의 과정이 중요합니다.

Retrieved from http://wiki.zeropage.org/wiki.php/SwitchAndCaseAsBadSmell
last modified 2021-02-07 05:28:09