如何在保持编码规范的同时避免重复编写代码?

我正在尝试创建一个名为 getInput(prompt, number) 的函数,其中 prompt 是将打印在用户输入前面的文本(例如 >选择密码:),而 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() 写了一次,但这不是很“正式”的代码。 即使不需要 number 是 false 时,我仍在使用 while 循环。 即使 number 是 true,我也在每一轮 while 循环中执行 if number 检查。

我应该使用第一个代码,还是有一种改进第二个代码更加“正式”的方法?

点赞
用户335858
用户335858

通常情况下,重复一个非常简单的单行代码,类似于 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

然而,在运行时决定输入类型并且必须通过变量进行控制的情况下,这种方式可能不可接受。

2013-05-10 16:14:05
用户1847592
用户1847592
```lua
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

```lua
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
2013-05-10 16:18:08
用户61673
用户61673

我觉得第一种表达方式相当清晰易读。即使你写了相似的语句两次,其中没有太大的问题。

我唯一的建议是将其拆分成两个函数,不要使用布尔标志(即,getInput(prompt)和getNumericInput(prompt)),或者将布尔转换为类型并将捕获适当类型的逻辑移动到单独的方法:

`` ` 函数getInput(提示,类型)     io.write(prompt)        input = getTypedInput(type)     返回输入 结尾

function getTypedInput(type)     input(io.read())     …更改类型(我不知道Lua语法)     返回输入 结尾

`` `

后者对于您的问题可能有点过度设计,除非您认为有可能使用比数字或非数字更多的类型。

2013-05-10 16:21:10