【问题标题】:Better code layout for Anorm Parsers更好的异常分析器代码布局
【发布时间】:2014-10-09 03:46:32
【问题描述】:

我正在使用 Scala、Anorm 和 Play2 框架从 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等,所以第一个函数需要针对每一行

【问题讨论】:

    标签: scala anorm


    【解决方案1】:

    行解析器的问题在于它们旨在用于整行。不过,我建议您的问题不在于那个问题,而在于反复给出巨大的名称,这些名称使所有内容变得如此混乱,以至于您无法再关注逻辑了。看看这个:

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

    很难弄错。如果您觉得这没有充分记录,请在解析器行中添加 cmets,如下所示:

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

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

    【讨论】:

    • 我们有很多超过 15 列的表,所以我仍然会以长行结束,例如:case 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 等似乎更易于维护,因为您可以轻松跟踪每个变量的转换。
    • @swoogles - 重点是,你不会犯错。文档和后续转换都发生在垂直列表中。其余的只需要具有相同数量的元素。
    • @swoogles 如果您有许多包含 15 列以上的表,那么规范化或分区您的数据可能是正确的。然后你可以将多个解析器组合成一个。
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2018-05-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多