Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Step 1 : 타입 및 Console App 구현 (리나) #4

Merged
merged 43 commits into from
Jan 9, 2021

Conversation

lina0322
Copy link

@lina0322 lina0322 commented Jan 5, 2021

안녕하세요🙇🏻‍♀️

[구현]

  • BankManager -> 은행
    은행 업무를 시작하고 끝내는 역할
    은행원에게 고객(업무)을 나눠줌
  • Teller -> 은행원
    주어진 업무를, 시간에 맞게 처리
  • Client -> 고객

[고민했던 부분]💦

1. 은행과 은행원의 역할 분담

어디부터 어디까지 은행이 담당할지 고민했습니다.
업무처리 자체는 은행원이 하고,
업무를 나눠주는 것은 은행이 할 수 있도록 시도해보았습니다.
차후에 0.7초 걸리는 업무외에도 추가된다면
고객은 업무의 이름을, 은행원은 해당 업무 이름에 따른 시간을 확인할 수 있는 방법으로 구현할까 생각만 했습니다.

2. 0.7초 소모

실제로 콘솔에서 0.7초가 지연되도록 구현하고 싶었습니다.
timer와 dispatchQueue과 usleep에서 고민했는데 우선은 usleep을 사용했습니다.
3번에서 사용한 dispatchQueue가 올바른 방법이라면, 이 지연시간도 dispatchQueue로 구현하고 싶습니다.. ~(아직은 너무 감이 안잡혀요)~🌪

3. 은행원이 여러명일때?

뭔가... 동기 비동기를 해야할 것 같다는 생각이 막연히 드는데, 정확히 어떻게 구현을 해야할지 모르겠습니다.
일단 시도는 해봤는데, 이렇게 하는게 맞는지 모르겠습니다.
(이를 확인하기 위해서 현재 업무처리 문구가 약간 다릅니다.
3번 고객 업무 시작[기획서] -> 1번 창구 : 3번 고객 업무 시작[실제 코드])
우선 발생한 문제는 은행원들이 업무를 마감하기 전에 메뉴가 다시 나온다는 것입니다. 이것을 우선 usleep을 이용하여 시간지연을 주었더니 해결은 되었는데, 마찬가지로 맞는 방식인지 모르겠습니다.
동기 비동기와 관련해서 어떤걸 보면 좋을까요🥺

4. 실행

처음에는 main 함수에서 실행을 할 때,
switch로해서 input == "1"이면 은행 업무를 시작하고, 다시 main함수를 호출할까생각했습니다.
그런데 이렇게하면 스택(?)이 너무 많이 쌓일 것 같아서 while을 사용하게 되었는데, 이 또한 위험할 것 같아서 조언을 구합니다..🤦🏻‍♀️

감사합니다😆

@O-O-wl O-O-wl self-requested a review January 5, 2021 13:54
Copy link
Member

