예외를 이용하지 않은 오류 처리 - Option (1)

Jason Kim·2020년 5월 5일
0

이 시리즈는 "스칼라로 배우는 함수형 프로그래밍"을 TypeScript로 실습한 내용을 정리하고 있습니다

예외의 장단점

참조에 투명한 표현식: 문맥에 의존하지 않으며 지역적으로 추론 가능
참조에 불투명한 표현식: 문맥에 의존적이고 전역적인 추론이 필요

예외는 참조 투명성을 위반하고 문맥 의존성을 도입한다. 치환 모형을 사용할 수 없고 코드의 흐름이 혼란스러워진다.

함수의 타입만 보고서는 예외 발생 여부를 알 수 없기 때문에 형식에 안전하지 않다.

해결책

예외를 던지는 대신 예외적인 조건이 발생했음을 뜻하는 값을 돌려준다. 오류처리와 전파에 대한 공통 패턴들을 고차 함수를 이용해서 캡슐화한다. 이렇게 하면 형식에 완전히 안전하며 오류 처리 논리의 통합과 중앙집중화를 유지할 수 있다.

예외의 가능한 대안들

부분 함수(partial function): 일부 입력에 대해서는 출력 값이 정의되지 않는 함수
특정 계산을 할 수 없는 경우 null이나 특수 값(0.0, -1등)을 리턴하는 함수를 떠올려 볼 수 있겠다.

그러나 이런 접근 방법은 여러가지 문제점을 안고 있다.

  • 오류의 소리 없는 전파. 오류가 코드의 훨씬 나중 부분에서 검출되는 경우가 많다.
  • 오류 코드를 점검하는 명시적이고 판에 박힌 if문들이 늘어난다. 각 호출마다 오류 코드를 점검하고 어떤 방식으로든 취합해야 하기 때문
  • 출력 형식에 따라서는 경계값을 정할 수가 없어서 다형적 코드에는 사용이 불가능.
  • 호출자에게 특별한 방침이나 호출 규약을 요구한다. 이렇게되면 모든 인수를 균일한 방식으로 처리하는 고차 함수에 전달하기 어려워진다.

다른 대안으로는 함수가 입력을 처리할 수 없을때 무엇을 해야할지를 인수로 받을수도 있다. 그러나 함수 호출자가 내부 구현을 알고 있어야 하고, 그런 경우에도 항상 어떤 결과값을 함수의 출력 형식으로 돌려주어야 한다는 단점이 있다.

Option 자료 형식

함수가 답을 내지 못한다는 점은 반환 형식으로 통해서 명시적으로 표현함으로서 오류 처리 전략을 호출자에게 미룰 수 있다. 계산이 가능한 경우는 Some, 불가능한 경우에는 None으로 표현되는 Option을 도입한다.

계산이 불가능한 경우가 있다는 점이 출력 형식에 반영 되어 있으며, 이 경우 정해진 출력 형식의 값을 돌려주는 완전 함수(total function)으로 만들 수 있다.

연습문제 4.1

https://github.com/JsonKim/fpinscala-with-typescript/commit/1e930e57216edc143345161b9706d642e3f0cdd6

0개의 댓글