【问题标题】:How to refactor a long method in ruby如何在 ruby​​ 中重构一个长方法
【发布时间】:2018-01-26 04:05:07
【问题描述】:

以下是我的编码风格示例。有时我会得到 50 行方法。

def make_juice
  wash_fruits()
  cut_fruits()

  while(true) do
    if electicity_available?
      turn_on_lights()
      break
    else
      pay_electricity_bill()
      sleep(60)
    end
  end

  mix_fruits_in_mixer()
  add_sugar()
end

# ---------- function definitions ----------

def wash_fruits
  # ...
end
def cut_fruits
  # ...
end
def electricity_avalable?
  # return true  if available
end
def turn_on_lights
  # turn on 
end
def pay_electricity_bill
  # pay
end
def create_juice
  # steps for creating juice
end
def add_sugar
  # steps for adding sugar
end

编写长方法不是 ruby​​ 约定的,我想知道重构 ruby​​ 程序的标准方法。我尝试重构代码并得到以下结果:

def wash_fruits
  # ...
  cut_fruits
end

def cut_fruits
  # ...
  turn_on_lights
end

def turn_on_lights
  while(true) do
    if electricity_avalable?
      turn_on_lights
      break
    else
      sleep 1.hour
    end
  end
  mix_fruits_in_mixer
end

def mix_fruits_in_mixer
  # ...
  add_sugar
end

def turn_on_lights
  # ...
end

def add_sugar
  # ...
  # ... program exits
end

第二种风格的方法名意义不大。这是重构程序的正确方法吗?

【问题讨论】:

  • 意见问题,正如您所提到的,在这里通常不受欢迎。您可能想查看codereview.stackexchange.com
  • @Josh,我同意你的建议,但更多的是因为 OP 提供了工作代码。 SO 关注损坏的代码和“如何做”问题,而代码审查旨在展示如何改进工作代码。
  • 你告诉程序(或机器人?)制作果汁,它可能会在一个黑暗的厨房里支付账单——这听起来不对。如果出现问题,失败不是更有意义吗?
  • @Stefan 是绝对正确的,这就是问题的症结所在。通常,长方法表明您违反了Single Responsibility Principle。在这种情况下,很容易发现。没有人会期望支付账单会成为榨汁程序的一部分。在现实世界的场景中,这可能会很棘手,但如果您认识到重构模式,您就可以改进代码。推荐书籍:重构(Ruby 版)和 Sandi Metz 的书籍。
  • @MarkThomas 谢谢推荐书

标签: ruby coding-style


【解决方案1】:

我倾向于写以下1

def make_juice
  wash_fruits
  cut_fruits
  turn_on_lights
  mix_fruits_in_mixer
  add_sugar
end

def turn_on_lights
  until electricity_available?
    pay_electricity_bill()
    sleep(60)
  end
  flip_switch_on
end

1 逻辑表明,清洗和切割可能在黑暗中进行,并且可能需要多次支付电费才能恢复供电。 ¯\_(ツ)_/¯.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多