Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 表驱动工厂与继承_Oop_Factory_Table Driven - Fatal编程技术网

Oop 表驱动工厂与继承

Oop 表驱动工厂与继承,oop,factory,table-driven,Oop,Factory,Table Driven,我有一堆派生类,它们只因静态方法不同而不同 (这是Ruby,但问题不在于Ruby,而在于设计。) 类导出器 def导出 # ... 结束 结束 ExporterA类“aaa_表”, :字段=>['a1','a2','a3'], :to=>“aaa_文件”, }, :b=>{ :from=>“bbb_表”, :字段=>['b1','b2','b3'], :to=>“bbb_文件”, }, } 结束 def创建(类型) 返回导出器。新建(self.\u表[类型]) 结束 结束 再一次,我看了这个,

我有一堆派生类,它们只因静态方法不同而不同

(这是Ruby,但问题不在于Ruby,而在于设计。)

类导出器
def导出
# ...
结束
结束
ExporterA类
因此,我研究了这个问题,并提出了将所有这些静态数据放在某种表中,然后使用带有适当属性的
Exporter
。在本例中,我需要某种
ExporterFactory
类,它将知道谁是谁以及如何创建A和B导出器

class ExporterFactory
def_表
返回{
:a=>{
:from=>“aaa_表”,
:字段=>['a1','a2','a3'],
:to=>“aaa_文件”,
},
:b=>{
:from=>“bbb_表”,
:字段=>['b1','b2','b3'],
:to=>“bbb_文件”,
},
}
结束
def创建(类型)
返回导出器。新建(self.\u表[类型])
结束
结束
再一次,我看了这个,现在我真的不喜欢这个方法。原因:

  • 我的
    \u表
    的实际数据要大得多,所以我的表看起来又重又难看
  • 现在,您可以创建没有实际意义的导出器
  • 看起来工厂知道的太多了,我更希望将A-export的数据封装在
    ExporterA
我不能决定。第二种方法似乎更符合逻辑,但我仍然希望使用第一种方法。我的主要想法是“我想用继承来组织那个又大又丑的表”


我应该选择什么?在这些方面我会遇到什么样的问题?

我同意你们工厂知道的太多了,这意味着每次出口商发生变化时,它都必须改变。此外,如果您曾经有一个需要额外代码的导出器,那么将无法创建它。您的第一个设计允许您编写导出程序,在需要时覆盖超类方法

您可以通过将数据放入
initialize
并覆盖该方法而不是三种方法,使您的第一个设计更加简洁:

class Exporter
  attr_accessor :from, :fields, :to

  def initialize(from, fields, to)
    self.from = from
    self.fields = fields
    self.to = to
  end

  def export
    # ...
  end

end

class ExporterA < Exporter
  def initialize
    super 'aaa_table', ['a1', 'a2', 'a3'], 'aaa_file'
  end 
end

class ExporterB < Exporter
  def initialize
    super 'bbb_table', ['b1', 'b2', 'b3'], 'bbb_file'
  end 
end
类导出器
属性访问器:从,:字段,:到
def初始化(从、字段、到)
self.from=from
self.fields=字段
self.to=to
结束
def导出
# ...
结束
结束
ExporterA类