Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟踪在Ruby中创建的对象_Ruby_Oop - Fatal编程技术网

跟踪在Ruby中创建的对象

跟踪在Ruby中创建的对象,ruby,oop,Ruby,Oop,我有一门课叫Orders。我想保留一个包含所有“订单”实例的数组,这样我就可以。每个映射/减少/或以其他方式查询它们 稍后,我将封送“dump”和“load”对象的“Orders”数组 我的计划是在初始化时将创建的每个新对象添加到@@all\u orders数组堆栈中。然后我可以在@all_orders数组上执行.each方法,循环遍历所有“orders”对象 我是不是用正确的OOP方法来处理这个问题?(获取想法的代码片段) 类命令 @@所有订单=Array.new 属性存取器:订单号:客户 d

我有一门课叫Orders。我想保留一个包含所有“订单”实例的数组,这样我就可以。每个映射/减少/或以其他方式查询它们

稍后,我将封送“dump”和“load”对象的“Orders”数组

我的计划是在初始化时将创建的每个新对象添加到@@all\u orders数组堆栈中。然后我可以在@all_orders数组上执行.each方法,循环遍历所有“orders”对象

我是不是用正确的OOP方法来处理这个问题?(获取想法的代码片段)

类命令
@@所有订单=Array.new
属性存取器:订单号:客户
def初始化(订单号,客户)
@id,@customer=订单号,客户
@order_lines=Array.new

@@所有的订单正确的面向对象方法是使用一个容器将订单放入其中。这可以是普通的旧数组或特殊的容器类

这里的大问题是,您没有存储“所有订单”数据的适当上下文。所有订单都与什么有关?整个应用程序?如果是这样的话,您需要一个订单簿或数据库的概念来存储它们

例如:

class OrderBook < Array
end

order_book = OrderBook.new
order_book << Order.new(...)
class OrderBook我会考虑使用一个列表对象传递给您的订单实例。OOP中的最佳实践是解耦代码,并尝试只给每个对象一个责任(单一责任原则)。这有助于保持代码的可维护性和易更改性。按照您现在的处理方式,
Order
类同时处理与订单相关的内容和列表的存储。在我下面的示例中,当订单被实例化时,可以将列表对象传递给
Order
对象,订单需要知道的是列表对象应该响应
#add
方法。这样,如果列表的实现必须更改,例如使列表对象使用Redis存储,那么您不需要同时更改
Order
类和
OrderList
类。在
#add
方法中,您只需要更新
OrderList
类来处理Redis。此外,在处理列表责任的
Order
类中,您不再具有内部依赖关系,因此该订单只是在做它应该做的事情

class OrderList
  attr_reader :items

  def initialize
    @items = []
  end

  def add(order)
    @items << order
  end
end

class Order
  def initialize(opts)
    order_list = opts[:order_list]
    order_list.add self
  end
end

order_list = OrderList.new
order1 = Order.new order_list: order_list
order2 = Order.new order_list: order_list

puts order_list.list.inspect
类订单列表
属性读取器:项目
def初始化
@项目=[]
结束
def添加(订单)

@请注意,几乎总是最好使用简短的
[]
符号,而不是
数组。新的
class OrderList
  attr_reader :items

  def initialize
    @items = []
  end

  def add(order)
    @items << order
  end
end

class Order
  def initialize(opts)
    order_list = opts[:order_list]
    order_list.add self
  end
end

order_list = OrderList.new
order1 = Order.new order_list: order_list
order2 = Order.new order_list: order_list

puts order_list.list.inspect