`
qiezi
  • 浏览: 497218 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[Ruby] Ruby AOP

    博客分类:
  • Ruby
阅读更多
昨天在答一个问题时,看题不清答错了,不过却让我花了点时间想如何实现简单的AOP。

在其它语言里实现AOP的确比较麻烦,java要用到动态proxy,如果是C++,除了从源码上修改还真没好办法,aspectc就是这么做的。那么ruby里面如何实现呢?

由于ruby是动态脚本语言,运行期可以把一个方法改名,也可以构造一个字符串动态生成方法,那么实现这个就不是难事了。

<!---->module ExecuteBefore
  def self
.included(base)
    base
.extend(ClassMethods)
  end

  module ClassMethods
    def execute_before(before_method
, *methods)
      methods
.flatten.map(&:to_sym).each do |method|
        alias_method 
"#{method}_old".to_sym, method
        class_eval 
<<-eval_end
          def 
#{method}(*args)
            #{before_method}(*args)
            #{method}_old(*args)

          end
        eval_end
      end
    end
  end
end

使用时只需要在类里面include这个模块就行了,相当于mixin的功能。

<!---->class TestController < ApplicationController

  def 
index
    a(
1)
    b(
1,2)
    c(
1,2,3)
    render 
:text => 'hello'
  end

  protected
  def 
log(*args)
    puts 
"log: #{args.map(&:to_s).join(', ')}"
  end

  def a(a)
  end

  def b(a
,b)
  end

  def c(a
,b,c)
  end

  include ExecuteBefore
  execute_before 
:log, :a, :b, :c
end

注意,由于使用execute_before时后面几个方法必须要有定义,所以必须放在后面,否则就会出错。
分享到:
评论

相关推荐

    AOP in Ruby

    Why Aspect-Oriented ... AOP in Java and AspectJ (a Review). AOP in Ruby. What you can do today. Example AOP-isms in Ruby on Rails. Aspect-Oriented Design. The AOP Promise for Tomorrow.

    Metaprogramming.Ruby

    8. **面向切面编程(AOP)**:探索AOP在Ruby中的应用,以及如何通过AOP技术实现代码的解耦和重用。 #### 五、总结 《Metaprogramming Ruby: Programming Like the Ruby Pros》不仅提供了一种学习Ruby元编程的有效途径...

    .net 下实现AOP

    在.NET环境中实现面向切面编程(AOP)是一种常见的需求,尤其在处理共性功能如日志、性能监控、事务管理等时。AOP允许开发者将关注点分离,使核心业务逻辑与辅助功能解耦。在上述示例中,我们看到了一个简单的计算器...

    AOP-OC:Objective C 的一个小 aop 实现

    **Ruby** 在这里可能是作为标签出现,可能是因为开发者受到了Ruby语言中元编程特性的启发,Ruby在AOP实现上较为成熟。Ruby的元编程特性,比如块(Blocks)、Proc对象和lambda,以及模块的混入(Mixin),使其在AOP...

    JFinal 是基于 Java 语言的极速 WEB + ORM + AOP + Template Engine 框架.rar

    在拥有 Java 语言所有优势的同时再拥有 ruby、python、php 等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友 :) JFinal 有如下主要特点: MVC 架构,设计精巧,使用简单 遵循 COC 原则,支持零配置...

    基于Java全栈开发的Nutz框架:Mvc/Ioc/Aop/Dao/Json一体化设计源码

    该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...

    jfinal-4.9.01-all.zip

    JFinal 是基于 Java 语言的极速 WEB + ORM + AOP + Template Engine 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、...

    ruby_quest

    面向切面编程(AOP)在Ruby中也有体现,如`before`、`after`和`around`这样的回调方法,允许在特定操作前后插入代码,实现关注点分离。 异常处理是任何编程语言的重要部分,Ruby使用`begin..rescue..else..ensure`...

    Monkey Patch猴子补丁编程方式及其在Ruby中的运用

    4、增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等, 5、缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。 Ruby的类都...

    LoginCheck:一个用 runtime 的 AOP 做的权限控制

    本文将深入探讨LoginCheck项目,它利用了Ruby的动态特性,特别是运行时(runtime)的面向切面编程(AOP)来实现这一功能。面向切面编程是一种编程范式,它允许我们将关注点分离,比如日志记录、事务管理和权限控制,...

    2015_07_08-module_prepend:Colin Kelley使用Ruby 2.1的Module#prepend进行面向方面的编程,2015年7月8日发表

    面向方面的编程(AOP)是一种通过方法调用上的装饰器来分隔横切关注点的技术。 装饰器的编码方式与它们增加的方法无关,因此可以重复使用和组合装饰器。 从一开始就使用#alias_method_chain在Ruby on Rails中几乎...

    aop的实现原理_动力节点Java学院整理

    在动态语言(如Python和Ruby)中,实现代理模式相对容易,因为它们允许在运行时动态地改变对象的行为;而在静态语言(如Java)中,代理对象通常需要实现和目标对象相同的接口,从而实现代理。 通过代理,可以在目标...

    handshake:Ruby 的契约式设计框架

    Handshake 是一个用纯 Ruby 编写的非正式 AOP 和系统。 它旨在允许 Ruby 开发人员对其方法和类应用简单、清晰的约束。 特征 方法签名合约 区块和过程的合约 方法前置和后置条件 类不变量 例子 下面是一个在假设的...

    JFinal极速WEB+ORM框架 v5.1.1

    在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友。 jfinal框架特点: MVC 架构,设计精巧,使用简单 遵循 COC 原则,零配置,无 XML 独创 Db +...

    Java软件技术发展趋势探讨

    JRuby作为Ruby语言的一个实现,能够在Java虚拟机上运行,这不仅拓展了Java平台的功能边界,也为Ruby语言在企业级应用中的使用提供了可能。尽管面临着适应性和社区支持等问题,但随着JVM对动态语言支持的优化,JRuby...

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架

    核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态...AOP支持,拦截器配置灵活,功能强大 Plugin 体系结构,扩展性强。

    Spring 2 参考

    - **Dynamic language support**:支持动态语言如Groovy和Ruby等,为开发者提供了更多选择。 - **JMX**:支持Java Management Extensions (JMX),方便了系统管理和监控。 - **Task scheduling**:支持任务调度功能,...

    Apress.Introducing.Spring.Framework.A.Primer.

    • Apply AOP (aspect-oriented programming) to separate concerns. • Create web applications and expose RESTful APIs. • Send messages via JMS and AMQP by using ActiveMQ and RabbitMQ. • Use dynamic ...

    AspectR-Fork-开源

    AspectR项目源自SourceForge,它提供了一个用于Ruby的AOP解决方案,允许开发者以声明性方式管理横切关注点,如日志、事务管理、性能监控等。 在Ruby中,AspectR提供了一种优雅的方式来组织代码,使得主要业务逻辑不...

Global site tag (gtag.js) - Google Analytics