我有一个功能,主要包括大量的呼吁(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

在这种情况下,注中一个实例是预定类处理过程的书面文件。

有帮助吗?

解决方案

好消息是你还没阶梯直接进入公共Lua pessimization的串连串缓冲区的一环,建立你的输出。

我会写您的样本是这样的:

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设计图案
  • wiki: 禅的Lua
  • wiki: 优化技巧
  • wiki: 分析Lua码

上述所有,要注意过早地最优化。基准你有什么现在作为一个点比较,并将其用作指南,用于发现业绩的瓶颈。

其他提示

通过“等等,偶尔使用偶然但实际的逻辑来调整事物”。我猜你的意思是你有很多街区,如:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top