gpt4 book ai didi

ruby - 直接在 ruby​​ 中使用实例变量是不好的形式吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:38:34 25 4
gpt4 key购买 nike

您是否应该始终在 ruby​​ 中创建访问器(用于读取和/或写入)?如果你有一个不打算在外面重用的类,我不能直接使用实例变量吗?

我遇到的一个问题是在测试中 stub @instance_vars 是有问题的。

最佳答案

实例变量在测试时无关紧要。您应该测试您的方法,以验证它们是否产生了正确的结果。

当您为一个属性定义一个读取器方法时,您就将该属性暴露给了世界。属性的值是来自实例变量、数据库、文件、运行时计算还是其他什么都无关紧要。人们只需调用该方法即可获得该值。

同样,当您为属性定义编写器方法时,您是在让每个人都知道他们可以根据需要设置它。值(value)流向何处并不重要。

只有您的方法定义了您的公共(public) API。其他一切都是实现细节。

在你的类定义中,直接访问实例变量肯定没有坏处:

@variable = :value

如果您只需要简单的赋值,就没有理由调用方法。当然,有时您需要更复杂的功能。延迟初始化,例如:

def variable
@variable ||= :value
end

# ...

variable.to_s

如果您的方法仅供内部使用,则不应将其包含在您的公共(public) API 中。将其标记为私有(private):

private :variable

但老实说,Ruby 中并没有真正锁定任何东西。即使没有 setter 方法,人们也可以很容易地篡改你的对象,如果他们真的想要的话:

class << (object = Object.new)
private
def variable; @variable end
end

object.variable
# NoMethodError: private method `variable' called

# send bypasses access control
object.send :variable
# => :value

object.instance_variables
# => [:@variable]
object.instance_variable_get :@variable
# => :value

object.instance_variables.each do |variable|
object.instance_variable_set variable, nil
end
object.instance_variable_get :@variable
# => nil

关于ruby - 直接在 ruby​​ 中使用实例变量是不好的形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com