2014-10-09 18 views
1

我正在使用Scala,Anorm和Play2框架从SQL表中检索数据。在很多地方我有这样的代码:Anorm Parsers更好的代码布局

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等,所以第一个函数需要针对每一行都具体。

回答

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

有涉及很多更多的工具其他可能的解决方案,但我不知道你的情况,这是值得的。

+0

我们有许多具有15列以上的表格,所以我仍然会得到如下长线: 情况a〜b〜c〜d〜e〜f〜g〜h〜i〜j〜k〜l〜m 〜n => EmailViewRecord(a,b,c,d,e,f,g,h,i,j,k,l,m,n) 这很难理解,因为您必须尝试遵循 将1个垂直列表转换为附加到彼此的 的2个水平列表。一种使用3列的方法 - col_a - > a - > a \ n col_b - > b - > b \ n 等似乎更易于维护,因为您可以轻松跟踪每个变量的转换。 – 2014-10-09 13:18:39

+0

@swoogles - 要点是,你不会犯错误。文档和转换后的所有内容都发生在垂直列表中。剩下的只需要有相同数量的元素。 – 2014-10-09 20:28:21

+0

@sowogles如果你有许多包含15列以上的表格,可能需要对数据进行规范化或分区。然后你可以将多个解析器组合成一个。 – 2014-10-11 19:23:45