【问题标题】:How can I make these "if" statements more DRY?我怎样才能使这些“if”语句更加干燥?
【发布时间】:2013-06-08 17:46:19
【问题描述】:

我正在尝试布局一些部分,如下所示:

if controller == home
   render partail 0
else
   render partial 1
end

render partial 2

render partial 3

if controller == home
   render partail 4
end

render partial 5

我已将if controller == home 部分重复了三遍。有没有办法让代码遵循“DRY”的方法?

【问题讨论】:

  • 我只看到你的if controller 测试两次。而且,我认为您将很难减少代码。 DRY 是一个伟大的概念,但它是指导原则,而不是法律。有时我们不得不重复一些事情,因为逻辑迫使它。请注意通过避免重复来减少代码的必要性,并尝试这样做。
  • 您可以像这个控制器一样更改第一个块 == home ?渲染部分 0:渲染部分 1
  • @QuaziMarufurRahman 三元运算符在这里没有帮助,您仍然需要重复控制器 == 主页部分,它只是一个较短的形式。谢谢你。
  • @theTinMan yh 在部分 5 之后还有一个,我明白你的意思。
  • 如果有尾随 if,则说明您的示例代码中缺少它。

标签: ruby-on-rails ruby ruby-on-rails-3 dry


【解决方案1】:

你可以使用数组:

partials = (controller == home) ? [0,2,3,4,5] : [1,2,3,5]

partials.each { |p| render partial p }

【讨论】:

  • 你的数组部分看起来像一个三元语句。如果我错了,请纠正我。看起来是一种简短而有效的方法
  • 我建议将controller == home 括在括号内,以帮助进行视觉分隔,并调用逻辑测试。它有助于提高可读性。
【解决方案2】:

我可以这样做。它不再是 DRY,但它读起来更好,IMO:

flag = controller == home

render flag ? :partial0 : :partial1
render :partial2
render :partial3
render :partial4 if flag
render :partial5

【讨论】:

    【解决方案3】:

    您可以使用数组,并且由于部分是有序的,因此对其进行排序,然后渲染:

    partials = [2,3,5];                     # 2,3,5 are going to be rendered regardless of controller
    
    case controller
    when home
       partials.push(0,4);                  # if it's home use 0 and 4
    else
       partials.push(1);                    # if not home use 1
    end
    
    partials.sort.each { |p| render partial p }  # sort and render in order
    

    注意:此示例中的代码更多,但如果您希望使用除home 之外的其他条件,它会更灵活。我经常发现我预先编写的代码越健壮,从长远来看,它可以节省我更多的时间;不过,我承认这与FMc 的答案相比可读性较差

    【讨论】:

    • 将代码变成单行代码并不总是可取的或好事,尤其是在使用复杂的三元语句时。它可能更简洁,但这可能会导致更难理解和维护。我建议保留原始表格。 @Denis 在他的回答中使用的三元语句更容易理解,并且会是更好的方法。
    • 你可以把它做成一个单行,或者使用三元,但不使用三元的好处是可以轻松启用更多条件并节省可读性。出于这个原因,我将 if 更改为 switch 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多