내가 왜 이런 생각을 하게 되었는지 모르겠다. 가끔씩 생각이 가지치게 되는데, 그때 마다 발견하곤 한다. 여기서 발견이라고 표현한 이유는 내가 어떠한 질문을 창조해 낸게 아닌, 내 머리가 그것을 발생시키고, 내가 그것을 인지했기 때문이다. 좀 이상한 말이였다. 사설이 길어서 여기서 이만 줄인다.

질문은 "어떤 if 문이 인간이 이해하기 더 좋을까?" 이다. 내가 지금까지 써본 if문은 다음과 같은 4가지 유형이였다. 아마도 이 if문의 유형 외로는 다른 유형을 찾기가 힘들 것이다.(없다곤 말을 못하겠다. 외계생명체가 다른 별에 있을 수 있으니까..)

3가지 유형의 예제코드

코드를 보면 알듯이 isF?() 함수들은 모두 동일한 논리를 판단해 준다.  "이 3가지 함수 중 가장 인간이 보기에 가장 이해하기 더 편한 함수는 무엇일까?"

생각이 가지를 많이 친다면, 조건을 걸고 한번 생각해 보자.

전제조건

  1. 3가지 상태를 확인해서 참일 경우에만 작업을 한다.
  2. 연산 속도에 대해서는 고려하지 않는다.

나는 isF3 과 isF4 이 좋다고 생각하며, isF3가 사용하기 제일 보기 편하다고 생각한다. 그 이유는 다음과 같다.

첫째, 함수의 루틴을 도중에 종료시켜 생각을 단위로 끊을 수 있다.

이 말이 무슨 말인고 하면, isF1 경우 true가 리턴될지 false가 리턴될지 생각하기 위해선 type --> mode --> state의 상태 순으로 상태를 누적시켜서 기억해야만 한다. 이는 isF2도 마찬가지이다. 

isF3의 경우, 최초 type을 비교하여, 조건에 맞지 않으면 false를 리턴하기에 여기서 생각을 완료 시킬 수 있다. 만약 다음 코드가 궁금하다면, 다음줄의 if문을 확인하고 거기서 다시 생각을 완료시킬수 있다.


둘째, 코드의 범위를 보다 쉽게 끊을 수 있다.

isF2의 경우, 들여쓰기로 인해서 코드의 범위가 다양해져서, 코드 범위까지 인간의 뇌로 기억하고 있어야 하기 때문이다. 여기서 말하는 코드의 범위란, 코드가 존재하는 지역의 범위를 뜻한다. 이는 코드의 량이 늘어나면 늘어날수록 더욱 확연히 들어난다.

isF3의 경우, 코드의 범위를 isF2보다 더 쉽게 보여 줄 수 있다. 이는 if문의 끝을 알 필요가 없기 때문인데, isF2의 경우, 해당 if문마다 끝이 어디서 나는지 { } 를 따라가봐야하고, 들여쓰기 까지 생각해 두어야 한다.


셋째, 코드의 수정이 용이하다.

만약, type의 조건평가 후 참일 경우. 특정 연산을 수행해야 한다면

isF1의 경우, if문을 바꾸어야만 한다.

isF2의 경우, 코드 삽입은 범위를 잘 계산하고 찾아서 해야 한다.

isF3의 경우, 간편하게 해당 if문 다음에 연산시키면 된다.

이로써 나는 isF3가 제일 보기 편하고, 구성시키기 제일 좋은 구조인것을 증명을 하였다. 해당 증명이 맞는지 검증을 받기 위해서이다.

혹시 이 증명이 틀렸다는 것을 증명하고자 하는 분이 있다면, 어느 부분의 증명이 틀렸는지 댓글 부탁드립니다.


