2.요구 사항 수집 (그들에게 원하는 것을 주세요)

  1. 2.요구 사항 수집 (그들에게 원하는 것을 주세요)
    1. 2.1 새로운 프로그래밍 일이 생겼습니다.
    2. 2.2 강아지 문부터 시작 합니다.
    3. 2.3 그런데 지나가 사용해 보니...
    4. 2.4 고객에게 귀 기울이세요
    5. 2.5 문제 발생에 대한 계획안
    6. 2.6 유스케이스를 소개 합니다.
    7. 2.7 유스케이스 가지고 요구사항 체크하기
    8. 2.7 토드와 지나의 강아지 문, 버전 2.0 적용
    9. 2.8 나의 목적은 무엇일까요?
    10. 문서에 대하여

2.1 새로운 프로그래밍 일이 생겼습니다.

  • "덕의 강아지 문" 프로젝트
  • 덕은 최첨단 문을 개발중이다.
  • 최첨단 문을 동작하게 하는 모든 소프트웨어를 만들 수 있는 프로그래머는 바로 당신이다.
  • 당신의 첫 번째 고객 : 토드와 지나 그리고 멍멍이 피도
  • 첫 번째 요구사항(p92) : 버튼 하나로 작동하는 강아지 문을 만들어 주세요..

2.2 강아지 문부터 시작 합니다.

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();
}

  • 음 작동이 아주 잘되는 구만.. 개발자 대만족!!

2.3 그런데 지나가 사용해 보니...

  • 별로 빨리 닫히지도 않는데요.
  • 토끼가 부엌으로 들어오면 어쩌죠?
  • 쥐도 어떻게 부엌으로 들어 왔죠.
  • 이거 정상적으로 동작하지 않습니다.

토드와 지나의 강아지 문을 다르게 해결해 봅시다. 우리 계획은 다음과 같습니다.

  • ① 강아지 문에 대한 요구사항을 수집한다.
  • ② 문이 실제로 무엇을 해야 하는지 알아낸다.
  • ③ 토드와 지나로부터 추가 정보를 얻는다.
  • ④ 문을 잘 만든다. (1. 여러분의 소프트웨어가 고객이 원하는 기능을 하도록 하세요.)

그럼 도대체 하나의 요구 사항이라는 것이 정확인 무엇인가?

  • 그것은 여러분의 시스템이 올바르게 동작하기 위해서 수행하는 특정한 하나의 일입니다.
    • 기억하세요. 시스템이 올바르게 동작하는지는 고객이 결정한다.
    • 하나의 요구사항은 보통 한 가지 일이고,
      그 요구사항을 해결했다는 것을 확인하기 위해서는 테스트를 해야 한다.
  • 요구사항
    • 하나의 요구사항은 특정 상품이나 서비스가 어떤것 이어야 하는지
      또는 무엇을 수행해야 하는지를 자세하게 설명한 것이다.

2.4 고객에게 귀 기울이세요

  • 요구사항들에 관한 가장 좋은 방법은 원하는 것을 고객이 말하게 하는 것 이다.
  • 토드와 지나의 강아지 문, 버전 2.0 요구사항 리스트
    • 강아지 문은 열렸을 때 35cm 이상이어야 한다.
    • 리모콘에 있는 하나의 버튼은 문이 닫혔을 때 누르면 열리고, 열렸을 때 누르면 닫힌다.
    • 강아지 문이 한번 열린 후, 닫지 않으면 자동으로 닫혀야 한다.

강아지 문이 정말 해야 할 일은 무엇일까요?

  • 강아지 문을 만드는 중에 생각조차 못해서 말하지 못했던 것이 나올 수 있다.
    • 중간에 변경사항이 발생하면, 가장 고생스러운 사람은 여러분이다.
    • 요구 사항의 수집단계에서 고객이 미쳐 생각하지 못했지만, 나중에 발생 할 문제까지 짚고 나아가야 한다.
    • 그래서 피도가 밖에 나가려고 할 때의 상황을 차근차근 적어 본다.
  • 토드와 지나으 강아지 문, 버전 2.0 강아지 문이 하는 일
    • 1). 피도가 밖에 나가고 싶어 짖습니다.
    • 2). 토드 또는 지나가 피도가 짖는 것을 듣습니다.
    • 3). 토드 또는 지나가 리모콘의 버튼을 누릅니다.
    • 4). 강아지 문이 열립니다.
    • 5). 피도가 밖에 나갑니다.
    • 6). 피도는 밖에서 쉬합니다.
    • 7). 피도가 안으로 들어옵니다.
    • 8). 강아지 문이 자동으로 닫힙니다.

바보같은 질문이란 없습니다.

  • 좋은 요구사항은 고객이 여러분에게 말하는 것 이상의 것을 포함하고 있으며,
    예상 밖의 상황에서도 시스템이 잘 동작하는 내용도 포함하고 있어야 한다.
  • 시스템은 고객의 목적을 맞춰주기 위해 필요한 모든 것이라 할 수 있다. (강아지문,리모콘..)
  • 위대한 소프트웨어를 만드는 첫 번째 단계는 고객이 원하는 것을 만들어 줘야 하는 것이다..
  • 좋은 요구 사항을 얻는 가장 좋은 방법은 시스템이 무엇을 해야 하는지를 이해하는 것이다.

