如何更好地设计这个函数架构?

我有一个函数,它主要由大量调用(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是事先定义的一个处理写入文件过程的类的实例。

原文链接 https://stackoverflow.com/questions/1405295

点赞
stackoverflow用户167483
stackoverflow用户167483

如果没有任何具体的线索,我会尝试研究 代码异味,并比较一下您的函数。听起来,您可能还有很多事情要做。是否有通过不同的条件逻辑隔离的类似/复制的代码块?嵌套的循环或条件?这些是将一个大函数拆分为多个部分的一些简单起点。

2009-09-10 13:52:34
stackoverflow用户68204
stackoverflow用户68204

好消息是,您还没有直接进入常见的 Lua 性能问题,即在循环中将字符串连接到缓冲区以构建输出。

我会像这样编写您的示例:

function buildTable(fileName, data)
    local t = {}
    t[#t+1] = {
        Type = "type1",
        Key = "someKey",
        Value = data.SomethingInteresting
    }
    --以此类推,有时会添加一些实际逻辑来调味
    dataWriter:open(fileName .. ".bla")
    dataWriter:batchWrite(t)
    dataWriter:close()
end

这样做的小优点是不使用长的容易出错的临时表名称,并使用 t[#t+1] 这个惯用语法来扩展数组部分,应该比调用 table.insert() 更快。

否则,任何结构性改进的来源都将在代码的“以此类推,有时会添加一些实际逻辑来调味”部分。

  • 在那里查找常见的计算和片段,可以将它们收集到本地函数中。
  • 记住,您可以嵌套函数定义,因此助手函数可以限制在它们使用的地方的范围内。
  • 寻找过于聪明的逻辑,并将其重写为对下一年的维护者有意义的逻辑。
  • 维基:Lua 设计模式
  • 维基:Lua 的禅
  • 维基:优化提示
  • 维基:分析 Lua 代码

最重要的是,警惕过早的优化。将现有内容作为比较基准进行基准测试,并将其用作查找性能瓶颈的指南。

2009-09-10 19:09:38
stackoverflow用户161424
stackoverflow用户161424

通过"反复出现,偶尔加入一些实际逻辑的调料",我想你的意思是你有很多像这样的块:

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

对于"偶尔"出现的逻辑,每个条目都可以有一个可选函数,以在循环中为您提供有趣的信息。例如:

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

或者,如果需要更多的可定制性,您甚至可以允许表格中的个别条目是函数。每个条目函数将返回一个表格(或不返回)。

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
2009-09-10 21:03:02