애자일 자바 첫장.

테스트 주도 개발로 자바를 배우자는게 애자일 자바의 핵심인것 같다. 다른 책들과 다르게 예제를 따라하고, 연습문제를 풀어야 제대로 책을 보았다고 할 수 있는 책이다.

책에는 JetBrains의 IDEA를 사용해서 예제를 실행하는 방법에 대해 소개되어 있다. 하지만 대세는 이클립스란 생각에 이클립스를 사용해서 예제와 연습문제를 풀었다.

환경설정을 잘 해야 개발에 집중할 수 있는데, 환경설정이 잘 안되면 짜증만 나고 의욕이 떨어진다.

환경은 Windows XP에서 Java 1.6, Eclipse Galileo, JUnit 4 이다.
Java를 설치하고 환경변수를 설정하는것은 이야기 하지 않는다.
이클립스는 갈릴레오를 설치하였고, 이클립스에 JUnit이 기본적으로 들어있다.
해줘야 할 것은 Java Build Path의 Libraries에 JUnit을 추가해주면 된다.

아래에서 보이는 이클립스 화면과 같이 Package Explorer에서 JUnit4가 추가된 모습이 보이게 해야한다.


이클립스에서 Java Project를 만든다.
프로젝트에서 오른쪽 클릭 > Properties 를 클릭한다
Java Build Path > Libraries > Add Library 를 선택해서 JUnit을 추가한다.



JUnite을 선택한다.



JUnit3와 JUnit4를 선택할 수 있는데 JUnit4를 선택하였다.


환경설정은 간단히 이것으로 끝이 난다.

자바 소스의 위치는 src와 test로 나뉘는데 src는 실제 자바 코드가 들어가는 곳이고 test는 JUnit 테스트 자바 코드가 들어가는 곳이다. New > Source Folder 로 소스폴더를 추가하면 된다. New > Folder 로 추가하면 Java Build Path > Source에서 해당 폴더를 추가해 줘야 bin 디렉토리에 class 파일이 생성된다.


연습문제

PawnTest.java

더보기


Pawn.java

더보기


저작자 표시 비영리 변경 금지
Posted by 재만 트랙백 0 : 댓글 0

head first 디자인 패턴에 대한 정리가 되어 있다.
http://wiki.oracleclub.com/pages/viewpage.action?pageId=1507372

wikipedia 디자인 패턴 카테고리. GOF 디자인패턴 외에 많은 패턴이 소개되어 있다.
http://en.wikipedia.org/wiki/Category:Software_design_patterns
저작자 표시 비영리 변경 금지
Posted by 재만 트랙백 0 : 댓글 0

Command Pattern

2009/06/06 18:10 from 소프트웨어공학

영어로 이해하는 연습을 하자..
이것도 다 수련..

http://en.wikipedia.org/wiki/Command_pattern

객체지향프로그래밍에서 커맨드 패턴은 객체가 메소드를 부를때 필요한 정보를 캡슐화하여 나타내는 디자인 패턴이다.
객체는 메소드와 메소드 파라미터의 값을 갖는다.

커맨드 패턴은 client, invoker, receiver 3가지가 연관되어 있다. 클라이언트(client)는 커맨드 객체를 사용하고, 이후 메소드를 부를때 사용되는 정보를 제공한다. 인보커(호출자, invoke:부르다는 의미)는 메소드가 불릴때 결정된다. 리시버는 메소드 코드가 포함된 클래스의 인스턴스다.

커맨드 패턴을 만들면 위임, 순차나 메소드 실행이 필요한 공통 컴포넌트를 쉽게 만들수 있다. 이때 해당 메소드의 주인이나, 메소드 파라미터를 알 필요가 없다.

사용
Undo
사용자 액션은 스택에 쌓게 되고 그것을 꺼내면 undo가 된다.

트랜잭셔널 행위
롤백이나 자동으로 수행되다 실패했을때 undo는 필수로 있어야 하는데 커맨드 오브젝트는 two-phase commit 을 구현하는데 사용된다.

