如何重构Ruby中嵌套的每个方法

时间:2018-09-04 22:25:19

标签: ruby refactoring each

我有一个很大的成分数据库。我使用自定义类创建成分及其命名变体。油籽就是其中一类。

以下油料种子有64种命名方式:

@oil_seed = OilSeed.new(
  common_name: "canola",
  genus: "brassica",
  species: ["capestris", "napus", "rapa", "rapa oleifera", "napus oleifera", "capestris oleifera"],
  oil_types: ["oil"],
  oil_derivatives: ["seed"],
  other_names: ["rapeseed", "polish canola", "rape"],
)

该类包含用于创建命名变体的不同方法。几乎所有方法都有一些嵌套的.each调用级别。以下是最复杂的。 (请注意,create_name只是对实际上在数据库中创建成分的东西的方法调用。)

def full_names(alt_names)
  alt_names.each do |alt_name|
    @oil_types.each do |oil_type|
      create_name("#{oil_type} of #{alt_name}")
      create_name("#{alt_name} #{oil_type}")

      @oil_derivatives.each do |oil_derivative|
        create_name("#{alt_name} #{oil_derivative} #{oil_type}")
      end
    end

    @scientific_names.each do |sn|
      @oil_types.each do |oil_type|
        create_name("#{scientific_names} (#{alt_name}) #{oil_type}")

        @oil_derivatives.each do |oil_derivative|
          create_name("#{scientific_names} (#{alt_name}) #{oil_derivative} #{oil_type}")
        end
      end
    end
  end
end

此方法为种子common_name和每个other_names attrs生成以下名称变体。

  • 芥花籽油
  • 芥花籽油
  • 芥花籽油
  • 芸苔油(canola)
  • 芸苔油(芥花籽油)

我的代码工作正常,但是我想建议我是否(或者如果可以)重构复杂的命名方法。首先,因为很难说出到底发生了什么。其次,麻烦的是向OilSeed类添加新属性。每次我需要添加一个电话时,都会创建大量新的each通话,而这些通话很难维护。

编辑:重构

def full_names(alt_names)
  combinations = generate_combinations(alt_names, @oil_types, @oil_derivatives)
  names = []

  combinations.each do |sn, ot, od|
    names << "#{sn} #{ot}"
    names << "#{sn} #{od} #{ot}"
  end

  create_names(names)
end

def generate_combinations(bases, *components)
  bases.flatten.product(*components)
end

def create_names(names)
  names.uniq.each { |x| create_name(x) }
end

0 个答案:

没有答案