Каков наилучший способ или стиль написания маршрутов Akka HTTP? - PullRequest
0 голосов
/ 06 февраля 2019

Я считаю, что есть много способов снять шкуру с кошки, но каков предпочтительный стиль написания маршрутов? 1001 *

def leaderboardGet1(): Route = {
  get {
    pathEnd {
      parameter('name) { name =>
        complete(. . .)
      } ~
      complete(. . .)
    } ~
    pathPrefix(base64identifier) { leaderboardIdentifier =>
      pathEnd {
        complete(. . .)
      } ~
      pathPrefix(base64identifier) { memberIdentifier =>
        pathEnd {
          complete(. . .)
        }
      }
    } ~
    complete {
      HttpResponse(BadRequest, entity = "Bad GET /leaderboard request")
    }
  }
}

Я назову первый стиль совпадения наименее первым, а второй стиль совпадениясамый первый.Если кто-то знает лучшие имена, пожалуйста, дайте мне знать.

def leaderboardGet2(): Route = {
  get {
    pathPrefix(base64identifier) { leaderboardIdentifier =>
      pathPrefix(base64identifier) { memberIdentifier =>
        pathEnd {
          complete(. . .)
        }
      } ~
      pathEnd {
        complete(. . .)
        }
      }
    } ~
    pathEnd {
      parameter('name) { name =>
        complete(. . .)
        }
      } ~
      complete(. . .)
    } ~
    complete {
      HttpResponse(BadRequest, entity = "Bad GET /leaderboard request")
    }
  }
}

Я ищу больше для удобочитаемости / удобства сопровождения в стиле кодирования, но у меня нет особого смысла.Мне больше нравится второй стиль, так как мне легче увидеть, какой будет самый длинный URL-адрес, но других мнений нет.

Могут быть некоторые соображения производительности, статистически зависящие от того, какие URL-адреса запрашиваются чаще всего, но ясомнение это важно.

Существуют ли другие соображения, касающиеся стиля функционального программирования, идиоматической Scala, идиоматической маршрутизации Spray и т. д .?

1 Ответ

0 голосов
/ 06 февраля 2019

Ни один из вышеперечисленных стилей не дает вам никакого преимущества в поддержке кода.Если бы мне пришлось выбрать один из них, я бы выбрал подход «самый лучший матч».Причина этого в том, что выполняется первый соответствующий маршрут, поэтому более конкретные определения маршрута должны идти первыми.

Взять это в качестве примера

get {
  pathPrefix(JavaUUID) { id =>
    pathEnd {
      complete(s"Got UUID $id")
    }
  } ~ pathPrefix(Segment) { someOtherId =>
    pathEnd {
      complete(s"Got Other ID $someOtherId")
    }
  }
}

Таким образом, если сначала обрабатывается pathPrefix(Segment), pathPrefix(JavaUUID) никогда не получит результат, так как ему соответствует pathPrefix(Segment).

...