[질문] while ( !sleep(1) ) { ... } 어떻게 생각하십니까?
글쓴이: 오호라 / 작성시간: 금, 2007/07/06 - 7:44오후
1번
while( !sleep(1) ) { ... }
2번
while( 1 ) { sleep( 1 ); ... }
둘은 똑같은가요?
1번을 쓰니까. 다른 분들이 의아해 하시더군요. 이게 뭐냐?
SLEEP(3) Linux Programmer's Manual SLEEP(3) NAME sleep - Sleep for the specified number of seconds ... RETURN VALUE Zero if the requested time has elapsed, or the number of seconds left to sleep. ...
개인적인 생각으로는 1번이 좀더 애매모호하지만 좀더 테크닉한거 같은데 아닌가요?
코딩도 대중성을 따라하는 것인지...ㅠㅠ
Forums:
좀더 테크닉한지는 잘 모르겠지만
좀더 애매모호한것은 확실하군요;;
주위분들이 의아해했다구 하시니 더욱,,
될수있으면 최대한 많은 사람들이(바보라 하더라도) 명확하게 알아볼수 있는 스타일이 좋겠지요
둘다 다른거 아닌가요?
1번은 sleep()의 리턴값이 상황에 따라 다르기 때문에
int형으로 0부터 다양하게 나올겁니다.
아마도 while()에 이렇게 나올거라 예상합니다.
1.while(0)
2.while(1)
3.while(2)
4........
(자다가 남은 시간이 리턴됨.....)
그때그때 달라요가 되겠죠.
2번은 루플를 돌다가 sleep()를 호출해서 지정된 시간만큼 아마도 잠을(??) 자겠죠.
프로그래머가 의도하는 바가 분명하죠.
제게는 그렇게 보입니다.
봄들판에서다
봄들판에서다
!sleep(1)이므로 결과는
!sleep(1)이므로 결과는 0이거나 1입니다. 다시 코드를 살펴보십시오.
큰 상관은 없지만 참고할만한 테크닉: !!x (x가 0이나 1이 아니면 x를 1로 만든다.)
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
그대로 읽으면 '1초
그대로 읽으면 '1초 쉬지 않을 동안' 이라서
그런지 코드가 와닿지가 않네요.
$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}
큭큭
큭큭
그런 면에서는 DOS의 conio 라이브러리에서 많이 쓰는 while(!kbhit())이 while(!cond) 형태에서는 꽤 직관적인 거로군요.
(말고 좋은 예 생각나는 게 없군요.)
생각할 거리 많은 스레드라서 띄워 봅니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
취미로 만드는 프로그램이라면 관계 없을 것 같습니다.
취미로 만드는 프로그램에 남들이 뭐라할 이유는 없으니까요.
자신만 알아볼 수 있으면 되는거죠.
다만 회사에서 코딩할 때는 좀 더 직관적으로 알아볼 수 있게 코딩하는게 좋을 듯 합니다. 다른 사람들이 봐야 하는 코드에서 예술(?) 코딩은 도리어 코드를 설명하는 시간만 늘리는 결과를 초래합니다.
그냥 쓰시면되요.
그냥 쓰시면되요. 가독성에 별 문제 없어 보이는군요.
"테크닉"하다는 게
"테크닉"하다는 게 어떤 의미인지는 모르겠지만,
1. "이 인간 코드를 비비 꼬아놨네?" 하고 지나가던 사람이 한번 감탄(?)하게 만든다던가,
2. "우씨, sleep의 결과값이 도대체 뭐야?" 하고 테크니컬 매뉴얼을 다시 뒤져보게 만드는 효과가 있겠습니다.
그리고 첫번째와 두번째의 코드는 분명 다릅니다. sleep은 중간에 signal이 발생하면 sleep하지 않은 시간을 돌려준다고 하네요. 즉 sleep을 하려고 하는 순간 signal이 발생하면 1을 리턴할 가능성이 있습니다.
첫번째 코드는 명시적으로 "sleep을 하려고 하는 순간 signal이 발생하는 백만분의 1 확률 상황을 나는 캐치하고 싶다. 이 경우에만 while loop를 끝내라!"라고 요구하는 코드입니다. "sleep의 결과값이 이러이러하므로 이런 뜻이다."라고 주석을 달아 두는 것이 좋겠습니다. 두번째 코드와는 전혀 의미가 다릅니다.
첫번째 코드를 짜면서 두번째의 동작을 원하셨다면 애매모호하면서 untechnical, unmaintainable한 코드라고 해야겠습니다. (이른바 테스트할 때에는 항상 잘 돌다가 고객 코앞에서 터지는 코드...)
2번효과를 봤습니다..ㅋㅋㅋ
그러나, 결과는 1번으로 고치라는...ㅋㅋㅋ
말씀하신 내용이 제가 의도한 봐입니다.
정확하게 1초동안 슬립하지 않으면 오작동을 할수 있겠지요. 뻗는다( core ) vs 부작용 ( side efftect )
물론 마지막엔 시그널처리해서 나갑니다. 혹시나 테스트환경시 이상한 시그널이나, 기타 다른 데몬이나 프로그램에 영향을 받지 않을까해서 써본 이유와 완벽하지는 않지만, 어느정도 [확정된 1초]를 쉬기 위함이죠.
아무튼 두세가지 이유로 저런 야스무리한 코드를 썼습니다. ^^;
Hello World.
이건 어떠세요? for( ;
이건 어떠세요?
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
음...
코드는 가급적 '의도가 명확히 드러나도록' 작성하시는게 좋습니다.
명세서와 코드가 일치하도록, 그리고 누가 와서 봐도 쉽게 이해할 수 있도록...
명세서에 루프의 탈출 조건을 sleep(1) 의 실패(?)를 내걸었다면..
1번이 타당하겠지만..
그렇지 않다면, 오히려 의도를 이해하기 어렵게 만드는 코드일 뿐이고..
(의도가 주석등으로 명확히 기술되지 않았다면, 이 코드를 보는 사람은 2번을 떠올리면서
왜 이렇게 짰을까? 하고 궁금해 하겠죠..)
더구나, 예측 불가능한 상태를 탈출 조건으로 거는 것은..
코드의 불확실성을 높이기만 할 뿐, 운용이나 디버깅 등에는 좋지 않다고 봅니다..
불완전 sleep 의 검출이 필요한 케이스라 하더라도, 가급적 루프내 에서 검출해서..
에러처리하고 명시적으로 루프를 벗어나도록 작성하는 것이 어떨까 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기