首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby代码重构

Ruby代码重构
EN

Code Review用户
提问于 2012-05-26 21:25:46
回答 1查看 118关注 0票数 0

我有n次类似的陈述

代码语言:javascript
复制
    if trigger_data.tt_closed
      unless trouble_ticket.changes.key?(:status)
        @run = 0
        break
      end
      unless trouble_ticket.changes[:status][1] == "Closed"
        @run = 0
        break
      end
    end

    if trigger_data.tt_assignee
      unless trouble_ticket.changes.key?(:assigned_to)
        @run = 0
        break
      end
      unless trouble_ticket.changes[:assigned_to][1] == trigger_data.tt_assignee
        @run
        break
      end
    end

如何重构代码?可能是动态语句生成,并将一些散列传递到输入。我是元编程新手。请给我建议

EN

回答 1

Code Review用户

回答已采纳

发布于 2012-05-26 23:14:11

你在圈里吗?下面是一种可能的方法

代码语言:javascript
复制
def check(td, tt, trigger, key, ticket_changes)
    if td.send(trigger)
      unless tt.changes.key?(key)
        @run = 0
        return true
      end
      unless tt.changes[key][1] == ticket_changes
        @run = 0
        return true
      end
    end
    return false
end

def metacheck(td, tt)
    [[:tt_closed, :status, "Closed"],
     [:tt_assignee, :assigned_to, td.tt_assignee]].each do |k|
        return if check(td, tt, k[0], k[1], k[2])
     end
end


metacheck(trigger_data, trouble_ticket)

我用了一组三胞胎来检查条件。检查可以进一步简化为

代码语言:javascript
复制
def check(td, tt, trigger, key, ticket_changes)
    return false unless td.send(trigger)
    if !tt.changes.key?(key) or (tt.changes[key][1] != ticket_changes)
        @run = 0
        return true
    end
    return false
end

我们可以把所有的条件结合起来。但我认为这最好地抓住了最初的内涵。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/12100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档