AOP programming paradiag

AOP

https://en.wikipedia.org/wiki/Aspect-oriented_programminghtml

Typically, an aspect is scattered or tangled as code, making it harder to understand and maintain. It is scattered by virtue of the function (such as logging) being spread over a number of unrelated functions that might use its function, possibly in entirely unrelated systems, different source languages, etc. That means to change logging can require modifying all affected modules. Aspects become tangled not only with the mainline function of the systems in which they are expressed but also with each other. That means changing one concern entails understanding all the tangled concerns or having some means by which the effect of changes can be inferred.express

 

Logging exemplifies a crosscutting concern because a logging strategy necessarily affects every logged part of the system. Logging thereby crosscuts all logged classes and methods.编程

 

http://www.cnblogs.com/beliefbetrayal/archive/2012/02/03/2337522.htmlapp

  AOP(Aspect-Oriented Programming,面向切面的编程),它是能够经过预编译方式和运行期动态代理实如今不修改源代码的状况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP编程的一种补充。ide

  OOP是关注将需求功能划分为不一样的而且相对独立,封装良好的类,并让它们有着属于本身的行为,依靠继承和多态等来定义彼此的关系;AOP是但愿可以将通用需求功能从不相关的类当中分离出来,可以使得不少类共享一个行为,一旦发生变化,没必要修改不少类,而只须要修改这个行为便可。ui

 

Lua AOP

http://lua.2524044.n2.nabble.com/Question-about-AOP-like-function-calls-interception-td7651107.htmlthis

The reason why I'm asking is to see how something like AOP (Aspect Oriented Programming) approach could be applied to Lua. For example, I'd like to be able to execute a custom code before or after a call, manipulate call arguments and results, etc. And I'd like to be able to specify what I want to intercept (e.g. using patterns like this: "all calls of functions that look like set* or libname.*") outside of the code, where interception is supposed to be applied. That is the source code should not be aware of interception if possible. Normally it is achieved by means of interception or instrumentation in most languages. I'm wondering how and if this can be done in Lua. lua

 


local
_print = print print = function( … ) -- before... _print( … ) -- after... end

 

http://lua-users.org/lists/lua-l/2011-01/msg00187.htmlspa

as many things OO, most 'fun' things in aspects are trivial to do in
functional programming:

for example, it's common to enhance the built-on type() function:

do
  local oldtype = type
  function type(x)
    local mt = getmetatable(x)
    if mt and mt.__type then return mt.__type end
    return oldtype(x)
  end
end

or you could do some 'prepend' functions:

function prepend(f,pre)
  return function(...)
    return pre(f,...)
  end
end


and use like this:

type = prepend (type, function(old, x)
  local mt = getmetatable(x)
  if mt and mt.__type then return mt.__type end
  return old(x)
end

 

AOP lua库

http://luaforge.net/projects/aspectlua/.net

AspectLua is an extension of Lua for Aspect-Oriented Programming. It follows some concepts of AspectJ, and enables the creation of Aspects for modularize crosscutting concerns in objects written in pure Lua.

 

以下: 对account 的 deposit方法进行跟踪, 调用完后, 进行打印。

dofile("AspectLua.lua")

account = luaorb.createproxy(readIOR("account.ref"),"IDL:Account:1.0")
account:deposit(5)

function logfile(a)
    print("o valor depositado e",a)
end

asp = Aspect:new("aspect.ref")
asp:aspect({name = 'AccountLogging'} , {name = 'tracingMethods', designator = 'call', list = {'bank_impl.deposit'}}, {type ='after', action = logfile})
相关文章
相关标签/搜索