【问题标题】:Are ruby methods ending on '?' allowed to change stuff?ruby 方法是否以“?”结尾允许改变东西?
【发布时间】:2019-09-17 19:04:59
【问题描述】:

我正在查看我们公司的一个 RoR 应用程序中的一些代码。而且我注意到,有时会使用带问号的方法,例如我们的一个控制器中使用的以下方法。

  # readonly checker
  # @param url to redirect or nil
  # if url set up, goes to url with note "not allowed because readonly"
  # else @returns true / false
  def readonly?(url = nil)
    if current_user_can_access?(:readonly)

      message = I18n.t(:auth_readonly)
      if request.xhr?
        response.status = 403
        render json: { error: message }
      else
        redirect_to url, notice: message unless url.nil?
      end
      true
    else
      false
    end
  end

我的问题是,readonly? 是否也可以接受(并且通常)也重定向到某个地方。

我习惯于实现问号方法,只返回可转换为布尔值的值,不对模型、数据库进行更改...

【问题讨论】:

    标签: ruby-on-rails ruby methods


    【解决方案1】:

    具有副作用的谓词方法违反了最小惊讶原则 IMO。它可能有“内部”副作用,例如记住一些内部值,但它应该是“外部”纯/引用透明的。

    如果您订阅Bertrand Meyer's Command-Query Separation Principle,则谓词方法是查询(不应有副作用)。 redirect_to 是一个命令(只有副作用,没有返回值)。两者不应混用。

    【讨论】:

    • 特别是“应该”的意思是“请以这种方式行事”而不是“你不能”。
    【解决方案2】:

    ?方法(又名“谓词”方法)是“查询”方法的一个示例,它应该只返回一个值,没有副作用。

    before_action 风格的方法是所谓的“命令”方法,它有副作用,除了偶尔的状态/错误标志之外不会返回有意义的结果。

    所以这里的答案是否定的,不要从 ?方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2020-12-08
      相关资源
      最近更新 更多