如何更好地设计这个函数架构?
我有一个函数,它主要由大量调用(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
好消息是,您还没有直接进入常见的 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 代码
最重要的是,警惕过早的优化。将现有内容作为比较基准进行基准测试,并将其用作查找性能瓶颈的指南。
通过"反复出现,偶尔加入一些实际逻辑的调料",我想你的意思是你有很多像这样的块:
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
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
如果没有任何具体的线索,我会尝试研究 代码异味,并比较一下您的函数。听起来,您可能还有很多事情要做。是否有通过不同的条件逻辑隔离的类似/复制的代码块?嵌套的循环或条件?这些是将一个大函数拆分为多个部分的一些简单起点。