当前位置:  开发笔记 > 编程语言 > 正文

在Ruby的Kernel类中添加assert()方法是惯用的Ruby吗?

如何解决《在Ruby的Kernel类中添加assert()方法是惯用的Ruby吗?》经验,为你挑选了4个好方法。

我通过在Ruby中编写相当于Kent Beck的xUnit来扩展我的Ruby理解.Python(Kent写入)在语言中有一个assert()方法,该方法被广泛使用.Ruby没有.我认为应该很容易添加这个但是Kernel是正确的地方吗?

顺便说一下,我知道Ruby中存在各种单元框架 - 这是学习Ruby习语的练习,而不是"完成某些事情".



1> Julik..:

不,这不是最好的做法.在Ruby中断言()的最好类比就是提高

 raise "This is wrong" unless expr

如果要提供更具体的异常处理,则可以实现自己的异常


你也可以使用`fail if [expr]`,如果你愿意,它会抛出运行时错误.
`fail`是`raise`的别名,不是吗?他们都给出了'RuntimeError`.(也许一个更惯用?)
@nus断言不是用于警告,而是用于确保在该位置始终*为真.如果你的断言在生产中失败,你绝对想要中止.
如果你的软件在生产中难以快速失败,那就太好了.我认为沉默的异常是"捕获所有异常"变通办法的可怕副本.当事情发生时,这通常是第一个可怕的绑定应用于可怕的代码.
断言和例外是不同的事情.

2> jmanrubia..:

我认为在Ruby中使用asserts是完全有效的.但是你提到了两件不同的事情:

xUnit框架使用assert方法来检查测试期望.它们旨在用于您的测试代码,而不是应用程序代码中.

某些语言(如C,Java或Python)包含一个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陈述,我认为缺乏表达性.断言编程的一个重要原则是不使用断言进行正常的异常处理.它们是两个完全不同的东西.如果你对它们使用相同的语法,我认为你的代码会更加模糊.当然,你失去了停用它们的能力.

您可以确信使用断言是一件好事,因为两本必读的经典书籍,如The Pragmatic Programmer From Journeyman to Master和Code Complete,将整个部分专门用于他们并推荐他们使用.还有一篇很好的文章标题为使用断言编程,很好地说明了什么是断言编程以及何时使用它(它基于Java,但概念适用于任何语言).



3> Christoph Sc..:

将断言方法添加到内核模块的原因是什么?为什么不使用另一个叫做的模块Assertions呢?

像这样:

module Assertions
  def assert(param)
    # do something with param
  end

  # define more assertions here
end

如果你真的需要你的断言在任何地方可用,请执行以下操作:

class Object
  include Assertions
end

免责声明:我没有测试代码,但原则上我会这样做.



4> regularfry..:

这不是特别惯用,但我认为这是一个好主意.特别是如果这样做:

def assert(msg=nil)
    if DEBUG
        raise msg || "Assertion failed!" unless yield
    end
end

这样,如果您决定不使用DEBUG(或其他一些方便的开关,我过去使用过Kernel.do_assert)设置就没有影响了.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有