昨天在答一个问题时,看题不清答错了,不过却让我花了点时间想如何实现简单的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时后面几个方法必须要有定义,所以必须放在后面,否则就会出错。
分享到:
相关推荐
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.
8. **面向切面编程(AOP)**:探索AOP在Ruby中的应用,以及如何通过AOP技术实现代码的解耦和重用。 #### 五、总结 《Metaprogramming Ruby: Programming Like the Ruby Pros》不仅提供了一种学习Ruby元编程的有效途径...
在.NET环境中实现面向切面编程(AOP)是一种常见的需求,尤其在处理共性功能如日志、性能监控、事务管理等时。AOP允许开发者将关注点分离,使核心业务逻辑与辅助功能解耦。在上述示例中,我们看到了一个简单的计算器...
**Ruby** 在这里可能是作为标签出现,可能是因为开发者受到了Ruby语言中元编程特性的启发,Ruby在AOP实现上较为成熟。Ruby的元编程特性,比如块(Blocks)、Proc对象和lambda,以及模块的混入(Mixin),使其在AOP...
在拥有 Java 语言所有优势的同时再拥有 ruby、python、php 等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友 :) JFinal 有如下主要特点: MVC 架构,设计精巧,使用简单 遵循 COC 原则,支持零配置...
该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...
JFinal 是基于 Java 语言的极速 WEB + ORM + AOP + Template Engine 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、...
面向切面编程(AOP)在Ruby中也有体现,如`before`、`after`和`around`这样的回调方法,允许在特定操作前后插入代码,实现关注点分离。 异常处理是任何编程语言的重要部分,Ruby使用`begin..rescue..else..ensure`...
4、增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等, 5、缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。 Ruby的类都...
本文将深入探讨LoginCheck项目,它利用了Ruby的动态特性,特别是运行时(runtime)的面向切面编程(AOP)来实现这一功能。面向切面编程是一种编程范式,它允许我们将关注点分离,比如日志记录、事务管理和权限控制,...
面向方面的编程(AOP)是一种通过方法调用上的装饰器来分隔横切关注点的技术。 装饰器的编码方式与它们增加的方法无关,因此可以重复使用和组合装饰器。 从一开始就使用#alias_method_chain在Ruby on Rails中几乎...
在动态语言(如Python和Ruby)中,实现代理模式相对容易,因为它们允许在运行时动态地改变对象的行为;而在静态语言(如Java)中,代理对象通常需要实现和目标对象相同的接口,从而实现代理。 通过代理,可以在目标...
Handshake 是一个用纯 Ruby 编写的非正式 AOP 和系统。 它旨在允许 Ruby 开发人员对其方法和类应用简单、清晰的约束。 特征 方法签名合约 区块和过程的合约 方法前置和后置条件 类不变量 例子 下面是一个在假设的...
在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友。 jfinal框架特点: MVC 架构,设计精巧,使用简单 遵循 COC 原则,零配置,无 XML 独创 Db +...
JRuby作为Ruby语言的一个实现,能够在Java虚拟机上运行,这不仅拓展了Java平台的功能边界,也为Ruby语言在企业级应用中的使用提供了可能。尽管面临着适应性和社区支持等问题,但随着JVM对动态语言支持的优化,JRuby...
核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态...AOP支持,拦截器配置灵活,功能强大 Plugin 体系结构,扩展性强。
- **Dynamic language support**:支持动态语言如Groovy和Ruby等,为开发者提供了更多选择。 - **JMX**:支持Java Management Extensions (JMX),方便了系统管理和监控。 - **Task scheduling**:支持任务调度功能,...
• 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项目源自SourceForge,它提供了一个用于Ruby的AOP解决方案,允许开发者以声明性方式管理横切关注点,如日志、事务管理、性能监控等。 在Ruby中,AspectR提供了一种优雅的方式来组织代码,使得主要业务逻辑不...