Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
TIL #7 Mission: 연습문제 풀이!
#pragmatic
2년 전
670
4

1. 연습문제 29: 162쪽 단지 뷰일 뿐이야 에서

비행기라는 개념을 포함한 비행 예약 시스템이 있다고 생각해보자.

public interface Flight { public boolean addPassenger(Passenger p); public void addToWaitList(Passenger p); public int getFlightCapacity(); public int getNumPassengers(); }

만약 승객을 대기 목록에 올린다면, 빈 자리가 날 경우 그 승객은 비행기에 자동으로 들어가게 된다. 오버부킹되어거나 자리가 꽉 찬 비행기를 찾아서, 추가 비행편의 일정을 언제 잡아야 할지 제안해 주는 엄청난 규모의 리포트 작업이 있다. 문제없이 돌아가긴 하지만, 실행하는 데 몇 시간씩이나 걸린다. 우리는 대기 목록의 승객을 처리하는 데 조금 더 융통성이 있으면 좋겠다. 그리고 대규모 리포트 작업도 어떻게든 해야 한다. 너무 시간이 많이 걸리기 때문이다. 이 항목에 나온 아이디어들을 가지고 인터페이스를 재설계 해보라.

2. 문제 풀기

public interface Flight { public void addWaitList(Passenger p); public void countAvailableSeatList(); public void addAvailableSeat(Passenger p); } public interface BigReport extends Flight{ public boolean overBooking(Flight f); }

Flight에 승객이 addWaitList로 등록되고 실시간으로 countAvailableSeatList로 예약 가능한 자리를 찾아 준다. addAvailableSeat에 승객을 추가해 줌으로써 자리 숫자를 실시간으로 채워준다.

내가 생각했을 때 실시간으로 자리를 채워주고 실시간으로 빈자리를 알기만 한다면 오버부킹에 대해 계산하기가 어렵지 않을 것이다.

BigReport 인터페이스에 overBooking 여부를 알려주는 인터페이스를 구현하여 마무리 하였다.

3. 해답 29 : 우리는 Flight를 가지고 여기에다 리스너 목록을 두 개 유지하기 위한 몇 가지 추가 메서드를 넣을 것이다. 하나는 대기 목록에 관련된 통보를 위한 것이고, 다른 하나는 자리가 꽉 찬 것을 통보하기 위한 것이다.

public interface Passenger { public void waitListAvailable(); } public interface Flight { public void addWaitListListener(Passenger p); public void removeWaitListListener(Passenger p); public void addFullListener(FullListener b); public void removeFullListener(FullListener b); } public interface BigReport extends FullListener { public void FlightFullAlert(Flight f); } 만약 Passenger를 하나 추가하려고 하다가 비행기의 자기가 꽉 차서 실패했다면, 선택적으로 Passenger를 대기 목록에 추가할 수 있다. 자리가 날 경우, waitListAvalible이 호출될 것이다. 그러면 이 메서드는 Passenger를 자동으로 추가하거나, 서비스 부분의 직원이 고객에게 전화해서 아직 자리가 필요하냐고 물어보게 하거나, 그 외에 어떤 것이든 할 수 있다. 우리에게는 이제 고객별로 다른 일을 수행하게끔 할 수 있는 유연성이 생겼다. 다음으로, BigReport가 꽉 차 있는 비행기를 찾아 몇천 개의 레코드를 샅샅이 훑어 보지 않도록 만들고 싶다. BigReport를 Flight들의 리스너로 등록하게 함으로써, 각 Flight는 자신의 자리가 꽉 찼을 경우(또는 우리가 원한다면 자리가 거의 찼을 때) 통보할 수 있다. 이제 사용자는 예전처럼 몇 시간씩 기다리지 않고도 BigReport로부터 즉각적으로 최신 실시간 보고를 받을 수 있다.

4 comments