2014-10-09 39 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