两个相互依赖的Ruby类

两个相互依赖的Ruby类,ruby,dependencies,circular-dependency,single-responsibility-principle,Ruby,Dependencies,Circular Dependency,Single Responsibility Principle,我目前在管理我的依赖关系时遇到了一点问题,同时试图维护单一的责任和OOD 我有一个主类调用菜单: class Menu def initialize(dishes:, prices:, menuFormatter:) @dishes = dishes @prices = prices @menuFormatter = menuFormatter end def avaliable_dishes dishes.dishes_list end

我目前在管理我的依赖关系时遇到了一点问题,同时试图维护单一的责任和OOD

我有一个主类调用菜单:

class Menu

  def initialize(dishes:, prices:, menuFormatter:)
    @dishes = dishes
    @prices = prices
    @menuFormatter = menuFormatter
  end

  def avaliable_dishes
    dishes.dishes_list
  end

  def dish_prices
    prices.prices_list
  end

  def formatted_menu
    menuFormatter.formatted_menu
  end

  private

  attr_reader :dishes, :prices, :menuFormatter
end
现在,我看到的是,Menu类将菜单的所有不同部分汇集在一起,并将其提供给假设的客户。菜品在他们自己的类(菜品)中处理、更新、移除,价格以同样的方式(价格)进行,然后有一个单独的类菜单制定者,负责将菜单的内容整理成一个排列整齐的菜单。第17到19行是调用MenuFormatter类的地方,但我的问题出现在该类中:

class MenuFormatter

  def avaliable_dishes
    menu.avaliable_dishes
  end

  def dish_prices
    menu.dish_prices
  end

  def format_menu
    #Loop through dishes and prices and arrange them.
  end
end
我现在面临的错误是MenuFormatter不知道菜单是什么,因为我没有在类中定义它。我不确定如何使我的菜单变量指向菜单实例,以便它可以访问菜肴和价格


我希望不要让MenuFormatter访问菜品或价格,因为我觉得这可能会导致代码中不必要的进一步耦合。

菜单
本身的实例作为参数传递给
格式菜单
方法如何:

def formatted_menu
  menuFormatter.formatted_menu(self)
end
这里,在
菜单
类的实例方法的定义中,
self
指调用
格式化菜单
方法的菜单实例

然后在
菜单格式中:

def formatted_menu(menu)
  # menu.dishes... 
  # menu.prices....
end

一些反馈…1)我建议MenuFormatter是嵌套在菜单中的类。2) 我不认为菜单和菜单格式都依赖于菜肴和价格有什么不对。他们都有合理的需求。3) MenuFormatter可能没有状态,可以作为模块而不是类实现,从而传递无状态。4) 我认为你有一个输入错误,你说“我没有遇到的错误”。谢谢@KeithBennett,我将研究嵌套类和模块。非常有帮助,谢谢你发现了错误。对于依赖项,在本例中我同意您的看法,它们目前都有合法的需求。代码的实际用途是作为一种实践练习,尽可能地生成最可变的代码,考虑到这一点,我倾向于保持类的解耦并尽可能多地注入。