【问题标题】:refactor large switch-statement重构大型 switch 语句
【发布时间】:2014-12-09 20:04:26
【问题描述】:

对于将这个丑陋的 case-switch 重构为更优雅的东西有什么建议吗?

此方法(在 Ruby 中)返回比利时省份的(简短或完整)描述,并给出邮政编码。

def province(zipcode, short = false)
  case zipcode
  when 1000...1300
    short ? 'BXL' : 'Brussel'
  when 1300...1500
    short ? 'WBR' : 'Waals-Brabant'
  when 1500...2000, 3000...3500
    short ? 'VBR' : 'Vlaams-Brabant'
  when 2000...3000
    short ? 'ANT' : 'Antwerpen'
  when 3500...4000
    short ? 'LIM' : 'Limburg'
  when 4000...5000
    short ? 'LIE' : 'Luik'
  when 5000...6000
    short ? 'NAM' : 'Namen'
  when 6000...6600, 7000...8000
    short ? 'HAI' : 'Henegouwen'
  when 6600...7000
    short ? 'LUX' : 'Luxemburg'
  when 8000...9000
    short ? 'WVL' : 'West-Vlaanderen'
  when 9000..9999
    short ? 'OVL' : 'Oost-Vlaanderen'
  else
    fail ArgumentError, 'Not a valid zipcode'
  end
end

根据 MiiinimalLogic 的建议,我制作了第二个版本。这样比较好?

class Provincie
  ProvincieNaam = Struct.new(:kort, :lang)

  PROVINCIES = {
    1000...1300 => ProvincieNaam.new('BXL', 'Brussel'),
    1300...1500 => ProvincieNaam.new('WBR', 'Waals-Brabant'),
    1500...2000 => ProvincieNaam.new('VBR', 'Vlaams-Brabant'),
    2000...3000 => ProvincieNaam.new('ANT', 'Antwerpen'),
    3000...3500 => ProvincieNaam.new('VBR', 'Vlaams-Brabant'),
    3500...4000 => ProvincieNaam.new('LIM', 'Limburg'),
    4000...5000 => ProvincieNaam.new('LIE', 'Luik'),
    5000...6000 => ProvincieNaam.new('NAM', 'Namen'),
    6000...6600 => ProvincieNaam.new('HAI', 'Henegouwen'),
    6600...7000 => ProvincieNaam.new('LUX', 'Luxemburg'),
    7000...8000 => ProvincieNaam.new('HAI', 'Henegouwen'),
    8000...9000 => ProvincieNaam.new('WVL', 'West-Vlaanderen'),
    9000..9999  => ProvincieNaam.new('OVL', 'Oost-Vlaanderen')
  }.freeze

  def self.lang(postcode)
    provincie_naam(postcode).lang
  end

  def self.kort(postcode)
    provincie_naam(postcode).kort
  end

  def self.provincie_naam(postcode)
    PROVINCIES.each { |list, prov| return prov if list.cover?(postcode) }
    fail ArgumentError, 'Geen geldige postcode'
  end

  private_class_method :provincie_naam
end

【问题讨论】:

  • 是哪种语言?
  • 很抱歉,如果不清楚。它在红宝石中。
  • 这个问题实际上属于Code Review(我是那里的版主)。 如果此代码按预期工作,您可以在此处重新发布并在此处删除问题。
  • 你重构的目标是什么?只是让代码看起来更整洁?这似乎很容易遵循。或者您想降低复杂性?我相信你可以在这里使用二分搜索,即使有一些重叠的。
  • 它按预期工作,但我不相信这是最好的方法。有没有人建议以更少的 LOC 或更简单的方式执行此操作。

标签: refactoring switch-statement conditional


【解决方案1】:

就个人而言,我会在不同的数据结构中指定邮政编码范围和省份信息,例如 Range 对象/省的 Map,然后使用 Ruby 的 Range 方法检查结果是否在 range 方法的范围内。

【讨论】:

    【解决方案2】:

    您可以考虑只进行一次范围查找,或者像这里所做的那样,或者使用地图结构,以及从简短描述到详细描述的二次查找(可能在地图中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      相关资源
      最近更新 更多