2009-09-10 47 views
0

我有一个函数,主要包含大量的调用(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

这个问题还不够清楚。添加一些代码来启发我们 – Sergio 2009-09-10 13:30:23

+0

数据操作是否特定于不同的实体?如果是这样,你可以创建一个基于你的数据库表的类设计。 – 2009-09-10 13:36:17

+0

更好地调整我的答案,“表”我的意思是阵列我猜。这是一个lua问题,所以这就是为什么我指的是桌子,但我想要泛化这个问题,以便它可以帮助更多的人。 – RCIX 2009-09-10 13:39:28

回答

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()快。

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

  • 查看可以收集到本地函数中的常见计算和片段。
  • 请记住,您可以嵌套函数定义,所以帮助函数可以被限制在它们使用的地方。
  • 寻找过于聪明的逻辑,并将其重写为明年将维护它的人。
  • 维基:Lua Design Patterns
  • 维基:Zen Of Lua
  • 维基:Optimisation Tips
  • 维基:Profiling Lua Code

首先,谨防过早优化。基准你现在有什么比较点,并将其用作寻找性能瓶颈的指导。

0

没有任何特定的东西继续下去,我会试着研究code smells,看看你的功能如何比较。从事物的声音来看,可能有很多事情要做。是否存在由不同的条件逻辑隔离的类似/复制代码块?嵌套循环或条件?在尝试将大型函数分解为多个部分时,这些都是一些简单的起点。

2

通过“等广告nauseum,偶尔,但实际的逻辑的香料的东西”我想你的意思是你有很多块这样的:

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 

或者,如果您需要更多的可定制性,您甚至可以允许表中的单个条目是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 
相关问题