개발자 99% 커뮤니티에서 수다 떨어요!
💡 연습문제 6. 부엌용 믹서의 인터페이스를 설계하라. 이 믹서는 나중에 웹으로 쓸 수 있도록 사물 인터넷으로 연결될 예정이지만, 지금으로서는 믹서를 제어할 수 있는 인터페이스만 있으면 된다. 속도는 열 단계로 설정할 수 있는데 0은 중지를 의미한다. 비어 있는 상태에서는 작동할 수 없고, 한 번에 한 칸씩만 속도를 바꿀 수 있따. 즉 0에서 1, 1에서 2는 되지만, 0에서 2는 안된다. 다음과 같은 메서드가 있을 때, 적절한 선행, 후행 조건과 불편식을 추가하라
int getSpead()
void setSpeed(int x)
boolean isFull()
void fill()
void empty()
믹서의 인터페이스를 설계해 보자.
가장 추상화 단계가 낮은 클래스 불변식 부터 작성해보자
속도는 열 단계로 설정할 수 있다.
@invarient getSpeed() >=0 && getSpeed() < 10
비어 있는 상태에서는 작동할수 없다.
@invarient isNull() ? 0 : getSpeed()
각 메서드별 선행 조건과 후행 조건을 알아보자
getSpeed() 값을 가져오기만 하면 되기에 특별한 선행조건, 후행조건이 필요없다.
setSpeed(x)는 한번에 한칸씩만 속도를 바꿀수 있고, 속도는 열단계로 이루어져 있다.
@pre Math.abs(getSpeed() - x) <= 1
@pre x >=0 && x < 10
setSpeed()의 값이 제대로 들어갔는지 후행 조건으로 확인해보자
@post getSpeed() == x
void full()은 비어져 있는 믹서기를 채우는 메서드로 선행조건은 꽉차있지 않을때 후행조건은 꽉 차져있는지를 확인해보자.
@pre !isFull() 꽉 차있지 않는 경우에만 실행
@post isFull() 꽉 차있는가?
void empty는 믹서기를 비우는 메서드로 선행조건은 비어있는 경우에는 실행하지 않고 후행조건으로는 비어있는지를 확인해보자.
@pre !isEmpty() 비어있지 않는 경우에만 실행
@post isEmpty() 비어있는 가?
typescript로 총 정리하면 다음처럼 된다
/**
* 속도는 열 단계로 설정할 수 있다.
* @invarient getSpeed() >=0 && getSpeed() < 10
* 비어 있는 상태에서는 작동할수 없다.
* @invarient isNull() ? 0 : getSpeed()
*/
interface Mixer {
getSpeed(): number,
/**
* @pre Math.abs(getSpeed() - x) <= 1
* @pre x >=0 && x < 10
* @post getSpeed() == x
*/
setSpeed(): void,
/**
* @pre !isFull() 꽉 차있지 않는 경우에만 실행
* @post isFull() 꽉 차있는가?
*/
full(): void,
/**
* @pre !isEmpty() 비어있지 않는 경우에만 실행
* @post isEmpty() 비어있는 가?
*/
empty(): void,
isFull(): boolean,
isEmpty(): boolean
}
클래스 불변식 : 그 인스턴스 내부 값을 수정할 수 없는 클래스이다.
https://www.popit.kr/%EC%8B%A4%EB%AC%B4%EC%97%90%EC%84%9C-%EC%8D%A8%EB%A8%B9%EB%8A%94-%EB%B6%88%EB%B3%80%EC%84%B1/
선행 조건 : 루틴이나 클래스에서 다른 루틴을 호출하거나 객체를 생성하기 전에 반드시 true여하는 조건 https://dkkopp.tistory.com/5
후행 조건 : 루틴이나 클래스를 호출하고 난후 반드시 true여야 하는 조건 https://dkkopp.tistory.com/5