更好的方法来构建这个功能?

时间:2009-09-10 13:24:57

标签: architecture function lua

我有一个函数主要包含大量的调用(50+)到另一个函数,它将数据插入到一个数组中,逻辑在这里和那里指示各种条件将各种项插入到数组中(加上一点点)最后,将数组的内容写入文件)。我想知道是否有更好的方法来实现这个功能;我想我可以从逻辑上将数组插入命令集拆分成他们自己的函数开始,但我想知道是否还有我能做的事情。有吗?

示例:

function buildTable(fileName, data)
    local dataToWrite = {}
    table.insert(datTWrite, {
        Type = "type1",
        Key = "someKey",
        Value = data.SomethingInteresting
    })
    --and so on ad nauseum with an occasional but of actual logic to spice things up
    dataWriter:open(fileName .. ".bla")
    dataWriter:batchWrite(dataToWrite)
    dataWriter:close()
end

在这种情况下,dataWriter是一个预定义类的实例,用于处理写入文件的过程。

3 个答案:

答案 0 :(得分:2)

好消息是你没有直接进入常见的Lua悲观化,即将字符串连接到循环中的缓冲区以构建输出。

我会写这样的样本:

function buildTable(fileName, data)
    local t = {}
    t[#t+1] = {
        Type = "type1",
        Key = "someKey",
        Value = data.SomethingInteresting
    }
    --and so on ad nauseum with an occasional but of actual logic to spice things up
    dataWriter:open(fileName .. ".bla")
    dataWriter:batchWrite(t)
    dataWriter:close()
end

,其优点是不使用临时表的长字符错误名称,并使用t[#t+1]成语扩展数组部分,这应该比调用table.insert()更快。

否则,任何结构改进的来源都将出现在代码的“依此类推”中。

  • 查看可以收集到本地函数中的常见计算和片段。
  • 请记住,您可以嵌套函数定义,因此可以将辅助函数的范围限制在它们使用的位置。
  • 寻找太聪明的逻辑,并重写它们对于明年必须维护它的人来说是明智的。
  • wiki:Lua Design Patterns
  • wiki:Zen Of Lua
  • wiki:Optimisation Tips
  • wiki:Profiling Lua Code

最重要的是,要注意过早优化。将您现在拥有的内容作为比较点,并将其作为查找性能瓶颈的指南。

答案 1 :(得分:2)

通过“等等偶尔但偶然但实际的逻辑来增加情绪”,我认为你的意思是你有很多块,如:

table.insert(datTWrite, {
    Type = "type1",
    Key = "someKey",
    Value = data.SomethingInteresting
})

该函数唯一的唯一方面是正在填充的表和data对象。我个人的“最佳实践”是把所有这些都放到一个单独的表中,如:

local entries = {
    {
        Type = "type1",
        Key = "someKey",
        ValueField = "SomethingInteresting",
    },
    {
        Type = "type2",
        Key = "someOtherKey",
        ValueField = "SomethingElse",
    },
    -- etc.
}

此表应该是全局的,或者在定义函数之外的范围内。现在,您可以更轻松地重新配置条目,而无需对执行实际工作的功能进行任何更改。通过迭代条目来大大简化函数本身:

for i, entry in ipairs(entries) do
    table.insert(datTWrite, {
        Type = entry.Type,
        Key = entry.Key,
        Value = data[entry.ValueField]
    })
end

对于“偶然”逻辑,每个条目都可以有一个可选函数,在循环中为您提供有趣的信息。 E.g:

for i, entry in ipairs(entries) do
    if not entry.CheckSomething or entry.CheckSomething() then
        table.insert(datTWrite, {
            Type = entry.Type,
            Key = entry.Key,
            Value = data[entry.ValueField]
        })
    end
end

或者,如果您需要更多可自定义功能,甚至可以允许表中的各个条目具有BE功能。每个入口函数都会返回一个表(或不是)。

for i, entry in ipairs(entries) do
    if type(entry) == "function" then
        local newEntry = entry()
        if newEntry then
            table.insert(datTWrite, newEntry)
        end
    else
        table.insert(datTWrite, {
            Type = entry.Type,
            Key = entry.Key,
            Value = data[entry.ValueField]
        })
    end
end

答案 2 :(得分:0)

如果没有具体的内容,我会尝试研究code smells,看看你的功能是如何比较的。从事物的声音来看,你可能有很多事要做。是否存在由不同条件逻辑隔离的类似/复制代码块?嵌套循环或条件?在尝试将大型函数拆分为多个部分时,这些是一些简单的起点。