允许在ruby class A
中的私有方法在class B
中调用公共方法,
我想更好的方法是在class A
中调用另一个公共方法,它会调用class B
中的公共方法。
考虑用户需要对资源采取行动(私有方法)但不能在不检查资源的某些约束(通过公共方法)的情况下这样做的情况。
答案 0 :(得分:1)
我不知道你想要什么样的功能,但是在ruby中允许A类中的私有方法调用类B中的公共方法就像代码一样没有问题:
class A private def test_a B.new.test_b end end class B def test_b puts 'test_b' end end A.new.send(:test_a) #=>test_b
答案 1 :(得分:1)
在A类中允许私有方法被认为是一个好的设计 ruby在B类中调用公共方法
您是否从公共或私有方法调用外部类并不重要,因为私有方法是实现细节。重要的是,给定的课程是否有必要了解外部课程。方法。
考虑用户需要对资源采取行动(私有方法)但不能检查资源的某些约束(通过公共方法)的情况。
考虑到你的评论:
如果用户想要进入房子,他需要检查房子是否安全
一种可能的实现方式是:
class User
def enter(house)
if house.safe?
house.users << user
end
end
end
这需要User
课程了解House
课程的一些内容:
#safe?
users
数组这意味着User
对House
有很多了解。如果House
更改了上述两项的实施,则User
也需要更改。
另一种设计是反转功能的所有者:
def House
def entry_for(user)
if safe?
users << user
end
end
end
现在,这两个类之间的耦合已经减少了。作为safe?
约束的所有者,House
控制是否允许用户访问,而User
仍然对House
的实施一无所知。
根据相关域的不同,安全声明可能属于House
或User
以外的类别,例如。 Guard
。在这种情况下,您可能会得到类似的结果:
class Guard
def facilitate_entry(user, house)
house.enter_by(user) if safe?(house)
end
private
def safe?(house)
end
end
答案 2 :(得分:0)
我认为这不是一个好方法,可以创建一个公共方法来访问其他类的公共方法。在课堂上你会被太多的公共方法所淹没。
由于Ruby是纯面向对象的,所以一切都是对象。如果你考虑到这种方法,你将会得到不必要的方法。即使你在私人方法中做了简单的事情。假设您正尝试使用each
方法迭代数组。您是否会考虑创建一个公共方法来首先访问类Array的公共方法each
?答案完全没有。
ruby也是一种富有表现力和富有成效的语言。你可以在ruby中做更多的代码。