如何使这个Ruby块可扩展?

时间:2013-05-23 17:06:24

标签: ruby refactoring block

我需要调整以下块来创建基于@item.type的蒙太奇。为此,必须根据@item.type更改块内容。

list = Magick::ImageList.new(@item.images)
montage = list.montage do
  self.geometry = Magick::Geometry.new(130, 194, 10, 5)
  self.geometry = Magick::Geometry.new(4,10)
end
montage.write("name.jpg")

根据@item.type,可能需要或不需要以下方法,并且提供的值会有所不同:(我可能需要self.foo但不需要self.geometry,例如)

self.geometry = Magick::Geometry.new(130, 194, 10, 5)
self.tiles = Magick::Geometry.new(4,10)

缺少if @item.type = 'this' ...这样做的“Ruby方式”是什么?

1 个答案:

答案 0 :(得分:1)

如何为项目提供一种发出所需几何类型的方法呢?

montage = list.montage do
  self.geometry = Magick::Geometry.new(*@item.geometry)
end

然后你有一个发射几何的方法:

def geometry
  [ 4, 10 ]
end

更新:使用演示者类型。

class Item
  def render_helper
    ItemRenderHelper.new(self)
  end
end

class ItemRenderHelper
  def initialize(item)
    @item = item
  end

  def render(context)
    context.geometry = Magick::Geometry.new(130, 194, 10, 5)
    context.tiles = Magick::Geometry.new(4, 10)
  end
end

class OtherItem
  def render_helper
    OtherItemRenderHelper.new(self)
  end
end

class OtherItemRenderHelper
  def initialize(other_item)
    @other_item = other_item
  end

  def render(context)
    context.geometry = Magick::Geometry.new(...)
    context.tiles = Magick::Geometry.new(...)
    context.other_method(...)
  end
end

然后你可以应用这些:

montage = list.montage do
  @item.render_helper.render(self)
end