为两个Sublasses调用相同的代码

时间:2015-05-15 22:16:18

标签: ruby

我有三个课程Base::BuilderBase::Builder::CarBase::Builder::House

假设我有这个我想缩短的代码:

Base::Builder::Car
  .new(@build_plan)
  .generate

Base::Builder::House
  .new(@build_plan)
  .generate

我做的是:

 [Base::Builder::Car, Base::Builder::House].each do |builder|
   builder.new(@build_plan)
          .generate 
 end

但我真的不喜欢这种重构,因为像这样,它变得难以理解

您将如何重构此代码?谢谢!

1 个答案:

答案 0 :(得分:0)

而不是显式指定所有子类,您可以像这样动态查找它们:

 ObjectSpace.each_object(Class).select { |klass| klass < Base::Builder }.each do |builder|
   builder.new(@build_plan)
   .generate 
 end

当然,如果您真的想要选择 all 子类,这当然有用。而且它的可读性不高。

这是否实际取决于您的使用案例。