在我的红宝石轨道示例中使用案例语句可以吗?



我有一个使用rails构建的小在线工具。该应用程序没有数据库。(我知道我应该使用另一个更简单的框架,比如 Ruby 的 Sinatra(。所以我需要从界面捕获选定的汽车模型,并使用其功率、速度和尺寸属性是否可以使用 case 语句,如下面的代码:

class Car
def get_car_properties (dropdown_selection)
    info = {}
    info=Hash.new{2}
    case dropdown_selection
        when 'Mazda 3'
             info = { speed: 'fast', power: 'real strong', dimensions: '4X3X3'}
        when 'Lancer 81'
             info = { speed: 'slow', power: 'real weak', dimensions: '2X2X2'}
         else
             info={}
    end
    return info
end
end
selected_car=Car.new()
puts selected_car.get_car_properties('Mazda 3')

为了简化起见,我没有使用确切的场景。另请注意,我的案例陈述大约有 30 个大选项和哈希 10 个符号。

大案例语句是一种代码异味,这意味着它们暗示可能有机会改进你的代码。

在这种情况下,虽然你的应用没有数据库,但你仍然有数据。你的代码现在看起来很混乱的原因是你没有将这些数据与程序逻辑分开。

我建议将每辆车的数据存储在哈希中,然后将该哈希视为您的数据库。

class Car
  CAR_INFO = {
    'Mazda 3' => {
      speed: 'fast',
      power: 'real strong',
      dimensions: '4X3X3'
    },
    'Lancer 81' => {
      speed: 'slow',
      power: 'real weak',
      dimensions: '2X2X2'
    },
    # etc
  }
  def get_car_properties (dropdown_selection)
    CAR_INFO.fetch(dropdown_selection, {})
  end
end
selected_car=Car.new()
puts selected_car.get_car_properties('Mazda 3')

为什么这样更好?首先,哈希是纯数据。很明显,在 case 语句的某个分支中没有隐藏其他控制逻辑。您现在可以一目了然地知道get_car_properties在做什么 - 它在数据结构中查找选择,如果未找到任何内容,则返回空哈希。您可能希望将CAR_INFO移动到单独的文件中,或者稍后移动到适当的数据库中 - get_car_properties这两种情况下都不会有太大变化。

你编写的代码可能有效,但肯定有味道,并且会违反 ruby 风格指南。

我建议你使用代码分析器,比如rubocop,它将强制执行Ruby风格指南,并帮助你编写符合要求的代码并避免常见的陷阱。

最新更新