Anorm Parsers更好的代码布局

时间:2014-10-09 03:46:32

标签: scala anorm

我正在使用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等,因此第一个函数需要特定于每一行

1 个答案:

答案 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) }

还有其他可能的解决方案涉及更多的工具,但我不确定在你的情况下值得努力。