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