ruby - 减少实例方法的数量
问题描述
我将报表建模为一个类,并将每个列值建模为访问器。报告中的每个值都需要从数据库中访问。但这使类看起来很胖,并且 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 本质上都是调用数据库的单行,有没有更简单的方法来声明这些变量而不是在方法中?
我不想在初始化方法中设置这些,因为这些报告将被子类化,并且子报告将不具有所有/部分这些属性。
解决方案
您可以使用元编程动态创建类似 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"])
现在您可以在对象上调用n
和m
方法r
r.m({val1: "val1"}, "val2")
r.n({val2: "val1"}, "val2")
推荐阅读
- angular - 当以角度 5 按下浏览器后退按钮时,我的模式弹出窗口没有关闭
- spring - 登录浏览器弹出窗口而不是导航到自己的 jsp
- android - 如何从其实现类中获取接口?
- c++ - 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法?
- xslt-2.0 - 如何删除与属性关联的 Soap 命名空间
- reactjs - Reducer 更新它不应该访问的状态对象
- javascript - 在 Google 折线图中将单点设置为活动/显示点和工具提示
- amazon-web-services - CodePipeline 的 CodeDeploy 步骤,因为角色权限不足
- upload - 如何使用 ConnectApi.UserProfiles.setPhoto 为社区用户上传 base64 格式的个人资料照片
- excel - 对数据进行排序的 VBA 代码似乎突然忽略了某些列/单元格