이거 아니면 저것

오류를 null로 처리하거나 부적절하게 처리한 결과로 수정한 버그가 몇 개입니까? Javascript에서는 다음과 같은 오류를 보는 것이 매우 일반적입니다. can can call x of undefined. 😞 유형은 코드 내에서 이 문제를 해결하는 데 도움이 되지만 종종 다른 라이브러리를 사용해야 합니다.

어느 쪽 ↔️ 유형을 사용하면 더 안전한 알고리즘을 만들고 다른 라이브러리 코드를 애플리케이션에 안전하게 만들 수 있습니다. 중 ↔️ 유형은 값을 둘러싼 래퍼 또는 컨테이너이며 컨테이너는 Right ➡️ 또는 Left ⬅️의 두 가지 인스턴스로 제공됩니다. 파이프라인에서 오른쪽 ➡️ 인스턴스는 처리 파이프라인을 따라 계속 진행되고 왼쪽은 그렇지 않습니다. 맵 및 체인 메서드를 사용하여 초기 값을 취하고 Left ⬅️ 또는 Right ➡️ 인스턴스에 포함된 결과를 반환하는 모두 ↔️ 파이프라인을 만들 수 있습니다. 접는 방법.

Either.of(1)
  .map(add(1))
  .map(multiply(2))
  .fold(
    v => console.log('Left: ', v),
    v => console.log('Right: ', v) // Right: 4
  )


이 예에서 우리는 값 1을 취하여 어느 ↔️ 컨테이너에 넣은 다음 변환 함수를 사용하여 해당 컨테이너를 매핑합니다. 첫 번째 함수는 중 ↔️의 값에 1을 더하고 두 번째 맵에는 새 값에 2를 곱하는 함수가 있습니다. 이 함수들 각각은 값이 숫자가 아닌지 확인하지 않습니다. 더하기 기능과 곱하기 기능은 항상 예상 유형의 값을 제공하기 위해 둘 중 하나에 의존합니다. 값이 숫자인지 확인하기 위해 연쇄 함수를 사용합시다.

Either.of(1)
  .chain(isNumber)
  .map(add(1))
  .map(multiply(2))
  .fold(
    v => console.log('Left: ', v),
    v => console.log('Right: ', v)
  )

function isNumber (v) {
  if (is(Number, v)) {
    return Right(v)
  } else {
    return Left('Not a Number')
  }
}


체인 방법을 추가하여 함수의 결과로 다른 Each ↔️ 인스턴스를 전달할 수 있습니다. 이를 통해 값이 숫자가 아닌 경우에는 Each ↔️를 오른쪽 ➡️에서 왼쪽 ⬅️으로 변경할 수 있습니다. 새로운 권리 ➡️를 컨테이너로 반환할 수 있습니다. 이는 값이 isNumber 검사를 통과하는 경우 컨테이너에서만 실행되기 때문에 더하기 및 곱하기 메서드를 안전하게 실행할 수 있는 기능을 제공합니다.

슬픈 경우를 시도해 보겠습니다.

Either.of(null)
  .chain(isNumber)
  .map(add(1))
  .map(multiply(2))
  .fold(
    v => console.log('Left: ', v),
    v => console.log('Right: ', v)
  )

function isNumber (v) {
  if (is(Number, v)) {
    return Right(v)
  } else {
    return Left('Not a Number')
  }
}


더하기 및 곱하기 함수는 절대 호출되지 않습니다. isNumber 함수의 결과가 Left ⬅️ 인스턴스이기 때문에 건너뜁니다.

이 패턴을 사용하면 모든 기능을 안전하게 만들 수 있습니다. fromNullable 및 tryCatch의 두 가지 공통 기능이 있습니다.

fromNullable



fromNullable은 값이 null인지 테스트하고 null이 아니면 Right를 반환합니다. ➡️ null이면 Left ⬅️를 반환합니다.

Either.of(null)
  .chain(fromNullable)
  .fold(
    v => console.log('Left: ', v),
    () => console.log('does not get called')
  )


tryCatch



tryCatch는 함수를 취하고 해당 함수 주위에 tryCatch를 래핑합니다. 오류가 발생하면 오류와 함께 Left ⬅️를 반환하고, 오류가 없으면 함수의 결과를 반환합니다.

tryCatch(() => {
  throw new Error('Catch me if you can!')
})
  .fold(
    v => console.log('You got me'),
    v => conosle.log('You can\'t catch me, I am the gingerbread man.')
  )


요약



어느 쪽 ↔️ 유형은 로직 파이프라인 내에서 null과 오류를 처리하기 위한 공통 기능 의미 체계를 가진 강력한 도구를 제공합니다. 이 패턴을 사용하면 구성할 수 있는 모든 함수에 유효성 검사 논리를 삽입하지 않고도 더 안전한 코드를 작성할 수 있습니다.

데노 사용? 이 패키지를 확인하십시오: https://github.com/hyper63/either

예시 프로젝트



여기에서 예제 프로젝트를 확인하세요.

hyper63/either-examples

NOTE: The example code is run using Deno 1.7, but you could use Either with the browser or NodeJS



Brendan ChurchUnsplash의 사진

좋은 웹페이지 즐겨찾기