使用代码包围Ruby方法

时间:2009-07-09 16:25:39

标签: ruby refactoring

我有很多像这样的方法:

def enableMotors
  @posIface.Lock 1
  @posIface.data.cmdEnableMotors = 1
  @posIface.Unlock
end

def goTo (pos)
  @posIface.Lock 1
  @posIface.data.cmdVelocity.pos = pos
  @posIface.Unlock
end

我想创建以下功能:before_filter和:after_filter或任何其他方式我可以将此代码保持为尽可能干。 我不想仅仅依赖于Rails或其他重要的东西。

3 个答案:

答案 0 :(得分:6)

你真的需要一个完整的:之前:在回调系统之后还是这个对你来说足够了?

def with_lock(&block)
  @posIface.Lock 1
  yield
  @posIface.Unlock
end

def enableMotors
  with_lock { @posIface.data.cmdEnableMotors = 1 }
end

def goTo (pos)
  with_lock { @posIface.data.cmdVelocity.pos = pos }
end

答案 1 :(得分:2)

要展开weppos's answer,使用yield和代码块看起来就像是必要的和DRY。由于@posIface.data用于两个块,您可以执行以下操作以进一步干燥它:

def with_lock(&block)
  @posIface.Lock 1
  yield @posIface.data
  @posIface.Unlock
end

def enableMotors
  with_lock { |obj| obj.cmdEnableMotors = 1 }
end

def goTo (pos)
  with_lock { |obj| obj.cmdVelocity.pos = pos }
end

答案 2 :(得分:0)

def self.locked_def(name, &b)
   instance_eval do
     define_method(name) do
       @posIface.Lock 1
       b.call
       @posIface.UnLock
      end
   end
 end

 locked_def :pos { @posIface.data.cmdVelocity.pos = pos }

我认为会做到这一点(对于块调用我不知道如何)。

但是,weppos的答案是一个更好的解决方案。