【问题标题】:Recommended indentation style for Ruby `if` blocks that assign a value to a variable? [closed]为变量赋值的 Ruby `if` 块推荐的缩进样式? [关闭]
【发布时间】:2012-01-05 15:46:15
【问题描述】:

哪些是更好的 Ruby 代码格式样式,为什么?

选项 A:

def load_business
  @business ||= if params[:badge_uuid] 
    # some code
  else
    # some other code
  end
end

选项 B:

def load_business
  @business ||= if params[:badge_uuid] 
                  # some code
                else
                  # some other code
                end
end

【问题讨论】:

  • 我宁愿避免他们两个。也许为这两种情况创建方法然后使用?:
  • 我会将整个 if 语句拆分为一个方法。@business ||= business_value(params)。
  • 我不明白为什么这个问题已经结束了,这似乎是一个有效的问题......风格问题在编程中非常重要。
  • 那我应该在哪里问这种问题。请推荐一个论坛,亲爱的版主。
  • 一个好的“选项 C”应该是:在 '=' 字符后添加一个换行符,然后在 'if' 块之后缩进两个空格,如 this style guide

标签: ruby coding-style


【解决方案1】:

这是一个主观问题,所以我们只能给出(希望是合理的)意见。我总是使用选项 A。我的理由:

  1. 代码块以相同的缩进级别打开和关闭,从而产生“视觉凝聚力”。

  2. 如果变量名改变了它的大小,你不需要编辑任何东西(不过有些文本编辑器会自动处理)。

  3. 您在源代码中创建了一个“漏洞”。变量名越大,洞越大。 IMO 这在视觉上很烦人。此外,在达到某个合理的 80/100 字符限制之前,您的可用空间更少。

我在编写多行哈希/数组/...时使用这种风格(请注意最后一个元素中的逗号,以便我们可以轻松地以差异友好的方式重新排序它们):

hash = {
  :a => 1,
  :b => 2,
}

array = [
  :a, 
  :b,
]

【讨论】:

  • 第二点可以通过更好的文本编辑器来解决。
  • @NiklasBaumstark:哪个编辑器会自动处理这种情况?
  • @undur_gongor:选项 B 是 EMACS 缩进 Ruby 代码的默认方式(尽管它是可配置的)。因此,您只需按一下 TAB 就可以简单地重新缩进整个 if 语句(如果您擅长破解 elisp,甚至可以让它自动执行此操作)。我认为在 vim 中同样简单。
【解决方案2】:

我会使用选项 A。

这里有一些也是这样的 ActiveRecord 代码。

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/has_many_association.rb#L35

编辑:

这是一个相当自以为是的问题,可能没有正确的答案。因此,无论你怎么做,只要它不仅仅是丑陋的代码,人们可能不会反对你。

【讨论】:

    【解决方案3】:

    使用if 块的值不会让我死。也许是因为我来自if 是一个声明而不是表达的背景......所以我的两分钱是:

    def load_business
      @business ||= (  params[:badge_uuid]
                     ? # some code
                     : # some other code)
    end
    

    如果代码片段不是普通表达式,我会将它们分配给if 的每个部分中的一个值,并使用该变量来更新@business

    【讨论】:

    • 正如您所说,您遭受了源于命令背景的禁忌。有 很多 种语言(不一定是函数式的)条件分支返回表达式。问题:如果你有一个 if 块作为方法的最后一个表达式,是保留它作为 if,还是设置变量然后返回该变量?
    • +1 用于现场提问。由于在 Lisp 中缺少 return 20 多年感到沮丧,我最终会将值分配给一个变量并返回它,或者在 if 的每个部分中放置一个 return。在没有显式返回语句的情况下阅读代码时,不清楚一个函数是否打算返回某些内容,或者该内容是否恰好是函数中的最后一个——复合构造隐式返回每个分支的最后一个值,这使得代码更难读。就个人而言,我认为这是一个主要的设计缺陷,在 Ruby 等语言中也是如此。
    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2014-03-11
    • 2015-09-19
    • 2010-12-16
    • 2018-03-13
    • 2014-09-10
    • 2014-10-31
    相关资源
    最近更新 更多