ruby - 为什么在初始化时不使用 setter 方法?

标签 ruby oop

最近我一直在阅读“Ruby 中的实用面向对象设计”,我注意到最佳实践之一是使用访问器方法而不是直接获取 @instance_variable。例如:

class Foo
  attr_accessor :bar

  def initialize(my_argument)
    @bar = my_argument
  end

  # bad
  # def lorem_ipsum
  #     @bar * 999
  # end

  # good
  def lorem_ipsum
    bar * 999
  end

end

让事情保持干燥是有意义的,并且,以防万一我需要在实际获取它的值之前以某种方式处理 @bar。但是,我注意到 initialize 方法直接设置了 @bar 实例变量的值:

class Foo
  attr_accessor :bar

  def initialize(my_argument)
    @bar = my_argument #<-- why isn't self.bar = my_argument used here?
  end

这是有原因的吗?是不是应该使用setter方法,而不是直接使用=操作符来设置实例变量的值?

最佳答案

你是对的,这样做会更有意义

class Foo
  attr_accessor :bar

  def initialize(my_argument)
    self.bar = my_argument
  end
end

关于您是否应该尊重对象本身的封装,争论不一,但如果您相信这一点,那么,是的,您应该这样做。

关于ruby - 为什么在初始化时不使用 setter 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547397/

相关文章:

ruby-on-rails - 如何对 mongodb/mongoid 脚本进行基准测试,以比较两种不同的查询技术

ruby-on-rails - 重构嵌套路由,如何解决这个 redirect_to?

ruby-on-rails - 为什么要在数据库主机上保留应用程序的副本?

ruby - Rails 3 查询 : Find all Posts with the same Topic

java - 如何将 lambdas 用于具有多种方法的接口(interface)?

java - 对象属性的更改在主类中不是永久的?

Ruby 最大整数

java - 抽象类返回

c++ - 通过引用传递指针是执行此操作的正确方法吗?

java - 基于参数真实类型的重载方法选择