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