我有一个函数主要包含大量的调用(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是一个预定义类的实例,用于处理写入文件的过程。
答案 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()
更快。
否则,任何结构改进的来源都将出现在代码的“依此类推”中。
最重要的是,要注意过早优化。将您现在拥有的内容作为比较点,并将其作为查找性能瓶颈的指南。
答案 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,看看你的功能是如何比较的。从事物的声音来看,你可能有很多事要做。是否存在由不同条件逻辑隔离的类似/复制代码块?嵌套循环或条件?在尝试将大型函数拆分为多个部分时,这些是一些简单的起点。