在可能的情况下力求简单总是一个好主意,为此,最好以直截了当的方式陈述事情。像这样的声明使得很难确定变量的来源,因为它们相当彻底地嵌入到语句中。
在括号内声明作用域变量通常被认为是可以接受的:
if (found = MyModel.find_by_pigeon_id(params[:pigeon_id]))
# Variable 'found' used only within this block
end
# Ruby variables will persist here, but in many languages they are out of scope
更详细的版本实际上具有以下含义:
found = MyModel.find_by_pigeon_id(params[:pigeon_id])
if (found)
# Variable 'found' can be used here
end
# Implies 'found' may be used here for whatever reason
能够向上扫描程序并非常清楚地看到所有声明的变量总是很好的。隐藏东西除了让人们感到沮丧之外没有任何用处。
就你可以逃脱的程度而言,Ruby 比许多其他语言要轻松得多。有些语言会因为使事情复杂化而严厉惩罚你,因为声明或转换中的一个小错误可能会产生巨大的影响。这并不意味着您应该在每一个机会中充分利用这一点。
以下是我提倡实施您的第一个示例的方式:
# Ensure that @select_file is defined
@select_file ||= Qt::FileDialog.new
@pushButton.connect(SIGNAL(:clicked)) do
# Block is split out into multiple lines for clarity
@select_file.show
end
第二:
# Simple declaration, variable name inherited from class name, not truncated
timer = Qt::Timer.new
timer.connect(SIGNAL(:timeout)) do
# Long parameter list is broken out into separate lines to make it clear
# what the ordering is. Useful for identifying accidentally missing parameters.
@label.text = Qt::Application.translate(
"MainWindow",
"The time right now is #{Time.now}",
nil,
Qt::Application::UnicodeUTF8
)
end
timer.start(1000)
我发现最复杂的程序通常看起来最简单,因为它们是由经验丰富的人编写的,他们知道如何以直截了当的方式表达事物。
有趣的是,一些最简单的程序通常是最复杂的,因为它们是由新手编写的,他们要么是哗众取宠,要么是在深陷困境并不断向问题抛出代码以期解决问题。