【问题标题】:is it good programming practice to put code statements in braces?将代码语句放在大括号中是一种好的编程习惯吗?
【发布时间】:2009-12-15 13:05:19
【问题描述】:

在我一生中读过的所有源代码中,我从未见过这样做过。如果它被认为是不好的编程习惯,那么一定有一个我无法理解的原因。另外,我认为它有时会提高而不是恶化它的可读性。这是我在我的 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)

【问题讨论】:

    标签: ruby qt qtruby


    【解决方案1】:

    尽可能地力求简单总是一个好主意,为此,最好以直截了当的方式陈述事情。像这样的声明很难确定变量的来源,因为它们相当彻底地嵌入到语句中。

    在括号内声明作用域变量通常被认为是可以接受的:

    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)
    

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

    有趣的是,一些最简单的程序往往是最复杂的,因为它们是由新手编写的,他们要么是哗众取宠,要么是在深陷困境,不断地向问题抛出代码以期解决问题它。

    【讨论】:

      【解决方案2】:

      我认为它很难阅读。我希望它稍微详细一点,但更清晰:

      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)
      

      【讨论】:

        【解决方案3】:

        将太多逻辑语句塞进一行的代码很难阅读,因为读者基本上必须在他们的大脑中将其展开为类似于 troelskn 答案的语句。

        可读性较差的其他原因:

        • 它使行长流过大多数文本编辑器窗口的边框。
        • 它掩盖了您在调试时可能需要查看的各个步骤。

        【讨论】:

          【解决方案4】:

          我想你的意思是parens?

          大括号:{

          括号:(

          如果您使用大括号而不是 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)
          

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

          【讨论】:

            猜你喜欢
            • 2021-12-10
            • 2015-10-01
            • 2022-01-20
            • 2014-11-05
            • 2018-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-02
            相关资源
            最近更新 更多