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

  • 相关阅读:
    附加作业
    我的个人总结
    进度更新
    结对编程——电梯调度
    程序阅读的改进
    WordCount
    阅读程序
    VS2013单元测试
    附加作业
    个人最终总结
  • 原文地址:https://www.cnblogs.com/lightsong/p/4289354.html
Copyright © 2011-2022 走看看