首页 > 解决方案 > 减少实例方法的数量

问题描述

我将报表建模为一个类,并将每个列值建模为访问器。报告中的每个值都需要从数据库中访问。但这使类看起来很胖,并且 RubyMine 警告我类中的方法太多。

class Report

attr_accessor :name, :col1, :col2, :col3 .... :col15

def col1
 db.find({x: 1})['some_var']
end

def col2
 db.find({y: 4})['some_other_var']
end

and so forth for each attribute...

end

由于每个 getter 本质上都是调用数据库的单行,有没有更简单的方法来声明这些变量而不是在方法中?

我不想在初始化方法中设置这些,因为这些报告将被子类化,并且子报告将不具有所有/部分这些属性。

标签: ruby

解决方案


您可以使用元编程动态创建类似 attr_accessor 的方法。

例如:

class Report
  def initialize(attributes)
    attributes.each do |attribute|
      define_singleton_method :"#{attribute}" do |hash_param, string_param|
        db.find(hash_param)[string_param]
      end
    end
  end
end

然后您可以创建新的报告对象并传递属性名称,如下所示:

r = Report.new(["n","m"])

现在您可以在对象上调用nm方法r

r.m({val1: "val1"}, "val2")
r.n({val2: "val1"}, "val2")

推荐阅读