【步兵 lua】利用脚本的优势 by EOS.

刚开始从c++转到lua的同学,可能会因为习惯了严格的写法,
从而使得脚本很多的灵活之处没有被发挥出来,那么就让我来教坏你吧。
参数

--参数可以是不确定类型的
function node:setSize(size, height)
    if height then
        local width = size
        self.size.width = width
        self.size.height = height
    else
        self.size = size
    end
end

--当然你也可以用type来区别做一些处理
function node:setTag(tagOrName)
    if type(tagOrName) == "string" then
        node:setName(tagOrName)
    else
        node:setTag(tagOrName)
    end
end

--又或者不确定个数
function newButton(spNormal, spSelected, clickEvent)
    if type(spSelected) == "function" then
        clickEvent = spSelected
        spSelected = nil
    end
    --...
end

表拓展

-- 类拓展
local expandNode = function(node)
    function node:addTo(paret, layout, offset, zorder, tagOrName)
        print("papapa~")
        -- 逻辑省略
    end
end

ess = function(width, height)
    return {width = width, height = height}
end

newNode = function(size)
    local ret = { 
        size = {width = 0, height = 0} 
    }
    if size then ret.size = size end
    expandNode(ret)--拓展node
    return ret
end

--测试
print"nodeTest:"
local node = newNode(ess(100, 200))
print(node.size.width)
node:addTo(xx)

运行结果:

lua可以写电脑脚本吗 lua脚本的优缺点_lua

比如说我,就直接把一个button,然后加表拓展,成功的实现了标签页的功能。
再比如,创建一个列表的cell,然后直接 function cell:fresh(data),很方便。
但是一定要在高内聚的前提下,不要东边加一个东西,过一会西边又加一个东西,
这简直是在作死=、=(no zuo no die, don’t try)


用表来做参数

newLabel_deprecation = function(input, fontName, fontSize, fontColor, labelSize)

end

假如参数是这样的话,那么我创建可能每次都输入 fontName
即使有默认值 fontSize = fontSize or 32
那也要 newLabel_deprecation(“123”, nil, nil, “ff0000”)
这样看起来并不舒服,(当然也可以选择二次封装)
所以当参数过多时候,顺序结构就限制了可读性

下边就是结合前边的综合应用了。

-- lua lu

-- 类拓展
local expandNode = function(node)
    function node:addTo(paret, layout, offset, zorder, tagOrName)
        print("papapa~")
        if type(paret) == "table" then
            local tb = paret
            paret, layout, offset, zorder, tagOrName
            = tb[1], tb[2], tb[3], tb[4], tb[5], tb[6]
            print(paret, layout, offset, zorder, tagOrName)
        end
        -- 逻辑省略
    end

    -- 参数可以是不确定类型的
    function node:setSize(size, height)
        print("ssssss~")
        if height then
            local width = size
            self.size.width = width
            self.size.height = height
        else
            self.size = size
        end
    end
end


--用表当参数
print"labelTest:"

--映射字典
local mapDic = {
    size = "setSize",
    addTo = "addTo"
    --..其他就不列举了
}
newLabel = function(args)
    local ret = newNode()
    for k,v in pairs(args) do
        ret[mapDic[k]](ret, v)
    end
    return ret
end

local label = newLabel{
    size = ess(20, 2016),
    addTo = {"parentNode", "acc", "nil", "-1", "testLabel"}
    --..其他属性省略
}
--ps:链式编码 say gu bye~(假装说再见=、=)
print(label.size.height)

运行结果:

lua可以写电脑脚本吗 lua脚本的优缺点_lua可以写电脑脚本吗_02


另辟蹊径

把东西功能内聚起来~

function Layer:initNet()
    -------------FUNC1---------------
    function self:reqs_Fuc1()

    end

    local function recv_Fuc1()

    end
    Net:addListener(Code.Fuc1,recv_Fuc1)

    -------------FUNC2---------------
    --...
end

又或者这么玩?

print""
print"PlayerTest:"
local AbilityDic = {
    Fly = 1
}
newPlayer = function(name)
    local ret = {}
    ret.name = name
    function ret:walk()
        print(self.name .. " walk")
    end

    function ret:canFly()
        return self.fly ~= nil
    end

    function ret:expand(AbilityTag)
        if AbilityTag == AbilityDic.Fly then
            if self:canFly() then return end
            function ret:fly()
                print(self.name .. " fly")
            end
        end
    end


    return ret
end

local eos = newPlayer("eos")
eos:walk()
print(eos:canFly() and "can fly" or "can't fly")

eos:expand(AbilityDic.Fly)
print"test again"
print(eos:canFly() and "can fly" or "can't fly")
eos:fly()

--当然也可以这样,假装在写js、、 = 3=
_= eos.fly and eos:fly()

运行结果:

lua可以写电脑脚本吗 lua脚本的优缺点_高内聚_03


结语

可能还有想到的地方,暂时就这样,如果以后再有什么好想法,继续出(续)~
话说这篇已经不短了=、= 那么!