DogDoor.java
private boolean open;
public DogDoor() {
this.open = false;
}
public void open() {
System.out.println("열렸다 참깨!");
open = true;
}
public void close() {
System.out.println("닫렸다 참깨!");
open = false;
}
public boolean isOpen() {
return open;
}
Remote.java
private DogDoor door;
public Remote(DogDoor door) {
this.door = door;
}
public void pressButton() {
System.out.println("Pressing the remote control button...");
if (door.isOpen()) {
door.close();
} else {
door.open();
}
}
DogDoorSimulator.java
public static void main(String[] args) {
DogDoor door = new DogDoor();
Remote remote = new Remote(door);
System.out.println("열려라 참깨!..");
remote.pressButton();
System.out.println("\n\n닫혀라 참깨!");
remote.pressButton();
System.out.println("\n\n다시 열려라 참깨!");
remote.pressButton();
System.out.println("\n\n다시 닫혀라 참깨");
remote.pressButton();
}
토드와 지나의 강아지 문을 다르게 해결해 봅시다. 우리 계획은 다음과 같습니다.
그럼 도대체 하나의 요구 사항이라는 것이 정확인 무엇인가?
지금까지 초기 단계의 요구사항 집합과 하나의 유스케이스를 작성하였다.
이제 요구 사항으로 돌아가서 시스템이 해야 할 일을 모두 담고 있는지 유스케이스를 이용해서 확인 해 보자.
시스템과 관련이 없으면 N/A(Not Applicable:적용되지 않음)으로 기입한다.
| 1. 강아지 문은 열렸을 때 35cm 이상이어야 한다. 2. 리모콘에 있는 하나의 버튼은 문이 닫혔을 때 누르면 열리고, 열렸을 때 누르면 닫힌다. 3. 강아지 문은 한번 열린 후, 닫지 않으면 자동으로 닫혀야 한다. |
| 1). 피도가 밖에 나가고 싶어 짖습니다. (N/A) 2). 토드 또는 지나가 피도가 짖는 것을 듣습니다. (N/A) 3). 토드 또는 지나가 리모콘의 버튼을 누릅니다. (2) 4). 강아지 문이 열립니다. (2) 5). 피도가 밖에 나갑니다. (1) 6). 피도는 밖에서 쉬합니다. (N/A) 6.1) 문이 자동으로 닫힙니다. (3) 6.2) 피도가 들어 오려고 짖습니다. (N/A) 6.3) 토드나 지나가 피도가 짖는 것을 듣습니다.(다시) (N/A) 6.4) 토드나 지나가 리모콘을 누릅니다. (2) 6.5) 강아지 문이 열립니다.(다시) (2) 7). 피도가 안으로 들어옵니다. (1) 8). 강아지 문이 자동으로 닫힙니다. (3) |
우리의 요구 사항은 시스템이 해야 할 일을 모두 담고 있다.
이제 이 요구사항을 해결하기 위해 코드를 작성 할 준비가 끝났다.
Remote.java
//자바의 타이머 클래스를 사용한다.
import java.util.Timer;
import java.util.TimerTask;
private DogDoor door;
public Remote(DogDoor door) {
this.door = door;
}
public void pressButton() {
System.out.println("Pressing the remote control button...");
if (door.isOpen()) {
door.close();
} else {
door.open();
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
door.close(); //문이 닫히면 타이머를 해제한다.
timer.cancel();
}
}, 5000);
}
}
DogDoorSimulator.java
public static void main(String[] args) {
DogDoor door = new DogDoor();
Remote remote = new Remote(door);
System.out.println("알아서 다해라 참깨!..");
//버튼은 하나만 있으면 알아서 다 한다.
System.out.println("열려라 참깨!..");
remote.pressButton();
System.out.println("닫혀라 참깨!..");
}
알아서 다해라 참깨!..
열려라 참깨!..
열렸다 참깨!
닫혀라 참깨!..
닫혔다 참깨!
실행을 하니 아주 잘 작동한다.
하지만 피도가 밖에 있고 들어오지 않았는데 문이 닫히는 경우에는?
대체 경로를 구현하지 않았다..
DogDoorSimulator.java
public class DogDoorSimulator {
@SuppressWarnings("static-access")
public static void main(String[] args) {
DogDoor door = new DogDoor();
Remote remote = new Remote(door);
System.out.println("알아서 다해라 참깨!..");
System.out.println("열려라 참깨!..");
//버튼은 하나만 있으면 알아서 다 한다.
remote.pressButton();
System.out.println("닫혀라 참깨!..");
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) { }
System.out.println("피도가 들어오지 못했네!..문 열어 달라고 깽깽 거린다. ");
System.out.println("주인이 다시 리모콘 클릭..");
remote.pressButton();
}
}
{html}
<pre>
외부 구동자(액터)<font color="#FFFFFF">(1)</font> 1. 유스케이스에 설명된 단계들의 리스트를 시작시킨다.
이것이 없으면 유스케이스는 시작되지 않는다.
유스케이스<font color="#FFFFFF">(4)</font> 2. 성공하기 위해 시스템이 해야 할 일
시작조건<font color="#FFFFFF">(6)</font> 3. 유스케이스가 언제 끝나는지 알려준다.
이것이 없으면 유스케이스는 끝나지 않는다.
요구사항<font color="#FFFFFF">(2)</font> 4.좋은 요구사항들을 수집하게 도와준다. 시스템이 할 일에 관한 이야기를 한다.
명확한 가치<font color="#FFFFFF">(7)</font> 5.모든 것이 제대로 진행되었을 때의 시스템이 하는 일
고객 시스템에 대해 얘기할 때 보통 이것을 얘기한다.
종료조건<font color="#FFFFFF">(3)</font> 6. 이것이 항상 유스케이스의 첫 번째 단계이다.
주 경로<font color="#FFFFFF">(5)</font> 7. 이것이 없이는 유스케이스가 아무에게도 소용없다. 이것 없는 유스케이스는 항상 실패한다.
</pre>
{html}