避免编写代码两次,同时保持正确的代码方式?

时间:2013-05-10 16:06:36

标签: optimization file-io input lua

我正在尝试创建一个函数getInput(prompt, number),其中prompt是将在用户输入前打印的文本(例如>Choose a password:)和number是一个布尔值,用于指示输入应该是数字还是任何类型。

这是我写的函数:

function getInput(prompt, number)
    if number then
        while not input do
            io.write(prompt)
            input = tonumber(io.read())
        end
    else
        io.write(prompt)
        input = io.read()
    end
    return input
end

但是,我重复了很多代码。 我已经io.write(prompt)写了两次,我在其中一个电话周围input = io.read()两次tonumber()。 我基本上只是重复同样的事情两次,一次在while循环中,一次不在其中。

这是我做的一个小解决方法:

function getInput(prompt, number)
    while not input do
        io.write(prompt)
        input = io.read()
        if number then
            input = tonumber(input)
        end
    end
    return input
end

此版本只编写io.write()io.read()一次,但这不是“正确”的代码。 我正在使用while循环,即使没有必要(当number为假时)。 我也在if number循环的每一轮进行while检查(当number为真时)。

我应该使用第一个代码,还是有办法改进第二个代码以使其“更合适”?

3 个答案:

答案 0 :(得分:3)

通常,重复一个类似于io.write(prompt)的非常简单的单行代码不会被视为“代码重复”。而且,反复检查相同的简单条件通常不会被认为是性能危险。两种方式都具有相同的可读性,因此根据您的喜好,任何一种都可以。

一个可能的改进是将函数拆分为两个,并删除number标志,如下所示:

function getInput(prompt)
    io.write(prompt)
    return io.read()
end
function getNumericInput(prompt)
    while not input do
        io.write(prompt)
        input = tonumber(io.read())
    end
    return input
end

但是,在输入类型是在运行时决定的情况下,这可能是不可接受的,并且必须通过变量来控制。

答案 1 :(得分:1)

local function getInput(prompt, number)
   io.write(prompt)
   local input = (number and tonumber or assert)((assert(io.read(), 'EOF')))
   return (input and function() return input end or getInput)(prompt, number)
end

答案 2 :(得分:0)

好吧,我会说第一种形式非常清晰易读。即使你两次写出非常相似的陈述,也没有什么不妥。

我唯一的建议就是将它分成两个没有布尔标志的函数(即getInput(prompt)和getNumericInput(prompt)),或者将布尔值更改为一个类型并移动逻辑以进行捕获适当的类型到单独的方法:

function getInput(prompt, type)
    io.write(prompt)
       input = getTypedInput(type)
    return input
end

function getTypedInput(type)
    input(io.read())
    ...change to type here <I don't know lua syntax)
    return input
end

后者对于你遇到的问题可能有点过分,除非你认为你有可能会使用更多的类型而不是数字或非数字。