Community

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

← Go back
연습문제 풀이
#pragmatic
2년 전
905

💡 연습문제 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
}

✅ 참고 링크


💡 책에 있는 해답

422page 참고