2.5 문제 발생에 대한 계획안

  • 계획이 상황대로 진행이 안 될 수 있다.
  • 문제가 될 만한 점들을 알아내고, 발견된 문제를 해결하도록 리스트를 수정해야 한다.
  • 다음은 피도가 집에 들어오기 전에 문이 닫히는 문제에 대한 계획안이다.
    • 1). 피도가 밖에 나가고 싶어 짖습니다.
    • 2). 토드 또는 지나가 피도가 짖는 것을 듣습니다.
    • 3). 토드 또는 지나가 리모콘의 버튼을 누릅니다.
    • 4). 강아지 문이 열립니다.
    • 5). 피도가 밖에 나갑니다.
    • 6). 피도는 밖에서 쉬합니다.
    • 6.1) 문이 자동으로 닫힙니다.
    • 6.2) 피도가 들어 오려고 짖습니다.
    • 6.3) 토드나 지나가 피도가 짖는 것을 듣습니다.(다시)
    • 6.4) 토드나 지나가 리모콘을 누릅니다.
    • 6.5) 강아지 문이 열립니다.(다시)
    • 7). 피도가 안으로 들어옵니다.
    • 8). 강아지 문이 자동으로 닫힙니다.

2.6 유스케이스를 소개 합니다.

  • 유스케이스는 고객의 특정한 목표를 달성하기 위해 여러분의 시스템이 무엇을 하는지를 기술합니다.
    • 하나의 유스케이스는 하나의 목표에만 집중한다.
    • 고객의 목표가 유스케이스의 핵심이다.
    • 유스케이스는 고객의 목표가 완료되면 끝나게 된다.
  • 유스케이스
    유스케이스는 새로 만든 시스템이나 소프트웨어 변경사항에 대한 요구사항을 찾아내는 방법이다.
    각 유스케이스는 특정 목표를 달성하기 위해 시스템이 사용자 또는 다른 시스템과 어떻게 상호작용 하는지를
    전달하는 하나 이상의 시나리오를 제공한다.

하나의 유스케이스, 세 가지 부분

  • ① 명확한 가치
    • 모든 유스케이스는 시스템에게 명확한 가치를 가지고 있어야 한다.
      유스케이스가 고객의 목표 달성에 도움이 되지 않는다면 소용 없다.
  • ② 시작과 종료
    • 모든 유스케이스는 명확한 시작 시점과 종료 시점이 있어야 한다.
  • ③ 외부 기동자(액터)
    • 모든 유스케이스는 액터에 의해 시작된다.
    • 액터는 주로 사람이지만, 시스템 외부의 어떤 것 도 될 수 있다.

바보같은 질문은 없습니다.

  • 유스케이스의 핵심중 하나는 유스케이스가 하나의 특정 목표를 달성하는데 초점을 맞추고 있다는 것이다.
  • 유스케이스는 일련의 단계 들이고, 유스케이스 다이어그램은 유스케이스들을 시각적으로 보여주는 방법이다.
  • 유스케이스는 코드 작성에 도움이 된다.

2.7 유스케이스 가지고 요구사항 체크하기

지금까지 초기 단계의 요구사항 집합과 하나의 유스케이스를 작성하였다.
이제 요구 사항으로 돌아가서 시스템이 해야 할 일을 모두 담고 있는지 유스케이스를 이용해서 확인 해 보자.
시스템과 관련이 없으면 N/A(Not Applicable:적용되지 않음)으로 기입한다.

  • 토드와 지나의 강아지 문, 버전 2.0 요구사항 리스트
1. 강아지 문은 열렸을 때 35cm 이상이어야 한다.
2. 리모콘에 있는 하나의 버튼은 문이 닫혔을 때 누르면 열리고, 열렸을 때 누르면 닫힌다.
3. 강아지 문은 한번 열린 후, 닫지 않으면 자동으로 닫혀야 한다.
  • 토드와 지나의 강아지 문, 버전 2.0 강아지 문이 하는일
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)

우리의 요구 사항은 시스템이 해야 할 일을 모두 담고 있다.
이제 이 요구사항을 해결하기 위해 코드를 작성 할 준비가 끝났다.

2.7 토드와 지나의 강아지 문, 버전 2.0 적용

자동으로 문 닫기

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);
  }
}

  • 쓰레드도 사용 할 수 있지만 Timer클래스를 사용하면 일정한 시간이 지난후에 작업을 수행시키는 것이 편리하다.
  • timer 변수를 final로 선언한 이유는 TimerTask 익명 클래스에서 timer의 cancel() 메소드를 호출해야 하기 때문이다.
    익명 클래스에서 자신을 포함하는 클래스(여기서는 Remote)의 변수에 접근하려면, 그 변수는 final로 선언되어야 한다.
  • Timer는가비지 콜렉션 될 때까지 종료되지 않도록 구현되어 있으므로
    cancel()을 호출하지 않으면 행이 걸리고, 몇 시간이고 수행 될 수 있다.
  • 익명클래스(anonymous class)란?
    • new 수식이 있는 곳에서 바로 클래스 또는 인터페이스를 정의하는 것.
    • 오직 한번만 사용 할 수 있으며, 클래스의 선언과 객체 생성이 동시에 발생한다.

새로운 모의 시험기

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();
  }	
}

2.8 나의 목적은 무엇일까요?

{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}

문서에 대하여