Ruby实现AOP

原文地址:

http://blog.csdn.net/zhao_hongsheng/article/details/7309054


AOP似乎只属于JAVA。

RUBY能否实现AOP呢?

可以


在rails里

someController
  before_filter :login_required

anotherController
  before_filter :login_required, :only=>[:update, :edit, :destroy]

andAnotherController
  before_filter :login_required, :only=>[:new, :create]

adminController
  before_filter :admin_login_required

离开rails要怎么实现呢?

我要用到rails的active_support作为辅助,

所以你的机器上需要安装了RAILS的active_support。


第一种方法,用method_missing实现

require 'rubygems'
require 'active_support'


module MyBase
  
  def self.included(base)
    base.class_eval do
      include ActiveSupport::Callbacks
      define_callbacks :before
      define_callbacks :after
    end
  end
  
  def method_missing(symb, *args)
    method_name = symb.to_s.gsub(/_aop/,'').to_sym
    if respond_to? method_name
      run_callbacks(:before)
      send(method_name)
      run_callbacks(:after)
    else
      super
    end
  end
  
end




class MyClass
  include MyBase
  
  before :m_bf
  after :m_af
  
  def m_1
    puts '- method_1'
  end
  
  def m_2
    puts '- m_2'
  end
  
  protected
  def m_bf
    puts 'before ..'
  end
  
  def m_af
    puts 'after ...'
  end
end

执行

c = MyClass.new
c.m_2_aop

结果

before ..
- m_2
after ...


这个方法稍微笨了点儿,抛砖引玉吧。

看下面
----------------

用active_support的callback

结合alias_method_chain来实现

require 'rubygems'
require 'active_support'

module MyCallBackBase
  def self.included(base)
    base.class_eval do
      include ActiveSupport::Callbacks
      define_callbacks :before
      define_callbacks :after
    end
  end
end

module EmbedCallback
  def self.included(base)
    base.class_eval do
      methods = public_instance_methods(false)
      methods.each do |m|
        class_eval <<-"end_eval"
        def #{m.to_s}_with_callback
          run_callbacks(:before)
          #{m}_without_callback
          run_callbacks(:after)
        end
        end_eval
        alias_method_chain m, :callback
      end
    end
  end
end

class MyClass
  include MyCallBackBase
  before :m_bf, :m_bf2
  after :m_af
  
  def m_1
    puts '- method_1'
  end
  
  def m_2
    puts '- method_2'
  end
  
  protected
  def m_bf
    puts 'before the method ..'
  end
  
  def m_af
    puts 'after the method ...'
  end
  
  def m_bf2
    puts 'before the method 2222...'
  end
  
  include EmbedCallback
end

执行
c = MyClass.new
c.m_2

结果

before the method ..
before the method 2222...
- method_2
after the method ...



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值