2014-12-04 2 views
1

Orders라는 클래스가 있습니다. 모든 "Orders"인스턴스의 배열을 유지하여 각 맵/축소/또는 쿼리를 수행 할 수 있습니다.Ruby에서 생성 된 객체 추적하기

나중에 "덤프"및 "로드"개체의 "주문"배열을 마샬링하고 싶습니다.

내 계획은 초기화시 @@ all_orders 배열 스택에 생성 된 각각의 새 개체를 추가하는 것입니다. 그런 다음 모든 "orders"객체를 반복하면서 @@ all_orders 배열에서 각각의 메서드를 수행 할 수 있습니다.

나는 이것을 올바른 OOP 방식으로 접근하고 있습니까?

class Orders 

    @@all_orders = Array.new 
    attr_accessor :order_no, :customer 

    def initialize(order_no, customer) 
    @id, @customer = order_no, customer 
    @order_lines = Array.new 
    @@all_orders << self 
    end 
+0

참고로 'Array.new' 대신에 짧은 [']'표기법을 사용하는 것이 좋습니다. – tadman

답변

1

이 작업을 수행 할 수있는 적절한 객체 지향 방법은 당신이에 주문을 넣고있는 용기를 가지고하는 것입니다 ... (코드 조각은 아이디어를 얻을 수 있습니다). 이것은 오래된 배열이거나 특별한 컨테이너 클래스 일 수 있습니다.

여기서 큰 문제는 "모든 주문"데이터를 저장하기위한 적절한 컨텍스트가 없다는 것입니다. 모든 주문은 무엇과 관련이 있습니까? 전체 응용 프로그램? 그렇다면 주문서 나 데이터베이스를 저장하기위한 개념이 필요합니다. 예를 들어

: 그 정확한, 단수 이름의 나는이 OrderOrders 이름을 변경 한

class OrderBook < Array 
end 

order_book = OrderBook.new 
order_book << Order.new(...) 

참고.

자동 - 마술적으로 컨테이너에 인스턴스를 추가하는 것은 거의 항상 재앙의 방법입니다. 그런 종류의 것은 모델 - 컨트롤러과 같은 디자인 패턴을 사용하여 처리해야합니다. 글로벌 주문 풀에 포함시키려는 거대한 가정입니다.

0

dependency injection을 사용하여 목록 개체를 주문 인스턴스에 전달하는 것이 좋습니다. OOP의 모범 사례는 코드를 분리하고 각 객체에 단 하나의 책임 (단일 책임 원칙)을 부여하는 것입니다. 이렇게하면 코드를 유지 관리하고 쉽게 변경할 수 있습니다. 지금 접근하는 방식 인 Order 클래스는 주문 관련 물건과 목록의 저장을 모두 수행합니다. 아래 예제에서,리스트 오브젝트는 Order 오브젝트로 전달 될 수 있습니다. 순서가 인스턴스화 될 때 오브젝트가 #add 메소드에 응답해야한다는 점을 알아야합니다. 이런 식으로리스트 객체의 구현이 변경되어야한다면, 예를 들어리스트 객체가 Redis 저장소를 사용하도록 만들면 Order 클래스와 OrderList 클래스를 모두 변경할 필요가 없습니다. #add 메서드에서 Redis를 처리하기 위해 OrderList 클래스 만 업데이트하면됩니다. 또한 목록 책임을 처리하기 위해 더 이상 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