我发现有很多方法可以给猫皮,但是首选的写法是什么
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路由等有关的注意事项吗?
答案 0 :(得分:2)
以上样式均未对代码可维护性带来任何好处。如果必须选择其中一种,我会采用“最匹配比赛”方法。原因是执行了第一个匹配的路由,因此应首先使用更具体的路由定义。
以这个为例
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)
匹配。