2013-02-21 86 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

相關問題