C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1003] bool 값과 에러 값을 리턴하는 함수 만들기에 대해.
김태선 [cppbuilder] 10899 읽음    2010-07-26 20:55
일반적으로 함수(메소드)를 만들때 리턴 값에 대해 프로그래머는 언제나 자유롭게 선택할 권리가 있습니다.
그렇지만 지나친 자유는 코드를 보기 어렵게 만들기도 합니다.
객체 지향적인 기법이 프로그래밍의 질서를 만들어 많은 이점을 프로그래머에게 주었듯,
작은 문제이긴 하지만 함수 리턴 값 역시 기본적인 질서를 부여하는게 프로그래밍에 있어 여러모로 편리합니다.

C Runtime에 보면 사실상의 bool 형을 리턴하는 함수가 있는데
대체로 목적하는 작업이 성공했을 경우는 true를 돌리고 실패하면 false를 돌립니다.
그러면 에러를 돌려야 하는 경우는 어떻게 할까요?
여기에 대해서는 조금 과장하면 중구난방입니다. 여름인데 난방까지 하면 더 더워서 열받기 쉽상이죠. (웬 삼천포.)

그러면 개발자가 만드는 함수의 경우는 어떨까요?
예상한대로 모두 제 맘대로 입니다.
한가지 예를 들어 보면

bool FindName(String name);

이건 당연히 특정한 이름을 있으면 true. 없으면 false를 돌려야 겠죠.
그런데 이걸 반대로 만드는 분도 있습니다.
발견하면 0 없으면 1, 이렇게 하는 분은 특정한 이름이 있다면 에러가 없으니 0,
없다면 에러이니 1을 돌린다는 생각에 이렇게 만듭니다.
이는 어떤 함수의 실행 결과로 에러 값을 돌릴 때 0은 NO ERROR 그 외 값은 ERROR를 의미하기 때문에
이는 bool형으로 표현하면 에러는 true, 노 에러는 false가 되기 때문에 함수의 기능을 실패 중심으로 보면
그렇게 되는 것입니다.

어떻게 하던 상관없다고 할수도 있겠지만,
제가 10년 넘게 이렇게 해보니 나중에 항상 문제가 되더군요.
나중에 코드를 다시 볼 때는 만들때 했던 생각대로가 아니라 직관적으로 함수 이름에 기반해서 리턴 값을 생각하는게 먼저더군요.

당연히 직관적으로 booll FindName(String name); 이면 이름을 발견하면 true를 돌린다고 생각하는게 자연스럽습니다.
그런데
bool CheckName(String name);
같이 뭘하겠다는 건지 조금 불분명한 의미의 함수 이름인 경우는
리턴 값에 대한 기대를 어떻게 해야할 지 좀 헷갈립니다.
할수 없이 함수 구현부로 가서 어떤 기능인지 확인하고 리턴 값에 대해 확인합니다.

이런 경우가 생기면 우선 함수 명칭을 제대로 짓지 못했다는 것을 알수 있고,
bool 형의 리턴 할 값에 대해 확정할 수 없는 문제가 생깁니다.

이런 문제가 프로그램 할때 마다 쌓이면 나중에는 그 조그마한 문제가 뭉쳐 큰 문제가 되기도 합니다.
바로 프로그램 수정 및 기능 확장에 시간 낭비와 지장을 받게 되는 것이죠.


그래서 몇가지 코딩의 원칙을 정해 놓으면 이런 문제를 해소할 수 있고, 또 코딩이 편리하게 됩니다.

1. 함수 명칭은 그 함수가 하려는 일을 분명하게 알수 있게 짓는게 좋습니다.
2. bool 형 리턴 값을 가지는 함수는 무조건 그 함수가 하려는 일이 성공하면 true, 아니면 false를 돌리게 합니다.
3. 에러 값을 리턴해야 하는 경우는 ECODE 같은 에러 형을 지정하여 리턴하게 합니다.


1.
bool CheckName(String name);
같이 애매모호한 명칭이 아니라
bool IsUniqueName(String name);
같은 식으로 분명하게 함수 이름을 짓습니다.
개발자는 자리 깔아주면 애이름 정도는 척척 지을 정도의 작명가가 되어야 합니다.

2.
예로 든 bool IsUniqueName(String name); 함수라면, 그 이름이 있다면 true, 없다면 false를 돌립니다.
이처럼, bool 형을 리턴하는 함수는 무조건 그 기능을 완수한다면 true, 실패한다면 false를 돌리게 하는 것을
하나의 코딩 원칙으로 삼는게 매우 좋습니다.
즉 bool 을 리턴하는 함수는 에러 유무를 리턴하는 일은 없다라는 것이죠.

3.
만일 에러를 돌려야 한다면
ECODE CheckUniqueName(String name);
로 에러 값을 돌리게 합니다.
에러 값을 돌릴 때는 0 이면 NO_ERROR 그 외는 에러코드 값으로 인식하면 됩니다.

이를 위해서는

// error code

typedef short    ECODE;
const ECODE        EOK = 0;

식으로 이를 미리 정의해 두면 쓰면 편리합니다.

이 경우 에러인지 확인은 가급적
if (!함수(...)) 식이 아니라, if (함수(...) == EOK) 식으로 비교해주면 보다 가독성 좋은 코드가 됩니다.


에러 코드를 리턴할 때 보통 많이 쓰이는 int 가 아니라,
short를 되돌리는 이유는, IDE에서 Code Insight로 필요한 함수 목록을 볼때
ECODE가 int 값이면, ECODE가 아니라 int로 표시되어 에러 값을 리턴하는 함수인지 금방 파악하기 어렵기 때문에,
잘 안쓰이는 short 값으로 지정하는게 더 구분하기 좋습니다.
IDE  때문에 이렇게 하는 것입니다.



더불어 잘 쓰이는 INDEX 형 변수와 COUNT 형 변수의 분명한 지정 문제에 대해서도 생각할 수 있는데,
이는 조금 도움은 되어도, 큰 도움은 안되니 그다지 중요하진 않습니다.


첨부하는 파일은 제가 현재 잘 쓰고 있는
몇가지 중요 define 값을 담은 헤더 파일입니다.
위에 이야기한 내용들이 포함되어 있는데 간단히 정리한 것이니 참고로 한번 보세요.

오랫동안 프로그래밍을 하면서 느낀 점 가운데 한가지인데,
평범한 내용이라 별 도움이 안되는 분도 있겠지만, 나름대로 조금 도움이 될지도 모르겠군요.
방태윤 [nabty]   2010-08-25 23:57 X
잘 봤습니다.잊지말고 실천해 봐야겠네요,
함수이름 짓다보면 그냥 한글로 만들어 버릴까? 하는 생각이 들기도 합니다.
차마 그렇게하기는 좀 찜찜하고...ㅋ
개발자는 자리 깔아주면 애이름 정도는 척척 지을 정도의 작명가가 되어야 합니다. ^^
공감이 가는 말씀입니다.

+ -

관련 글 리스트
1003 bool 값과 에러 값을 리턴하는 함수 만들기에 대해. 김태선 10899 2010/07/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.