5장까지 있는 연습문제 중에서 하나의 문제를 풀어보자
💡 연습 문제 14 (답 예시는 422쪽에 있다.)
부엌용 믹서의 인터페이스를 설계하라. 이 믹서는 나중에 웹으로 쓸 수 있도 록 사물 인터넷IoT으로 연결될 예정이지만, 지금으로서는 믹서를 제어할 수 있는 인터페이스만 있으면 된다. 속도를 열 단계로 설정할 수 있는데 0은 중지를 의미한다.
비어 있는 상태에서는 작동할 수 없고, 한 번에 한 칸씩만 속도를 바꿀 수 있다.
즉 0에서 1, 1에서 2는 되지만, 0에서 2는 안 된다.
다음과 같은 메서드가 있을 때, 적절한 선행, 후행 조건과 불변식을 추가하라.
int getSpeed()
void setSpeed(int x)
boolean isFull()
void fill()
void empty()
getSpeed()
지금 속도가 얼마인지 나타내준다.setSpeed(int x)
속도를 정수 x만큼 더한다.boolean isFull()
믹서기가 차있나void fill()
믹서기를 채운다.void empty()
믹서기를 비운다.do while(isFull()){
let speed = getSpeed();
if(speed >0 && speed <=10){
....
}
}
if(0=<x && x<10){
let step = Math.abs(speed - x);
step = 1 ? step : console.log("한번에 한단계씩만 가능");
speed += step;
}
// empty()는
isFull() ? empty() : console.log("이미 비워져있습니다.")
// fill()는
!isFull() ? fill() : console.log("이미 채워져있습니다.")
* @invariant getSpeed() > 0 // 빈 상태로는 돌리지 못한다. // 범위 검사
* implies isFull()
*
* @invariant getSpeed() >= 0 && getSpeed() < 10 // 범위 검사
다음은 선행 조건과 후행 조건이다.
* @pre Math.abs(getSpeed() - x) <= 1 // 한 단계씩만 바꿀 수 있다.
* @pre x >= 0 && x < 10 // 범위 검사
* @post getSpeed() == x // 요청한 속도가 되었다.
public void setSpeed(final int x)
* @pre !isFull() // 차있는데 또 채우지 않는다.
* @post isFull() // 수행되었는지 확인
void fill()
* @pre isFull() // 비어있는데 또 비우지 않는다.
* @post !isFull() // 수행되었는지 확인
void empty()
진짜 간단해보여도 생각보다 불변이 뭔지 선행 후행은 어떤걸 해야할지 오래걸렸다.
그리고 예외처리를 하는게 생각보다 어렵다. 간단한거라 그냥 틀린것은 console.log를 이용해 말을 내뱉게 했지만 만약 이것이 진짜 시스템이라 친다면 나는 딱히 null을 안넣고는 뭘 넣어야할지 모르겠다.