1

新しい Listener クラスを作成して、メソッドが別のメソッドをトリガーする方法を見つけようとしています。コードを単純化し、コールバック メソッドやトリガー メソッドに固有のものを追加しないようにしたいと考えています。基本的に、私がやろうとしていることはこれです:

def level_up
  level += 1
end

def print_level
  puts "Level Up! (#{level})"
end

notify_level = Listener.new(:level_up, :print_level);

私のリスナークラスは(現在)これです:

# Listener.new(attached_to, callbacks)
class Listener
  def initialize(attached_to, function)
    @owner, @callback = attached_to, function
  end

  def owner
    @owner
  end

  def callback
    @callback
  end

  def trigger
    # execute callback manually
    self.method(@owner).call
    self.method(@callback).call
  end
end

両方を呼び出すには、notify_level.triggerそれ自体を実行する必要がありますが、実行して呼び出す必要がlevel_upありますprint_level。誰かがオブザーバーについて言及することは知っていますが、それ以上のことが必要です。DRYをしっかりと持ちたい。オブザーバーとリスナーをすべてのメソッドに手動で追加するのは、特に簡単に追加または削除できないため、ひどいものです。

4

2 に答える 2

0

元のコードをよりセマンティックなものに変更したので、より意味のあるものになりました。

class Event
  def initialize(event, callback_array = [])
    if callback_array.kind_of? Array
      @callbacks = callback_array
    else
      @callbacks = [callback_array]
    end

    @event = event
  end

  def trigger(*args)

    self.method(@event).call *args

    @callbacks.each{ |callback|
      if callback.instance_of? Event
        callback.trigger *args
      else
        method(callback).call *args
      end
    }
  end

  def add(callback)
    @callbacks.push callback
  end

  def remove(callback)
    @callbacks.delete_at(@callbacks.index(callback) || @callbacks.length)
  end

  def event_name
    @event
  end
end

使用法:

$infinite_break = 10

def infinite_loop_a(type)
  puts "#{$infinite_break} points of #{type} damage taken"
  $infinite_break -= 1

  if $infinite_break > 0
    $infinite.trigger(type)
  else
    $infinite.remove(:infinite_loop_a)
  end
end

def infinite_loop_b(type)
  puts "player is dealing #{$infinite_break} damage"
end

$infinite = Event.new(:infinite_loop_b, :infinite_loop_a)
$infinite.trigger('fire')

また、私はinfinite_loop_b内部infinite_loop_aを呼び出していることを知っていますが、それは特定の理由によるものです。Eventインスタンスはコールバックとして別のものを持つことができますEvent

于 2013-08-29T22:20:59.667 に答える