zoukankan      html  css  js  c++  java
  • lua对模块接口扩展的一种方法

    module

    lua中模块的实现,对于使用者来说就是一个库,引用此库后,可以调用库中实现的任意函数。

    使用库,可以将一类功能相关的接口做封装,并提供开放接口。

    参考:

    http://blog.codingnow.com/2006/02/lua_51_module.html

    module 重载需求

    我们实现引用程序,往往要引用若干已经实现的库文件, 这些库大都是开源的,以此来加快应用开发进程

    应用库后, 应用编码中, 会引用库的一些API, 例如会是 lfs 库中的 dir 来list目录下的文件和文件夹。

    ---

    但是在应用维护过程中,我们往往希望给库的API添加一些过滤规则, 或者对部分API进行重载,

    如此,我们对库的使用和应用的维护,提出如下两点要求:

    1、 不修改库的代码, 因为后续可能会有升级库的需要, 如果修改, 后续升级库, 往往会丢掉库的修改, 即使记录库的修改, 待升级库时候, 再将修改同步到新库中, 也是耗时, 容易出错的。

    2、 应用代码直接使用库的 API 名称, 因为开发人员往往利用库的document, 可以迅速了解API的含义, 利于利用库进行快速开发,而对库的API添加的过滤规则,对应用代码是透明的。

    module 重载方法

    库引用后, 为库添加属性(old), 记录原始API函数, 然后对原始API名称新定义 函数, 函数中调用 old属性记录的函数,

    这样就可以再 调用old属性记录的函数之前, 做一些过滤规则, 例如对函数入参做 合法性判断,添加安全判断条件。

    给出例子:

    文件 moduleA.lua 中, 定义了一个 printA 模块, 模块实现了一个 printTest 接口

    --------------- moduleA.lua -----------------
    local print = print
    module ("printA")
    function printTest()
        print("module in printA print")
    end

    重载脚本, 引用 moduleA.lua

    重载 printTest 接口, 打印测试, 先原始接口打印, 再执行重载接口中打印。

    require "moduleA"
    
    printA.printTest_old = printA.printTest
    
    printA.printTest = function ()
     printA.printTest_old()
     print("printTest of printA module is reimplement")
    end
    
    printA.printTest()

    打印:

    module in printA print
    printTest of printA module is reimplement
    >Exit code: 0

  • 相关阅读:
    SCILAB简介[z]
    UG OPEN API编程基础 2约定及编程初步
    Office 2003与Office 2010不能共存的解决方案
    UG OPEN API 编程基础 3用户界面接口
    NewtonRaphson method
    UG OPEN API编程基础 13MenuScript应用
    UG OPEN API编程基础 14API、UIStyler及MenuScript联合开发
    UG OPEN API编程基础 4部件文件的相关操作
    UG OPEN API编程基础 1概述
    16 UG Open的MFC应用
  • 原文地址:https://www.cnblogs.com/lightsong/p/4289354.html
Copyright © 2011-2022 走看看