가능한 한 실패 원자적으로 만들자. & 예외를 무시하지 말라

가능한 한 실패 원자적으로 만들자.

일반적으로 트랜잭션 같이 호출된 메소드가 실패하더라도 해당 객체는 메소드 호출 전 상태를 유지해야 한다. 이를 실패 원자적(failure-atomic)이라고 한다. 불변 객체는 태생적으로 변경되지 않으니 실패 원자적이다.

가변 객체는 실패 원자성을 보존해줘야 한다.

  1. 일반적으로 객체 내부 상태 변경 전 잠재적 예외 가능성을 유효성 검사로 걸러낸다.
  2. 실패할 가능성이 있는 모든 코드를, 객체의 상태를 바꾸는 코드보다 앞에 배치하는 방법이 있다.
  3. 객체의 임시 복사본을 두고 작업을 수행하고 성공이 되면 원래 객체와 교체하는 방법이 있다.
  4. 작업 도중 발생하는 실패를 가로채는 복구 코드를 작성해여 작업 전으로 되돌리는 방법도 있다.

물론 실패 원자성을 보장하면 좋지만 항상 그럴 수는 없다. 예를 들어 비용이 너무 높을 때가 그 예다.

예외를 무시하지 말라

예외를 뱉는 경우 항상 이유가 있다. 그냥 뱉는 건 없다. 물론 catch를 비워 안쓰는 경우도 있다. 예를 들어 FileInpuStream을 닫을 때 그렇다. 파일 상태 변경이 없으니 복구할 일이 없으며, 이후 작업을 중단할 필요도 없다. 이런 경우 변수 명으로 unused, ignored등으로 명시적으로 표현해야 가독성이 높아진다