@O-O-wl O-O-wl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 리나!
코드가 전체적으로 플로우를 따라가기 좋게 작성되어있어서 수월하게 읽을 수 있었습니다 👍
버그가 발견되어 핫픽스 부탁드리겠습니다 🚑 (넝담( ͡° ͜ʖ ͡°)

BankManagerConsoleApp/BankManagerConsoleApp/main.swift Outdated Show resolved Hide resolved
BankManagerConsoleApp/BankManagerConsoleApp/main.swift Outdated Show resolved Hide resolved
BankManager.swift Outdated Show resolved Hide resolved
BankManager.swift Outdated Show resolved Hide resolved
BankManager.swift Outdated Show resolved Hide resolved
Comment on lines 37 to 47
private func initTellerNumber(_ number: Int) {
for windowNumber in 1...number {
tellers.append(Teller(windowNumber: windowNumber))
}
}

private func initClientNumber(_ number: Int) {
for waitingNumber in 1...number {
clients.append(Client(waitingNumber: waitingNumber))
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Client와 Teller를 내부에서 초기화한다면 테스트에서는 어려움을 겪을 수 있지 않을까요?

BankManager.swift Outdated Show resolved Hide resolved
Comment on lines 18 to 33
static let closeMessage = "업무가 마감되었습니다. 오늘 업무를 처리한 고객은 총 %d명이며, 총 업무시간은 %.2f초입니다."
static let tellerStartMassage = "%d번 창구 : %d번 고객 업무 시작"
static let tellerFinishMessage = "%d번 창구 : %d번 고객 업무 완료"

static let milliseconds: Double = 1000000
}

enum BusinessType {
case normal

var neededTime: Double {
switch self {
case .normal:
return 0.7
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상수와 Enum Case로 정의한 기준에 대해 알 수 있을까요?

BankManagerConsoleApp/BankManagerConsoleApp/Enum.swift Outdated Show resolved Hide resolved
BankManagerConsoleApp/BankManagerConsoleApp/Teller.swift Outdated Show resolved Hide resolved
GREENOVER pushed a commit that referenced this pull request Dec 27, 2021
- checkTotalTime 메서드 추가
- openBank 메서드 내 dispatchGroup 추가, dispatchGroup.wait 적용
- 은행원 업무처리 방식을 sync -> async로 변경
- Customer 타입의 task 프로퍼티 sleep 메서드 변경 (sleep(UInt32:) -> Thread.sleep(forTimeInterval:))
GREENOVER pushed a commit that referenced this pull request Dec 27, 2021
- GuideDescription 열거형 추가
- Menu 열거형 description 프로퍼티 추가
- startToReceiveInput 메서드 default 수정
kcharliek pushed a commit that referenced this pull request Dec 27, 2021
- BankManager 타입에서 Bank 타입을 bank 프로퍼티로 가지도록 함
- 프로퍼티 bank의 customerQueue를 랜덤한 수의 Customer() 로 세팅해주는 setupCustomerQueue() 메서드 구현
- Customer 타입에 turn 프로퍼티 추가
kcharliek pushed a commit that referenced this pull request Dec 27, 2021
- BankClerk 타입 내 Bank 타입의 옵셔널 프로퍼티 생성
- bank의 customerQueue에서 dequeue하여 작업하는 startWork 메서드 생성
- Bank 타입 내 위임자를 지정하는 initializer 생성
- Bank 타입 내 bankClerk의 startWork 메서드를 호출하는 open 메서드 생성
kcharliek pushed a commit that referenced this pull request Dec 27, 2021
- BankClerk 타입의 startWork() 메서드 내에 bank의 close() 메서드 호출하여 정보 전달하도록 구현
kcharliek pushed a commit that referenced this pull request Dec 27, 2021
- 메뉴를 출력하는 printMenu 메서드 생성
- 사용자 입력에 따라 실행/종료가 되도록 하는 runProgram 메서드 생성
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
- BankClerk 타입 생성
- BankClerk 타입에서 쓰이는 Workable 프로토콜, 익스텐션 생성
- Bank -> BankManager 네이밍 수정
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
- Managable, Workable 프로토콜 생성
- Clerk에게 일을 시키는 manageClerk 메서드 구현
- 대기 고객이 없을 때까지 Clerk에게 일을 시키는 dequeueWaitingLine 메서드 구현
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
- announceClose 메서드로 종료 안내 메세지 출력
- dequeueWaitingLine 메서드 내에 총 운영시간 구하는 코드 추가
- operateBankSystem 메서드 생성 후 BankManager 내에 접근 제어자 설정
- 사용자 입력이 2일 때 프로그램 종료되도록 구현
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
- 소수점 둘째 자리까지 반올림으로 표시되도록 구현
- Double 타입 Extension 구현
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
AppleCEO pushed a commit that referenced this pull request Dec 28, 2021
- 기존에 BankManager에 있던 waitingLine, makeWaitingLine을 Clients로 이동
- waitingLine큐에 Clients타입만 접근하도록 startTask, completeTask 메서드 생성
- Client 타입 내부에 번호표 개념의 clientNumber 프로퍼티 생성
- Bank namespace에 대기 중인 고객이 없다는 의미의 emptyWaitingLine 생성
- Bank namespace의 printClosingMessage 메서드 네이밍 변경
- 자료구조 Queue의 dequeue 메서드에 @discardableResult 추가
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
- WaitingLineManageable을 통해 은행의 queue에 대한 권한을 Employee에게 위임
- Bank가 Employee를 직접 알기보다 외부에서 주입되도록 이니셜라이저 추가
- Bank가 WaitingLineManageable 프로토콜 채택
- startWork() 메서드의 접근제어레벨 private으로 수정
- Starter 에서 input이 1일때 은행을 개점하는 코드 추가
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
…#4

- Employee 익스텐션 내부에 calculate() 추가
- customerCount 프로퍼티 추가
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
…ᅥᆼ하는 메서드를 연산 프로퍼티를 활용한 익스텐션으로 구현 #4, #5

- toDemical 프로퍼티 추가
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
- doJob -> startJob 으로 수정
- startWork -> assignWork 으로 수정
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
kcharliek pushed a commit that referenced this pull request Dec 28, 2021
- 리소스 낭비를 막기 위해
- DispatchGroup, asyncAfter() 메서드 활용
- Employee 타입에서 불필요해진 Extension 삭제
jae57 pushed a commit that referenced this pull request Dec 31, 2021
- 커스텀 SerialQueue.sync {} 클로저 안에 Node 로 접근하는 모든 코드를 넣음
- 기존에 Race Condition 을 방지하기 위해 생성한 semaphore 전부 삭제
kcharliek pushed a commit that referenced this pull request Dec 31, 2021
#4, #5, #9

- BankWork에 requiredTime 프로퍼티 추가
- Employee의 bank 프로퍼티 제거
- Bank의 employee 프로퍼티 제거
- 파일 순서 정리
TTOzzi pushed a commit that referenced this pull request Apr 26, 2022
* feat: Queue 생성 및 isEmpty 구현

* feat : peek 구현

* feat: enqueue 구현

* feat: dequeue 구현

* feat: clear 구현

* feat: Queue 관련 TestCode작성

* refactor: 상속 필요없는 클래스 final 선언
Wody95 pushed a commit that referenced this pull request Jul 5, 2022
feat: main파일 내 콘솔 실행되도록 구현
jryoun1 pushed a commit that referenced this pull request Jul 5, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants