가능한 한 실패 원자적으로 만들자. & 예외를 무시하지 말라
가능한 한 실패 원자적으로 만들자.
일반적으로 트랜잭션 같이 호출된 메소드가 실패하더라도 해당 객체는 메소드 호출 전 상태를 유지해야 한다. 이를 실패 원자적(failure-atomic)이라고 한다. 불변 객체는 태생적으로 변경되지 않으니 실패 원자적이다.
가변 객체는 실패 원자성을 보존해줘야 한다.
- 일반적으로 객체 내부 상태 변경 전 잠재적 예외 가능성을 유효성 검사로 걸러낸다.
- 실패할 가능성이 있는 모든 코드를, 객체의 상태를 바꾸는 코드보다 앞에 배치하는 방법이 있다.
- 객체의 임시 복사본을 두고 작업을 수행하고 성공이 되면 원래 객체와 교체하는 방법이 있다.
- 작업 도중 발생하는 실패를 가로채는 복구 코드를 작성해여 작업 전으로 되돌리는 방법도 있다.
물론 실패 원자성을 보장하면 좋지만 항상 그럴 수는 없다. 예를 들어 비용이 너무 높을 때가 그 예다.
예외를 무시하지 말라
예외를 뱉는 경우 항상 이유가 있다. 그냥 뱉는 건 없다. 물론 catch를 비워 안쓰는 경우도 있다. 예를 들어 FileInpuStream을 닫을 때 그렇다.
파일 상태 변경이 없으니 복구할 일이 없으며, 이후 작업을 중단할 필요도 없다. 이런 경우 변수 명으로 unused, ignored등으로 명시적으로 표현해야 가독성이 높아진다