트랙
/
Ruby
Ruby
/
연습 문제
/
부티크 재고 관리 개선
부티크 재고 관리 개선

부티크 재고 관리 개선

학습 연습 문제

소개

OpenStruct를 사용하면 Hash로 객체를 쉽게 만들 수 있어요. Hash 키로 접근해야 하는 대신, OpenStruct에서는 메서드로 값에 접근하고 설정할 수 있어요.

attributes = { name: "Jeremy Walker", age: 21, location: "Nomadic" }
person = OpenStruct.new(attributes)

person.name
#=> Jeremy Walker

person.location
#=> Nomadic

# Update the age
person.age = 35

# It sets correctly
person.age
#=> 35

이 방식의 또 한 가지 장점은 블록 문법을 사용할 때 단축 표현을 활용할 수 있다는 점이에요. 블록이 메서드 하나만 호출하는 경우에는, 블록을 &: 뒤에 메서드 이름을 붙인 형태로 바꿀 수 있어요. 예를 들어, 다음 두 줄은 같은 의미예요:

people.sum { |person| person.age }
people.sum(&:age)

표준 라이브러리

지금까지 연습 문제에서 본 모든 클래스는 Ruby의 코어 라이브러리에 속해 있었어요.

OpenStruct는 Ruby의 표준 라이브러리(흔히 "stdlib"라고 줄여 불러요)에 속해요. 날짜, JSON, 네트워킹 같은 것을 다루기 위한 클래스 모음이죠. 코드를 더 다루기 쉽게 만들어 주는 유용한 기능도 제공해요.

코어 라이브러리에 없는 클래스, 예를 들어 다른 파일에 있는 직접 작성한 코드나 stdlib의 클래스, 외부 의존성을 사용할 때는 require 메서드로 가져와야 사용할 수 있어요. 예를 들어:

require 'ostruct'

person = OpenStruct.new(name: "Jeremy Walker")
# ...

지침

이전에 만든 재고 관리 시스템 작업을 계속하고 있어요. OpenStruct와 블록 단축 문법을 알게 된 뒤로, 코드를 조금 리팩터링하기로 마음먹었어요. 항목을 해시로 저장하는 대신, 새로 익힌 기술을 활용해 볼 거예요.

1. 항목을 조회할 수 있게 만들기

재고에 있는 항목 목록은 계속 조회하고 싶은데, 이번에는 메서드를 호출할 수 있는 객체여야 해요.

inventory = BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
])

inventory.items.first.name
# => "Maxi Brown Dress"

inventory.items.first.price
# => 65

inventory.items.size
# => 4

2. item_names 리팩터링

item_names를 해시 대신 새로 배운 블록 단축 문법을 사용하도록 리팩터링해요. 참고로, 이 메서드는 다음을 반환해야 해요.

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).item_names

# => ["Bamboo Socks Cats", "Black Short Skirt", "Maxi Brown Dress", "Red Short Skirt"]

3. total_stock 리팩터링

total_stock을 해시를 참조하는 대신 OpenStruct의 메서드를 사용하도록 리팩터링해요. 참고로, 이 메서드는 다음을 반환해야 해요.

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).total_stock

# => 36
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Ruby Exercism

부티크 재고 관리 개선 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.