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