[英]Is it idiomatic Ruby to add an assert( ) method to Ruby's Kernel class?
我通過在Ruby中編碼等效於Kent Beck的xUnit來擴展我對Ruby的理解。 Python(由Kent編寫)以廣泛使用的語言提供了assert()方法。 Ruby沒有。 我認為添加它應該很容易,但是內核是否適合放置它?
順便說一句, 我知道Ruby中存在各種Unit框架 -這是一種學習Ruby習慣用法的練習,而不是“完成某些工作”。
不,這不是最佳做法。 Ruby中對assert()的最好類比只是在提高
raise "This is wrong" unless expr
如果您想提供更具體的異常處理,則可以實現自己的異常
我認為在Ruby中使用斷言是完全有效的。 但是您提到的是兩件事:
assert
方法檢查您的測試期望。 它們只能在測試代碼中使用,而不能在應用程序代碼中使用。 assert
構造,旨在在程序代碼中使用它們,以檢查您對它們的完整性所做的假設。 這些檢查建立在代碼本身內部。 它們不是測試時實用程序,而是開發時實用程序。 我最近寫了solid_assert:一個小的Ruby庫,實現了Ruby斷言實用程序,並且在我的博客中也發表了一篇文章,解釋了它的動機 ..它使您可以以下形式編寫表達式:
assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"
invariant "Lists with different sizes?" do
one_variable = calculate_some_value
other_variable = calculate_some_other_value
one_variable > other_variable
end
而且可以將它們停用,以便將assert
和invariant
評估為空語句。 這樣可以避免生產中出現任何性能問題。 但是請注意, 實用程序員建議不要停用它們。 僅當它們確實影響性能時,才應停用它們。
關於回答說慣用的Ruby方式使用的是普通的raise
語句,我認為它缺乏表達能力。 斷言編程的黃金法則之一是不使用斷言進行常規異常處理。 它們是完全不同的兩件事。 如果您對兩者使用相同的語法,我認為您的代碼會更加晦澀。 當然,您會失去激活它們的能力。
您可以確信使用斷言是一件好事,因為兩本必讀的經典書籍,例如《從程序員到熟練的實用程序員》和《代碼完整》,全書都專門針對它們,並推薦使用它們。 還有一篇名為“ 帶斷言的編程”的好文章,很好地說明了什么是斷言編程以及何時使用它(基於Java,但是概念適用於任何語言)。
您將assert方法添加到內核模塊的原因是什么? 為什么不只使用另一個稱為Assertions
模塊呢?
像這樣:
module Assertions
def assert(param)
# do something with param
end
# define more assertions here
end
如果您確實需要斷言在任何地方都可以使用,請執行以下操作:
class Object
include Assertions
end
免責聲明:我沒有測試代碼,但原則上我會這樣做。
這不是特別習慣,但我認為這是個好主意。 特別是如果這樣做:
def assert(msg=nil)
if DEBUG
raise msg || "Assertion failed!" unless yield
end
end
這樣一來,如果您決定不使用DEBUG(或其他方便的開關,我以前使用過Kernel.do_assert)設置,則不會產生任何影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.