클링온 번역 서비스


스토리

이 연습 문제에서는 유료 회원에게 품질 보증을 제공하는 TranslationService를 만들어요.

합리적인 시간 안에 어떤 번역 _요청_이든 처리할 수 있는 마법 같은 번역 API를 발견했고, 이걸 활용하고 싶어요.

이 마법 같은 API는 아주 최소한의 인터페이스만 가지고 있어요:

번역 가져오기

api.fetch(text)는 text의 번역을 가져와서 두 개의 값을 반환해요:

  • translation: 실제 번역
  • quality: 숫자로 표현된 품질

아직 요청되지 않아서 사용할 수 있는 번역이 없으면 API가 오류를 발생시켜요. 텍스트를 번역할 수 없을 때도 마찬가지예요.

번역 요청하기

api.request(text, callback)는 text의 번역을 요청하고, 준비되면 값을 넘기지 않고 callback을 호출해요.

request API는 불안정해서, 가끔 API가 callback을 오류와 함께 호출해요. 그럴 때는 다시 요청해도 괜찮아요.

⚠ 경고! ⚠

이전 사용자 몇 명이 프로그래밍할 때 게을러서, 텍스트가 이미 번역되었는지 확인도 하지 않고 항상 번역을 요청했어요. 그래서 API는 이미 번역된 텍스트에 대해서는 오류를 반환하고, 모든 접근을 완전히, 영원히 차단해요.

작업

다음은 번역 서비스 스토리에 맞는 작업의 예시예요:

  • 품질은 무시하고 번역 가져오기
  • 여러 번역을 한꺼번에 가져오기, 전부 아니면 전무
  • 번역을 요청하되 최대 두 번까지 재시도하기
  • 번역을 가져오거나, 품질을 확인하거나, 요청하기

용어

다음은 안내문(스텁 주석 포함)에서 반복되는 용어에 대한 권장 사항이지 규칙은 아니에요.

  • _주입된 의존성_은 TranslationService, 또는 API라고 불러요.
  • 서비스는 비동기지만, 이 점은 언급하지 않아요.
  • Future에서의 실패는 API가 오류를 발생시켜요로 표현해요.
  • Callback에서의 실패는 API가 callback을 오류와 함께 호출해요로 표현해요.

모든 번역 텍스트는 클링온어에서 영어로 번역하는 것이에요.

구현

참고

유의 사항

'arlogh Qoylu'pu'?의 올바른 번역은 **How many times has it been heard?**예요.