2013-02-21 84 views
0

在Ruby中,有一个约定使方法名以一个问号结束,以表明它的返回值是布尔值。为什么布尔值被认为如此特别?如果你知道某个方法的返回值特别是布尔值,有什么方便吗?毕竟,在Ruby中,可以将各种返回值(getter)方法插入到条件中,而不必关心它是否为布尔值。布尔值是什么特别?

我认为使用问号只是表示一个布尔值是浪费。应该有更多有用的用途。我有很多用例,我想要一对getter和setter方法,其中setter方法应返回self,以便我可以在方法链中使用它。并将它们命名为get_fooset_foo看起来很麻烦。而不是按照惯例,我很想来命名一对getter和setter方法是这样的:

def foo?; @foo end 
def foo v; @foo = v end 

其中@foo值不(一定)布尔。 (除了潜在的批评,打破惯例会混淆其他程序员),这样做有什么问题吗?

+3

这只是一个约定的问题。在其他语言中,你会写“isFoo”(这也意味着一个布尔值),所以“foo?”为您节省一个高超的人物。 – 2013-02-21 16:34:01

+0

@Chris我的观点是,为什么你需要首先指出某件事是布尔型的。我认为区分getter和setter方法更重要,并且有一对这样的方法比拥有一对返回布尔值和其他非布尔值的方法更加频繁,您需要区分它们。 – sawa 2013-02-21 16:38:04

回答

4

没有什么特别的,它只是一个约定。一个问题可以用“是”或“否”来回答,但也可以用别人的名字来回答。

通过在带有问号的方法上返回一个布尔值,它表明它是一个明确的行为。

如果您的答案为“是”或“否”,那么您的代码读者很容易识别您的方法的行为,而无需查看实现。另一方面,如果你让它返回任何其他类型,读者在阅读你的类和方法定义时就很难理解你的代码。

使用布尔值只有两个可能的答案。如果返回值不是布尔值,它可以是任何东西,这根本无济于事。您仍然需要查看方法实现。你应该总是更深入地理解一些代码,但是使用这个约定会使它更简单。

+0

为什么只有在值为布尔值时才需要节省阅读文档的时间?对于其他方法,你必须知道它做了什么。我在问布尔值是什么特别。例如,如果有一个约定将某个方法名称与其他字符附加在一起时,则不需要查找该方法的文档。为什么它没有完成数字,而是布尔? – sawa 2013-02-21 16:44:48

+3

@sawa:看到我的答案。问号的意思是“这个方法是一个谓词,它的结果*应该被视为真/假值”。它并不指定返回类型。 – 2013-02-21 16:47:55

+1

因为用布尔值只有2个可能的答案。如果不是布尔型答案,它可以是任何东西,根本没有帮助。您仍然需要查看方法实现。 你应该总是要进一步了解一些代码,但通过这样做,它变得简单。 – 2013-02-21 16:50:08

4

在方法名中使用问号表示方法是谓词,这里有一个约定。 AFAIK,这个谓词不需要(通过约定)返回一个布尔值,这要归功于简单的规则。

除了打破常规的潜在批评会混淆其他程序员,这样做有什么问题吗?

令人困惑和令人惊讶的同行程序员是不好的。 Ruby不在乎。这只是一个惯例。和约定存在的原因。

+0

在OOP中,任何方法都是谓词。我不明白你为什么这么说,只是为了带有问号的方法。或者,你是否提到狭义的“谓语”,这意味着你说我写作的过程中没有什么不对(除了你在第二段中的观点)? – sawa 2013-02-21 16:57:27

+0

你是什么意思,“在OOP中任何方法都是谓词”? – 2013-02-21 17:00:48

+0

在OOP中,方法在接收器上定义。这与英语说得相媲美,你可以用“约翰”这个主语和“吃”这个谓语来形容一个句子“John吃晚饭”。从这个意义上说,在OOP中,任何方法都是以接收器为基础的。这不是你的意思吗? – sawa 2013-02-21 17:05:35

3

可以把任何东西放在流量控制结构中,但是语义上的布尔值是合适的。 “如果”在真正的人类语言中通常采用布尔值,许多编程语言中的结构也是如此。 Ruby喜欢使事情变得方便,并为语言中的所有内容赋予“真实”价值,这会影响它在布尔上下文中的表现。

换句话说,布尔值是几乎专门用于流量控制的唯一东西,所以惯例是让它们看起来是“正确”的流量控制构造。这是他们的本土环境。

(除了潜在的批评,打破常规会混淆其他程序员),这样做有什么问题吗?

从这个意义上说,在20世纪20年代喜剧演员之后命名所有变量并没有什么错,否则没有什么错。但是,与20世纪20年代喜剧演员命名所有变量一样,这也不是一个好主意。在我所知的任何语言(无论是人还是计算机)中,没有任何一个问号的意思是“得到”。因此,您的代码的语义与该惯例不符。

+1

我认为你对人类语言的描述是错误的。问号在自然语言中的主要目的是提出一个问题,这个问题不是必要的,而是一个“否”(布尔)问题。如果你提出一个问题:“你的名字”的音调越来越高,那么这个问题就是寻找你的名字的问题,而这通常会被转录为“你的名字?”。我认为将这个问号扩展到计算机语言是很自然的。 – sawa 2013-02-21 16:52:12

+0

+1为您的第二段。 – sawa 2013-02-21 17:15:29

2

这个问题和答案归结为“POLS”又名“Principle of Least Surprise”。

方法名称可以是随机选择由下划线分隔的字母和数字,'!','?'和'='洒在他们身上,如果我们选择这样做的话。它们可以在运行时随机由代码创建,并且只要其余代码使用相同的字符排列,程序就会运行,Ruby会很高兴。

我们人类,程序员,确定所使用的方法的名称,以表示某些事物,特征或行为。试图使用随机命名的方法会导致疯狂,或者至少很难保持程序。所以,相反,我们试图用明智的名字来表达事物。有时它们是动词或形容词,有时它们更具描述性,因为该方法做了几件事情。

作为该命名的一部分,有时我们希望提供有关该方法行为的其他提示。按照Ruby惯例,我们使用“!”警告编码人员该方法会改变某些东西或具有破坏​​性。 “=”表示该方法需要一个参数并将其分配给接收器/对象。这是一个setter方法,在许多其他语言中,它使用“set_flag ...”或“set_value ...”作为名称是习惯用法。这只是该语言中的一种约定,其次是语言中的开发人员。

我们使用“?”在Ruby中询问一个关于某个对象的问题,不管它是否对这个对象是真实的。我们可以说“is_true?”或“真的?”并表明我们正在测试这件事是否真实。如果它是真的,或者是false,那么它是一个布尔响应,所以我们返回一个真/假的值。

+0

我不明白如何随机命名一个方法与我的问题有关。 – sawa 2013-02-21 18:14:37

+0

你没有读完整个答案。 – 2013-02-21 19:06:34

相关问题