C 함수 부작용이 있는 기타 함수 호출

1243 단어 c
최근에 나는 한 항목에서 이런 모델을 많이 보았다.
void func(void) {
  retVal = thing1WithSideEffects();
  if (0 == retVal) thing2WithSideEffects();
  if (0 == retVal) thing3WithSideEffects()
  if (0 == retVal) thing4WithSideEffects();

  if (0 != retVal) return retVal;

  // do other func()y stuff
}
부작용이란 시스템 상태의 변화를 가리킨다.부작용은 새로 열린 파일, 메모리 분배, TCP 연결 구축 등일 수 있습니다.
일단 스타일.retVal의 테스트는 사실상 위의 줄에서 물건을 검사하기 때문에 이 코드를 읽는 것은 매우 이상하다.
비록 나는 꼬치꼬치 캐묻지만, 나는 '유다 조건' 을 싫어한다.
그러나 더 중요한 것은 어떤 호출이 실패하면 시스템이 불확실한 상태에 처하게 된다는 것이다.만약retVal이 7줄에 값이 있다면, 실패가 무엇인지 알 수 없습니다. 부작용을 취소하기 위해 청소 함수를 호출할 수 없습니다.func() 오류가 발견된 호출 프로그램/함수는 청소를 알지 않으면 다시 호출할 수 없습니다. func()그래, 이 정도는 어려워. 왜냐하면 너는 결국 이런 일을 당하게 될 거야.
void func(void)
{
  if (retVal = thing1WithSideEffects()) return retVal;
  if (retVal = thing2WithSideEffects()) {
    undoThing1();
    return retVal;
  }
  if (retVal = thing3WithSideEffects()) {
    undoThing2();
    undoThing1();
    return retVal;
  }
  // ad nauseum -- you get the idea
}
좀 메스꺼워요.
나는 네가 마침 마감일 전에 이 모든 것을 하고 싶지 않고 일을 순조롭게 진행하려고 하지만, 우리가 작성한 코드는 왕왕 우리보다 오래 산다는 것을 완전히 이해한다.
하지만 우리는 할 수 있고 더 잘해야 한다.

좋은 웹페이지 즐겨찾기