TryParse 패턴


발생일: 2013.06.26

문제:
오늘 스택오버플로우 뉴스레터에 흥미로운 질문이 하나 있더라.


메서드명이 `try`로 시작한다면, 어떤 걸 의미하는 건지,
이에 대한 공식적인 문서가 있는 지에 대한 질문이었다. 

실제로 나도 종종 `tryX` 형태의 메서드 이름을 사용했는데,
내 의도는 주로 '실패할 가능성이 있는 작업을 시도'한다는 거였다.

정말 공식적인 문서가 있는 걸까?


해결책:

위 질문은 C# 카테고리였는데,
이에 대한 마이크로소프트의 가이드가 있다.


위처럼 `tryX` 형태로 이름을 짓는 걸 `TryParse` 패턴이라 한다고 한다.
왜 하고 많은 것 중에 `TryParse`인지 정확히는 모르겠지만,
날짜나 시간 문자열을 Date 객체로 바꾸는 C#의 `Parse()/TryParse()` 메서드에서 유래된 이름인 것 같다.

여튼, 문서에서는 `TryParse` 패턴을 구현하려면,
같은 기능을 하는 두 가지 메서드를 만들면 된다고 가이드하고 있다.

첫 번째 메서드 `X`는 작업을 하고 문제가 생겼을 때 예외를 던진다.
두 번째 메서드인 `TryX`는 예외를 던지지 않는다. 대신, 성공/실패에 따른 부울 값을 리턴한다.
`TryX`에 의한 작업 결과는 추가로 전달한 out 파라미터에 저장한다.


예외 처리에 대해서도 자세히 가이드하고 있어서,
잘만 사용하면 이름만으로도 메서드의 동작을 명확하게 구분할 수 있을 것 같다.

`try`로 시작하는 메서드를 만나면,
  - 이 메서드는 불리언 값만 리턴하고,
  - 결과를 저장할 파라미터를 마지막 파라미터로 전달하며,
  - `try`를 제외한 이름을 가진 다른 메서드가 존재할 것이다.
라는 걸 추측할 수 있을 거다.

간단하게 자바스크립트로 구현해보면 대충 이런 모습일 것 같다.
어떤 문자열을 파싱하는 메서드라고 가정해보자.

    function parse(str) {
      var parsed;
      if (typeof str === 'string') {
        // parse string
        return parsed;
      }
      throw new Error('Parse Error');
    }

    function tryParse(str, result) {
      try {
        result.out = parse(str);
        return true;
      } catch (e) {
        return false;
      }
    }


`tryX` 형태의 메서드를 호출한다면 아래처럼 사용할 수 있겠다.

    var stringToParse = 'parse me';
    var result = {};

    tryParse(stringToParse, result);



이렇게 세세하고 꼼꼼하게, 네이밍과 함께 패턴을 정의해두면,
나중에 코드를 볼 때 저자의 의도까지 잘 이해할 수 있을 것 같다.

물론, 학습하기까진 꽤 오랜 시간이 걸리겠지만. ^^;
이런 방법 마음에 든다.


카테고리

분류 전체보기 (710)
About me. (6)
Daylogs (675)
영어공부 (0)
My works - 추억 (29)
비공개 (0)