Architecture 构建此功能的更好方法?

Architecture 构建此功能的更好方法?,architecture,function,lua,Architecture,Function,Lua,我有一个函数,它主要包括对另一个函数的大量调用(50+),该函数将数据插入数组,逻辑在这里和那里指示各种条件,以将各种项目插入数组(加上最后一点,将数组的内容写入文件)。我想知道是否有更好的方法来实现这个功能;我想我可以从逻辑上将数组插入命令集拆分为它们自己的函数开始,但我想知道是否还有更多的事情可以做。有吗 例如: function buildTable(fileName, data) local dataToWrite = {} table.insert(datTWrite,

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

如果没有任何特定的操作,我将尝试研究并查看函数的比较结果。从事物的声音来看,你可能有很多事情要做。是否存在由不同条件逻辑隔离的类似/复制代码块?嵌套循环还是条件?当尝试将一个大函数拆分为多个部分时,以下是一些简单的起点。

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

好消息是,您没有直接进入常见的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[#t+1]={ Type=“type1”, Key=“someKey”, Value=data.somethinginterest } --等等,偶尔用一些实际的逻辑来增加情趣 数据写入器:打开(文件名..“.bla”) 数据写入器:批写入(t) dataWriter:close() 结束 它的一个小优点是不需要为临时表使用一个容易打字的长名称,并使用
t[#t+1]
习惯用法扩展数组部分,这应该比调用
table.insert()
更快

否则,任何结构改进的来源都将在代码的“等等”部分

  • 查找可以收集到本地函数中的常见计算和片段
  • 请记住,您可以嵌套函数定义,因此可以将辅助函数的作用域约束到使用它们的位置
  • 寻找太聪明的逻辑,重写它们,使之对明年必须维护它的人来说是明智的
  • 维基:
  • 维基:
  • 维基:
  • 维基:

最重要的是,要小心过早的优化。将您现在拥有的作为比较点的基准,并将其用作查找性能瓶颈的指南

好消息是,您还没有直接进入常见的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[#t+1]={ Type=“type1”, Key=“someKey”, Value=data.somethinginterest } --等等,偶尔用一些实际的逻辑来增加情趣 数据写入器:打开(文件名..“.bla”) 数据写入器:批写入(t) dataWriter:close() 结束 它的一个小优点是不需要为临时表使用一个容易打字的长名称,并使用
t[#t+1]
习惯用法扩展数组部分,这应该比调用
table.insert()
更快

否则,任何结构改进的来源都将在代码的“等等”部分

  • 查找可以收集到本地函数中的常见计算和片段
  • 请记住,您可以嵌套函数定义,因此可以将辅助函数的作用域约束到使用它们的位置
  • 寻找太聪明的逻辑,重写它们,使之对明年必须维护它的人来说是明智的
  • 维基:
  • 维基:
  • 维基:
  • 维基:
最重要的是,要小心过早的优化。将您现在拥有的作为比较点的基准,并将其用作查找性能瓶颈的指南

我想你的意思是你有很多块,比如:

table.insert(datTWrite, {
    Type = "type1",
    Key = "someKey",
    Value = data.SomethingInteresting
})
函数唯一独特的方面是要填充的表和
数据
对象。我个人的“最佳实践”是将所有这些都放到一个单独的表格中,如:

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
或者,如果需要更多的可定制性,您甚至可以允许表中的单个条目成为函数。每个entry函数将返回一个表(或不返回)

我想你的意思是,你有很多块,比如:

table.insert(datTWrite, {
    Type = "type1",
    Key = "someKey",
    Value = data.SomethingInteresting
})
函数唯一独特的方面是要填充的表和
数据
对象。我个人的“最佳实践”是将所有这些都放到一个单独的表格中,如:

local entries = {
    {
        Type = "type1",
        Key = "someKey",
        ValueField = "SomethingInteresting",
    },
    {
        Type = "type2",
        Key = "someOtherKey",
        ValueField = "SomethingElse",
    },
    -- etc.
}
此表应该是全局表,或者在定义函数的范围之外。现在,您可以更轻松地重新配置条目,而无需对执行实际工作的函数进行任何更改。通过迭代t,函数本身大大简化