---
# System prepended metadata

title: '은행창구매니저 [STEP1] kaki, songjun'

---

# 은행창구매니저 [STEP1] kaki, songjun
@AppleCEO
안녕하세요 도미닉! 은행창구 매니저 프로젝트 기간 동안 리뷰 잘 부탁드립니다🙂🙂🙂

## 구현 내용
### Linked List Queue 구현
- Linked List Queue를 구현해주기 위해 Node 클래스를 구현해주었습니다.
- Heap 영역에서 인스턴스가 유지, 관리되어야 하는 Node와 달리, Queue는 필요성을 느끼지 못하여 struct로 구현해주었습니다.
- Queue의 clear 메서드에서 ARC를 고려하여 head와 tail 모두 nil을 할당해주었습니다.

## 조언이 필요한 점
### 테스트 코드 작성 시 given과 when 구분
>아래와 같이 테스트 코드 작성 시 `given`과 `when`에 무엇을 적어야할지 고민했습니다. `given`은 어떤 상황이 주어지고, `when`은 어떤 코드를 실행한다고 배웠습니다. 그렇다면 `enqueue`메서드는 `given`인지, `when`인지 궁금합니다!

```swift
// 1번
func test_dequeue됐을경우_처음_enqueue된_데이터가_반환된다() {
        // given
        let expectation = "hello"
        // when
        sut.enqueue("hello")
        sut.enqueue("kaki")
        sut.enqueue("songjun")
        let result = sut.dequeue()!
        // then
        XCTAssertEqual(result, expectation)
    }

// 2번
func test_dequeue됐을경우_처음_enqueue된_데이터가_반환된다() {
        // given
        let expectation = "hello"
        sut.enqueue("hello")
        sut.enqueue("kaki")
        sut.enqueue("songjun")
        // when
        let result = sut.dequeue()!
        // then
        XCTAssertEqual(result, expectation)
    }

```

# 은행창구매니저 [STEP2] kaki, songjun
@AppleCEO
안녕하세요 도미닉! Step2 PR입니다! 이번 리뷰도 잘부탁드립니다!

## 구현 내용
### Step2 요구사항 구현
- Step2 요구사항에 맞게 구현을 완료하였습니다.
- 메뉴에 없는 숫자를 눌렀을 시 에러를 처리해주는 과정을 추가해줄지 고민하였는데, 요구사항에 없는 내용이라 따로 구현하지 않았습니다.
- 고객이 총 몇명인지 확인할 수 있게 Queue 내부에 `size` 프로퍼티를 추가해주었습니다.

## 조언이 필요한 점
### BankManager 내부에서의 함수 분리 
- BankManager 구조체 내부에 `setupWaitingQueueAndClientNumber`, `startBusiness`메서드가 있습니다.
- 이 메서드 내부에는 여러기능들이 존재합니다. 크게보면 업무시작과 함께 기능하는 작동들이라 한 메서드에 정의해주었는데, 이 기능들을 세분화할 경우 main에서 코드를 진행시킬 때 여러 함수들을 실행시켜야 해서 고민이 됩니다.
- 기준을 크게 잡아 한 번에 실행시킨 지금의 방식이 좋을지, 아니면 조금 더 세분화하여 여러개의 함수를 실행시키는 방식이 좋을지 조언 주시면 감사하겠습니다.
```swift
mutating func setupWaitingQueueAndClientNumber() {
    for number in 1...Int.random(in: 10...30) {
        waitingQueue.enqueue("\(number)번 고객")
    }
    
    clientNumber = waitingQueue.size
}

mutating func startBusiness() {
        while !waitingQueue.isEmpty {
            guard let client = waitingQueue.dequeue() else { return }
            print("\(client) 업무 시작")
            Thread.sleep(forTimeInterval: 0.7)
            print("\(client) 업무 완료")
        }
        
        let businessHours = Double(clientNumber) * 0.7
        print("업무가 마감되었습니다. 오늘 업무를 처리한 고객은 총 \(clientNumber)명이며, 총 엄무시간은 \(String(format: "%.2f", businessHours))초입니다.")
    }
```
