개발자 99% 커뮤니티에서 수다 떨어요!
부엌용 믹서의 인터페이스를 설계하라. 이 믹서는 나중에 웹으로 쓸 수 있도록 사물 인터넷IoT으로 연결될 예정이지만, 지금으로서는 믹서를 제어할 수 있는 인터페이스만 있으면 된다. 속도를 열 단계로 설정할 수 있는데 0은 중지를 의미한다. 비어 있는 상태에서는 작동할 수 없고, 한 번에 한 칸씩만 속도를 바꿀 수 있다. 즉 0에서 1, 1에서 2는 되지만, 0에서 2는 안 된다.
다음과 같은 메서드가 있을 때, 적절한 선행, 후행 조건과 불변식을 추가하라.
int getSpeed()
void setSpeed(int x)
boolean isFull()
void fill()
void empty()
선행 조건 - 루틴이 호출되기 위해 참 이어야 하는 것.
제대로된 데이터를 전달하는 것은 호출하는 쪽의 책임
후행 조건 - 루틴이 자기가 할 것이라고 보장하는 것.
클래스 불변식 - 호출자의 입장에서 이 조건이 언제나 참인 것을 클래스가 보장한다.
조건 1) 속도는 10단계, 0은 정지를 의미한다.
조건 2) 비어 있는 상태에서는 작동할 수 없다.
조건 3) 한 번에 한 칸씩만 속도 조절이 가능하다.
* 전제조건 >> 전체적으로 꼭 성립되어야 하는 조건
불변식1) getSpeed() >= 0 && getSpeed() < 10
# 속도는 0부터 10까지 설정한다
불변식2) !isFull() && getSpeed() == 0
# 믹서기가 채워져 있지 않으면 항상 중지되어 있어야 한다
* 속도조절 >> 변수 x는 입력한 속도
선행문1) x >=0 && x < 10
# 입력한 속도는 반드시 범위 내 값 이어야 한다.
선행문2) getSpeed() > x ? (getSpeed - x <= 1) : (x - getSpeed <= 1)
# 입력한 속도는 기존 속도와 1이내 이어야한다.
후행문) getSpeed() = x
# 실행 후 getSpeed()를 호출시 x가 나와야 한다.
* 내용물 채우기 >> 채워져 있지 않아야 채울 수 있다.
선행문) !isFull()
# 채우려면 믹서기 내부가 비어있어야한다.
후행문) isFull()
# 채우고 나면 조건 성립
* 내용물 비우기 >> 채워져 있어야 비울 수 있다.
선행문) isFull()
# 비우려면 믹서기 내부가 채워져있어야한다.
후행문) !isFull()
# 비우고 나면 조건 성립
해답 )
인터페이스를 자바 코드로 적어 보겠다. 계약 내용은 주석에 적는다.
먼저 이 클래스의 불변식이다.
/**
* @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()