2016년 11월 30일 수요일

임시변수의 범위를 명확하게

가끔 비슷한 부분을 복사해서 사용하는 경우가 있습니다. 몇줄 안되는 데다가 몇군데만 달라서 함수화하기도 애매한 경우에 말입니다.

    Player first = GetFirst();
    first.Prize(Prize.GoldMedal);
    newspaper.OlimpicArticle(first, Prize.GoldMedal);

    Player second = GetSecond();
    second.Prize(Prize.SilverMedal);
    newspaper.OlimpicArticle(second, Prize.SilverMedal);

    Player third = GetThird();
    first.Prize(Prize.BronzeMedal);
    newspaper.OlimpicArticle(third, Prize.BronzeMedal);

즉, 선수들에게 등수에 따라 각각 금메달, 은메달, 동메달을 주고, 신문에 기사를 올리는 코드입니다. 비슷비슷하기에 첫 세줄을 복사해서 일부만 수정한 코드입니다.

이런 식으로 코딩을 할 때 가장 문제가 되는 것이 수정을 잘못하는 것이죠. 위 코드에도 이미 버그가 있습니다. third에게는 아무것도 주지 않고 first에게 금메달과 동메달을 같이 주고 있죠.

이런 실수를 막기 위해, 저는 저런 경우에는 변수의 범위를 명확하게 설정하곤 합니다.
즉,

    {
        Player first = GetFirst();
        first.Prize(Prize.GoldMedal);
        newspaper.OlimpicArticle(first, Prize.GoldMedal);
    }
    {
        Player second = GetSecond();
        second.Prize(Prize.SilverMedal);
        newspaper.OlimpicArticle(second, Prize.SilverMedal);
    }
    {
        Player third = GetThird();
        first.Prize(Prize.BronzeMedal);   // first : 선언되지 않은 변수
        newspaper.OlimpicArticle(third, Prize.BronzeMedal);
    }

변수 first의 영역은 첫째 단락에서 끝나버렸으므로 세번째 나온 first에서 컴파일 에러를 볼 수 있습니다.

물론 변수를 선언할 필요가 없는 루아 같은 경우에는 쓸 수 없는 꼼수이긴 합니다만.

댓글 없음:

댓글 쓰기