2008.10.06 11:04 책 정리/Exceptional C++

단순한 라인 3개를 처리하는 이 함수에 있어서 얼마나 많은 실행 경로가 존재하는지 세어보자.
전제 조건
1.  판단하는 함수의 매개변수 순서는 무시하고, 실패한 소멸자도 무시하고 세어야 한다.
2. 호출된 함수들은 실패 또는 성공만 생각하여 세어야 한다.
3. 유일한 함수 호출 흐름으로 보고 같은 경로로 빠저나간다고 생각하여 세어야 한다.

아래는 우선 찾은 다음 보도록..알게되면 놀라게 된다. 

찾은 갯수 등급
3 평균
4-14 예외 인식
15-23 전문가적 자질



분석
이 23개의 실행 경로 중 예외가 없는 경로는 3군데 이며 예외가 보이지 않는 경로는 20개이다.

우선 예외가 없는 경로 3개

1.
if( e.Title() == "CEO" || e.Salary() > 100000 )
여기서, e.Title() == "CEO" 이것으로 인하여 실행 경로가 바뀔수 있다. 이 조건에 따라 || 다음에 오는것을 평가 하는 경로이냐 아니냐가 결정되기 때문이다. 이것은 || 에 의해서 경로가 바뀐다. 자세한 내용은 Effecitve C++ 에 단축평가라고 나와 있으니 참조 하도록

2.
e.Salary() > 100000  가 참인 경우

3.
e.Salary() > 100000  가 거짓인 경우

 

예외가 보이지 않는 경로 20개

4.
string EvaluateSalaryAndReturnName( Employee e )
Employee e 의 생성자가 실패 할 수 있음, string 반환에 대해서는 외부이므로 무시함

if( e.Title() == "CEO" || e.Salary() > 100000 )

5.
e.Title() 호출시 예외가 일어 날수 있음

6.
"CEO"가 e.Title()의 반환형으로 임시 개체로 변할대 예외가 일어 날 수 있음

7.
operator== 가 프로그래머가 정의 함수라면 예외가 일어 날 수 있음

8.
5번과 유사함, e.Salary() 자체가 예외를 일으킬수도 있고, e.Salary()의 반환형을 생성할때 예외가 일어 날수도 있음

9.
6번과 유사함, 100000은 임시 개체 생성할때 예외가 발생 할 수 있음

10.
7번과 유사하게 >를 프로그래머 제공 함수라면 예외가 발생 할 수 있음

11.
7번, 10번과 유사하게 ||를 프로그래머가 제공한 함수라면 예외를 일으킬 수 있다.

cout << e.First() << " " << e.Last() << " is overpaid" << endl;

12-16.
operator<< 에서 예외가 일어 날 수 있음

17-18.
e.First() 와 e.Last() 에서 예외가 일어 날 수 있음

return e.First() + " " + e.Last();

19-20.
17-18번과 똑같음

21.
5번과 유사하게 " " 에서 예외 발생 가능성이 있다.

22-23.
operator+ 연산을 프로그래머가 제공했다면, 예외가 일어 날수 있다.

가이드라인
항상.... 예외에 안전하게 짜자.

총평
정말 많은 부분에서 내가 예상했던 결과가 나오지 않을 수 있다는 점과, 예외에 안전한 코딩을 짜는게 중요하다는 것을 알게 되었던 장이다. 다음 장도 같은 이야기이니 좀 더 봐야 겠다.

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

댓글을 달아 주세요