这种模式可以用于声明类级别选项吗?这里考虑的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
答案 0 :(得分:2)
无论是平常还是不寻常都没关系。它是有效的,并且可能很有用。它是一个常量,指的是散列,而不是类,也不是变量。
特别是类名以大写字母开头并不是特别的。常量以大写字母开头,其中类名是特殊情况。但资本并不一定意味着不变。方法名称可能以资本开头,也可能不以资本开头。
答案 1 :(得分:2)
由于Options
是一个常量,我宁愿使用类似OPTIONS
的名称,它更接近Ruby约定(您可以在{{中看到id使用File::Constants::APPEND
之类的名称) 3}})。现在写它的方式,它让我想到一个类而不是一个常数。
答案 2 :(得分:1)
你能在几秒钟内看出它在做什么以及为什么会这样做?如果是这样的话,它就会有效地传达它的观点,即使它有点非惯用。在这种情况下,看起来它定义了@options
的一些默认值,所以它看起来不错 - 除非它在整个程序的上下文中做了其他事情,在这种情况下它会让人感到困惑,因为它除了什么之外还做了什么它看起来像是在做。
此外,Options
大写以表示应将其视为常量,理想情况下不应在运行时更改。这也是为什么类名通常大写的原因:它们通常是常量。 (Ruby实际上并没有强制执行此操作。这是一种惯例,用于在不故意使用元编程技术的情况下更容易分辨哪些值不应更改。)
答案 3 :(得分:1)
CSV库也是这样做的;常量在那里被称为DEFAULT_OPTIONS。