프로그래스 바
순차적으로 선택된 커맨드들을 실행시키는 프로그램이 있을때, 커맨드에 getEstimateDuration() 메소드를 정의하면 이것을 사용해 프로그래스 바에 반영할 수 있다.

위저드 (마법사)
GUI프로그램에서 "Finish" 를 선택했을때 자동으로 실행되는 프로그램을 만드는데 사용된다.

GUI 버튼, 메뉴 아이템
Swing에서 Action이 커맨드 객체이다.

쓰레드 풀
보통 쓰레드 풀이 가지고 있는 addTask() 메소드를 가지고 있는데 큐에 task를 더하는 방식으로 되어 있다. 큐에 있는 아이템들이 커맨드 객체.

매크로
사용자 액션이 커맨드 객체로 되어 있다면 이것을 기억해서 같은 액션을 수행할 수 있게 된다.

네트워크
컴퓨터 네트워크 게임처럼 입력한 커맨드를 네트워크를 통해 다른 머신에서 실행시킨다.

병렬 프로세싱
커맨드들이 자원을 공유하고 많은 쓰레드를 병렬적으로 실행하기 위해 쓰인다.

구조


예제
/*the Invoker class*/
public class Switch {
 
    private Command flipUpCommand;
    private Command flipDownCommand;
 
    public Switch(Command flipUpCmd,Command flipDownCmd){
         this.flipUpCommand=flipUpCmd;
         this.flipDownCommand=flipDownCmd;
    }
 
    public void flipUp(){
         flipUpCommand.execute();
    }
 
    public void flipDown(){
         flipDownCommand.execute();
    }
 
}
 
 
/*Receiver class*/
 
public class Light{
 
     public Light(){  }
 
     public void turnOn(){
        System.out.println("The light is on");
     }
 
     public void turnOff(){
        System.out.println("The light is off");
     }
 
}
 
/*the Command interface*/
 
public interface Command{
    void execute();
}
 
 
/*the Command for turning on the light*/
 
public class FlipUpCommand implements Command{
 
   private Light theLight;
 
   public FlipUpCommand(Light light){
        this.theLight=light;
       }
 
   public void execute(){
      theLight.turnOn();
   }
 
}
 
 
 
/*the Command for turning off the light*/
 
public class FlipDownCommand implements Command{
 
   private Light theLight;
 
   public FlipDownCommand(Light light){
        this.theLight=light;
       }
 
   public void execute(){
      theLight.turnOff();
   }
 
}
 
/*The test class or client*/
public class PressSwitch{
 
   public static void main(String[] args){
       Light lamp = new Light();
       Command switchUp=new FlipUpCommand(lamp );
       Command switchDown=new FlipDownCommand(lamp );
 
       Switch s=new Switch(switchUp,switchDown);
 
       try {
           if (args[0].equalsIgnoreCase("ON")){
                s.flipUp();
                System.exit(0);
           }
           if (args[0].equalsIgnoreCase("OFF")){
               s.flipDown();
               System.exit(0);
           }
           System.out.println("Argument \"ON\" or \"OFF\" is required.");
           } catch (Exception e){
            System.out.println("Argument's required.");
           }
 
   }
}





예제에서 보여준 심플 스위치는 불을 키고 끄는 두가지 커맨드가 있다. 커맨드 패턴을 사용하면서 얻게 되는 장점은 스위치를 꼭 불을 끄고 키는데 사용하는게 아니라 엔진(engine)을 키고 끄는 것처럼 다른 것에도 적용할 수 있다는 것이다.

Command : Command.java
ConcreteCommand : FlipDownCommand.java, FilpUpCommand.java
Receiver : Light.java
Invoker : Switch.java
Client : PressSwitch.java

더보기


저작자 표시 비영리 변경 금지
Posted by 재만 트랙백 0 : 댓글 0