【问题标题】:Any idea, how to avoid if statements here任何想法,如何在这里避免 if 语句
【发布时间】:2016-11-07 07:15:29
【问题描述】:

这是代码,

    User.createCriteria().list(offset: filter.offset, max: filter.max) {
        if (filter.first-name) eq('firstName', filter.first-name)
        if (filter.last-name) eq('lastName', filter.last-name)
        if (filter.email) eq('email', filter.email)
        if (filter.status) eq('status', filter.status)
        if (...) ...
        .
        .
        order(filter.sort, 'desc')
        order('name')
    }

这里有什么办法可以避免ifs?

【问题讨论】:

  • 你可以使用groovy三元运算符。

标签: grails groovy refactoring grails-orm criteria


【解决方案1】:

地图呢?

User.createCriteria().list(offset: filter.offset, max: filter.max) {
    [
        'firstName' : filter.first-name,
        'lastName'  : filter.last-name,
        'email'     : filter.email,
        'status'    : filter.status
    ].findAll { it.value }.each { eq it.key, it.value }

    order(filter.sort, 'desc')
    order('name')
}

它可能更加动态,只需列出属性名称。


更新:使用闭包作为键怎么样?

User.createCriteria().list(offset: filter.offset, max: filter.max) {
    [
        { eq 'firstName', it } : filter.first-name,
        { eq 'lastName', it }  : filter.last-name,
        { eq 'email', it }     : filter.email,
        { eq 'status', it }    : filter.status,
        { lt 'dob', it }       : filter.dob
    ].findAll { it.value }.each { it.key(it.value) }

    order(filter.sort, 'desc')
    order('name')
}

我相信it 参数可以使用curry 之类的东西抽象出来

【讨论】:

  • 实际上,在我的情况下,键和属性名称是不同的。不过,可以做到这一点。另一个问题是,我需要的不仅仅是eq;有一些,比如ilikene、一些协会的财产等等。但无论如何,这是个好主意。 +1
  • 我认为键/值应该颠倒,这样阅读起来会更直接......一个好的点是iffindAll)只在一个地方表示,并应用于集合。
【解决方案2】:

为了使其可读性更低但重复性更低,您可以包含可搜索项目的地图并尝试以下操作:

filter.searchList=[first-name:'firstName',last-name:'lastName',
email:'email', status:'status']
User.createCriteria().list(offset: filter.offset, max: filter.max) {
     filter.searchList?.each { k,v ->
      !(filter."${k}" ?: eq(v, filter."${k}")
     }
    .
    .
    order(filter.sort, 'desc')
    order('name')
}

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多