ruby私有方法调用不同类的公共方法

时间:2017-02-21 05:32:18

标签: ruby oop

允许在ruby class A中的私有方法在class B中调用公共方法,

是一种好的设计

我想更好的方法是在class A中调用另一个公共方法,它会调用class B中的公共方法。

考虑用户需要对资源采取行动(私有方法)但不能在不检查资源的某些约束(通过公共方法)的情况下这样做的情况。

3 个答案:

答案 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数组

这意味着UserHouse有很多了解。如果House更改了上述两项的实施,则User也需要更改。

另一种设计是反转功能的所有者:

def House
  def entry_for(user)
    if safe?
      users << user
    end
  end
end

现在,这两个类之间的耦合已经减少了。作为safe?约束的所有者,House控制是否允许用户访问,而User仍然对House的实施一无所知。

根据相关域的不同,安全声明可能属于HouseUser以外的类别,例如。 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中做更多的代码。