这种模式被认为是声称类选项的惯用语吗?

时间:2013-12-29 14:09:45

标签: ruby

这种模式可以用于声明类级别选项吗?这里考虑的Options是什么?一个类(类名以大写字母开头)?常数?类中的正常变量?

class Markdown
  Options = {
    no_intra_emphasis: true,
    fenced_code_blocks: true,
    strikethrough: true
  }

  def initialize(text, options = {})
    @text = text
    @options = options.reverse_merge!(Options)
  end
end

4 个答案:

答案 0 :(得分:2)

无论是平常还是不寻常都没关系。它是有效的,并且可能很有用。它是一个常量,指的是散列,而不是类,也不是变量。

特别是类名以大写字母开头并不是特别的。常量以大写字母开头,其中类名是特殊情况。但资本并不一定意味着不变。方法名称可能以资本开头,也可能不以资本开头。

答案 1 :(得分:2)

由于Options是一个常量,我宁愿使用类似OPTIONS的名称,它更接近Ruby约定(您可以在{{中看到id使用File::Constants::APPEND之类的名称) 3}})。现在写它的方式,它让我想到一个类而不是一个常数。

答案 2 :(得分:1)

你能在几秒钟内看出它在做什么以及为什么会这样做?如果是这样的话,它就会有效地传达它的观点,即使它有点非惯用。在这种情况下,看起来它定义了@options的一些默认值,所以它看起来不错 - 除非它在整个程序的上下文中做了其他事情,在这种情况下它会让人感到困惑,因为它除了什么之外还做了什么它看起来像是在做。

此外,Options大写以表示应将其视为常量,理想情况下不应在运行时更改。这也是为什么类名通常大写的原因:它们通常是常量。 (Ruby实际上并没有强制执行此操作。这是一种惯例,用于在不故意使用元编程技术的情况下更容易分辨哪些值不应更改。)

答案 3 :(得分:1)

CSV库也是这样做的;常量在那里被称为DEFAULT_OPTIONS。