어느 졸려운 새벽에


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of http://kuaaan.tistory.com kuaaan 2009.12.02 09:17  Addr  Edit/Del  Reply

    저와 취향이 비슷하시군요. 저도 들여쓰기 많이한 코드는 질색입니다.
    그런데... F4는 어디있나요??

    • Favicon of https://www.ikpil.com 농사를 짓는 게임 프로그래머 최익필 2009.12.02 10:01 신고  Addr  Edit/Del

      F4는 F1과 F3의 혼합형이여서, 삭제했습니다. : )
      그리고 본문 수정 했습니다~

      F3를 선호하시는것 같으신데, 그 이유도 적어 주시면 무척 도움이 될것 같습니다.

    • Favicon of http://kuaaan.tistory.com kuaaan 2009.12.02 11:07  Addr  Edit/Del

      가장 큰 이유는 가독성입니다.
      뭐 F1 과 F3는 큰 차이는 없다고 보구요.

      첫번째로는 if 에서 필터링하는 부분이 해당 함수의 메인 로직이 아닌 경우가 많기 때문에, F3과 같이 작성한 경우 필터링하는 if Series가 끝난 뒤 메인 로직이 분리되어 모아지는 형태가 되어 보기에 좋습니다.
      (메모리해제 등의 탈출로직이 중복되지 않도록 잘 처리하는게 포인트죠. ^^)

      두번째로는 F2와 같이 쓰면 들여쓰기 Depth가 깊어지기 때문에 코드를 읽기가 힘들어집니다. 이 블럭이 if 블럭인지 while 블럭인지 주석 없으면 보기 힘들어지죠. ^^

  2. Favicon of http://blog.naver.com/rkawk01 감자 2009.12.02 09:30  Addr  Edit/Del  Reply

    오~ 저도 평소 많이 궁금하던거였는데 이렇게 만나게 되다니 반갑네요 ㅎㅎ
    저 역시 3번을 선호합니다.
    주된이유는 언급하신 두번째 이유때문이죠
    헌데 제가 3번방식을 쓰면서 가끔 느꼈던점은

    if ( Atype != type )
    {
    return false;
    }
    else
    {
    (작업)
    }

    이런 구조를

    if ( Atype != type ) { return false; }

    (작업)

    이렇게 쓰다보면
    왠지 전자는 (작업)이 else에 해당한다고 명확히 지시하는거 같고
    후자는 명확하지 않아보인다는 거죠
    즉, else를 명시적으로 쓰면 가독성이 올라가지 않나하는 생각이 들어서요
    하지만 아직 이게 큰 단점으로 안느껴져서 여전히 3번째 방식을 주로 씁니다.

    아 그리고.. 글을 읽어보니 4번째 방식도 있는거 같은데 본문에 안나와있군요..

  3. 붉은문양 2010.03.26 16:02  Addr  Edit/Del  Reply

    개인적으로 3개중에 고르라면 2번 형태를 선호합니다.
    실제로는 if / else if 문으로 정확히 scope를 나누어 사용합니다.
    bool ret = false;
    if( Atype != type )
    {
    ret = false;
    }
    else if( BMode != mode )
    {
    ret = false;
    }
    else if( CState == state )
    {
    ret = true;
    }
    else
    {
    ....
    }
    return ret ;

    이런식으로 사용합니다. 코드 양은 늘어나기는 한데 가독성이나, 추가 예외처리, 에러로깅, 코드추적에 장점이 있는것 같아서 저런식으로 사용합니다. (코드 양이 늘어나서 가독성이 줄어드는 것보다 정확히 영역이 나눠짐에 따라 가독성이 증가하는게 더 이점이있더군요..)
    실제로 초기 버전에서 점점 개발이 진행되어 감에 따라 case별로 추가예외 처리가 필요한 경우가 늘어나기 때문에 처음부터 추가예외 처리가 용이한 구조를 잡아 두는 버릇이기도 합니다.
    그리고 중간에 return 문은 배제하여 사용합니다.(중간에 return 문에 들어가면 마치 goto 문처럼 차후에 디버깅, 소스 분석이 힘들더군요.)