Google 친구들의 goto 피하기
CS/Common 2009. 9. 11. 15:53Google 친구 아저씨들이 짠 코드를 보면 가끔 이런 형식이 보인다.
foo()나 bar()에서 실패시 이후의 코드를 처리하지 않기 위함인데,
결국은 리눅스 커널의 네트워크 관련 코드의 다음과 같은 일을 한다.
결국 goto를 사용하지 않고, do-while(0) 을 이용하여 break를 사용해서 분기를 제어한 것인데,
나는 커널 코드에 익숙해져 있어서 인지, goto가 더 명시적이고 좋아 보인다.
또한 do-while(0)과 break를 이용한 방법은 그 안에 loop가 없는 경우만 사용할 수 있는 단점도 있다.
하지만,
요렇게 된 코드를
요렇게 쓸 수 있다는 점에서는 참 매력적인 방법이다.
첨에 이 코드를 봤을때는 그냥 그렇구나 하고 지나갔었다.
그런데 우연히 미팅 시간에 팀원들과 이 코드에 대해서 얘기를 하게 되었는데, 사람들이 좋은 방법이다... 라고 대부분 얘기 하길래 포스팅 까지... 역시 셀로판귀... 팔락팔락... orz
01 | do |
02 | { |
03 | result = false ; |
04 |
05 | ... |
06 |
07 | if ( result = foo() ) |
08 | break ; |
09 | ... |
10 |
11 | if ( result = bar() ) |
12 | break ; |
13 | |
14 | ... |
15 | } while (0); |
16 |
17 | if ( false == result) |
18 | { |
19 | ... |
20 | } |
foo()나 bar()에서 실패시 이후의 코드를 처리하지 않기 위함인데,
결국은 리눅스 커널의 네트워크 관련 코드의 다음과 같은 일을 한다.
01 | if ( result = foo() ) |
02 | goto FAILED; |
03 |
04 | ... |
05 |
06 | if ( result = basr() ) |
07 | goto FAILED; |
08 |
09 | ... |
10 |
11 | FAILED : |
12 | ... |
결국 goto를 사용하지 않고, do-while(0) 을 이용하여 break를 사용해서 분기를 제어한 것인데,
나는 커널 코드에 익숙해져 있어서 인지, goto가 더 명시적이고 좋아 보인다.
또한 do-while(0)과 break를 이용한 방법은 그 안에 loop가 없는 경우만 사용할 수 있는 단점도 있다.
하지만,
01 | if ( ) |
02 | { |
03 | if ( ) |
04 | { |
05 | if ( ) |
06 | { |
07 | if ( ) |
08 | { |
09 | ... |
10 | } |
11 | } |
12 | } |
13 | } |
요렇게 된 코드를
01 | do { |
02 | if (! ) |
03 | { |
04 | break ; |
05 | } |
06 |
07 | if (! ) |
08 | { |
09 | break ; |
10 | } |
11 |
12 | if (! ) |
13 | { |
14 | break ; |
15 | } |
16 |
17 | if (! ) |
18 | { |
19 | break ; |
20 | } |
21 | } while (0); |
요렇게 쓸 수 있다는 점에서는 참 매력적인 방법이다.
첨에 이 코드를 봤을때는 그냥 그렇구나 하고 지나갔었다.
그런데 우연히 미팅 시간에 팀원들과 이 코드에 대해서 얘기를 하게 되었는데, 사람들이 좋은 방법이다... 라고 대부분 얘기 하길래 포스팅 까지... 역시 셀로판귀... 팔락팔락... orz