将代码语句放在括号中是一种很好的编程习惯吗?

时间:2009-12-15 13:05:19

标签: ruby qt qtruby

我从来没有在我生命中读过的所有源代码中看到过这种情况。如果它被认为是糟糕的编程实践,那么我必须理解它无法理解的原因。此外,我认为它有时会提高可读性而不是恶化它。以下是我在ruby代码中完成的几个地方。

@pushButton.connect(SIGNAL :clicked) do (@select_file ||= Qt::FileDialog.new).show end

(tmr=Qt::Timer.new).connect SIGNAL :timeout do 
  @label.text = Qt::Application.translate("MainWindow", "The time right now is #{Time.now}", nil, Qt::Application::UnicodeUTF8)
end 
tmr.start(1000)

4 个答案:

答案 0 :(得分:9)

在任何可能的地方努力追求简洁总是一个好主意,为此,最好以直截了当的方式陈述事物。这样的声明使得很难确定变量的来源,因为它们在声明中被完全嵌入。

通常认为在括号内声明范围变量是可接受的:

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)

我发现最复杂的程序通常看起来最简单,因为它们是由具有丰富经验的人编写的,他们知道如何以直截了当的方式表达事物。

有趣的是,一些最简单的程序往往是最复杂的,因为它们是由新手编写的,他们要么哗众取宠,要么炫耀或者正在深入挖掘自己并且不断抛出代码来解决问题它

答案 1 :(得分:6)

我觉得这很难读。我希望它稍微冗长一点,但更清楚:

tmr = Qt::Timer.new
tmr.connect SIGNAL :timeout do 
  @label.text = Qt::Application.translate("MainWindow", "The time right now is #{Time.now}", nil, Qt::Application::UnicodeUTF8)
end 
tmr.start(1000)

答案 2 :(得分:5)

包含太多逻辑语句的代码塞满了1行很难阅读,因为读者基本上必须将它在大脑中解放成类似于troelskn的答案的陈述。

其他原因不太可读:

  • 它使行长度超过大多数文本编辑器窗口的边界。
  • 它模糊了调试时可能需要查看的各个步骤。

答案 3 :(得分:2)

我认为你的意思是parens?

支持:{

Paren :(

如果你使用大括号而不是do / end,你的第一个例子会变得更具可读性 - 如果一个块在一行上,你会使用大括号,而do / end用于多行块。


@pushButton.connect(SIGNAL :clicked) { (@select_file ||= Qt::FileDialog.new).show }

第二个例子我在java / c中看过很多,但我实际上看到它在ruby中的功能更多:

Qt::Timer.new.connect SIGNAL :timeout do 
  @label.text = Qt::Application.translate("MainWindow", "The time right now is #{Time.now}", nil, Qt::Application::UnicodeUTF8)
end.start(1000)

但是你在启动它之后就没有对该对象的引用。