我正在使用Scala,Anorm和Play2 Framework从SQL表中检索数据。在很多地方我都有这样的代码:
val emailViewRecordParser: RowParser[EmailViewRecord] = {
str( "sfname" ) ~
str( "slname" ) ~
str( "practice_name" ) ~
str( "email" ) ~
str( "phone_area_code" ) map {
case
subscriberFirstName ~
subscriberLastName ~
practiceName ~
subscriberEmail ~
phoneAreaCode
deviceAddress =>
EmailViewRecord(
subscriberFirstName,
subscriberLastName,
practiceName,
subscriberEmail,
phoneAreaCode
)
}
}
这很难管理,因为很容易弄乱参数排序/长度。理想情况下,我们可以写下以下内容:
val emailViewRecordParser: RowParser[EmailViewRecord] = {
EmailViewRecord(
str( "sfname" ) map { subscriberFirstName } subscriberFirstName,
str( "slname" ) map { subscriberLastName } subscriberLastName,
str( "practice_name" ) map { practiceName } practiceName,
str( "email" ) map { subscriberEmail } subscriberEmail,
str( "phone_area_code" ) map { phoneAreaCode } phoneAreaCode
)
}
在这些线路上实现布局的有效方法是什么?此外,开头的'str'函数可以是int,date等,因此第一个函数需要特定于每一行
答案 0 :(得分:2)
行解析器的问题在于它们旨在用于整行。我建议你的问题不是那个问题,而是反复给出巨大的名字,这些名字使得一切都变得混乱,以至于你不能再注意逻辑了。看看这个:
str("sfname") ~ str("slname") ~ str("practice_name") ~
str("email") ~ str("phone_area_code") map {
case a~b~c~d~e => EmailViewRecord(a,b,c,d,e)
}
这样做更难。如果您认为文档记录不充分,请在解析器行上添加注释,如下所示:
val parser =
str("sfname") ~ // Subscriber first name
...
str("phone_area_code") // You'll never guess that this is the area code.
parser map { case a~b~c~d~e => EmailViewRecord(a,b,c,d,e) }
还有其他可能的解决方案涉及更多的工具,但我不确定在你的情况下值得努力。