실용주의 프로그래머 TIL 8일차

최정환·2022년 3월 27일
0

pragmatic-programmer

목록 보기
8/13

5장까지 있는 연습문제 중에서 하나의 문제를 풀어보자

💡 연습 문제 14 (답 예시는 422쪽에 있다.)

부엌용 믹서의 인터페이스를 설계하라. 이 믹서는 나중에 웹으로 쓸 수 있도 록 사물 인터넷IoT으로 연결될 예정이지만, 지금으로서는 믹서를 제어할 수 있는 인터페이스만 있으면 된다. 속도를 열 단계로 설정할 수 있는데 0은 중지를 의미한다.
비어 있는 상태에서는 작동할 수 없고, 한 번에 한 칸씩만 속도를 바꿀 수 있다.
즉 0에서 1, 1에서 2는 되지만, 0에서 2는 안 된다.
다음과 같은 메서드가 있을 때, 적절한 선행, 후행 조건과 불변식을 추가하라.

int getSpeed()
void setSpeed(int x) 
boolean isFull() 
void fill()
void empty()


☕️ 내가 생각한 답의 풀이과정

  1. 조건에 대하여 생각함
  • 속도는 열단계
  • 한번엔 한칸씩만 바꿀 수 있다.
  • 0은 믹서기를 중지시킨다.
  • 믹서기가 비어있다면 작동시킬 수 없다.
  1. 메서드의 역할
  • getSpeed() 지금 속도가 얼마인지 나타내준다.
  • setSpeed(int x) 속도를 정수 x만큼 더한다.
  • boolean isFull() 믹서기가 차있나
  • void fill() 믹서기를 채운다.
  • void empty() 믹서기를 비운다.
  1. 먼저 클래스의 불변식을 세운다.
    믹서기는 10단계의 속도를 가지고 있고 비어있다면 작동 시킬 수 없다.
do while(isFull()){
let speed = getSpeed();
  if(speed >0 && speed <=10){
  ....
  }
}
  1. 한번엔 한칸을 만족시키기 위한 검사를 한다. 그리고 값을 speed에 넣는다. (선행)
if(0=<x && x<10){
let step = Math.abs(speed - x);
step = 1 ? step : console.log("한번에 한단계씩만 가능");

speed += step;
}
  1. 비어있다면 비우지 않는다. 채워져있다면 채우지 않는다. (후행)
// 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을 안넣고는 뭘 넣어야할지 모르겠다.

0개의 댓글