Testing

단위 테스트를 작성하는 것은 단순한 검증이 아니라 설계의 문제이고 문서화의 문제이다.

테스트 주도 개발

테스트 코드를 먼저 작성하면,

  1. 프로그램의 모든 단일 함수의 동작을 검증하는 테스트를 갖게 된다.
  2. 프로그래머가 다른 관점에서 문제를 해결할 수 있다. (프로그램의 호출자 관점에서, 편리하게 호출할 수 있는 소프트웨어 설계)
  3. 테스트 가능한 프로그램을 설계하도록 강제할 수 있다. (소프트웨어를 다른 환경과 분리하도록 강제)
  4. 테스트가 문서화의 형태로 기능한다.

테스트 우선 방식 설계의 예

1
2
3
4
5
6
7
public void testMove() {
WumpusGame g = new WumpusGame();
g.conect(4, 5, "E");
g.setPlayerRoom(4);
g.east();
assertEquals(5, g.getPlayerRoom());
}

위 코드는 WumpusGame 의 어떤 부분보다 먼저 작성되었다.
자신의 의도를 구현하기 전에, 먼저 그 의도를 단순하고 읽기 편하게 만들어 테스트로 제시한다.

테스트 분리

운영 코드를 만들기 전에, 테스트를 먼저 작성하면 소프트웨어에서 분리해야할 부분이 드러나곤한다.
예를 들어,

  1. Payroll 클래스는 EmployeeDatabase 클래스를 이용해 Employee 객체를 꺼낸다.
  2. Employee 에 임금을 계산하도록 요청하고 CheckWriter 객체에 그 임금을 넘겨 수표를 만든다.
  3. Employee 객체에 임금을 지급하고 그 객체를 다시 DB 에 기록한다.
Read more

Extreme Programming

애자일 방법 중 하나인, 익스트림 프로그래밍의 전반적인 내용을 정리한다.

고객 팀 구성원

고객과 개발자가 서로 긴밀하게 작업하고 서로의 문제를 인식하고 해결하기 위해 노력하자.
XP 팀의 고객은, 기능 요소를 정의하고 우선순위를 매기는 개인 또는 그룹이다.

사용자 스토리

요구사항의 구체적인 세부 내용은 시간이 지나면 바뀌기 쉽다.
세부 사항이 존재함을 알고 그게 어떤 종류인지 대강 알야야 하지만, 구체적인 것 까지 모두 알 필요는 없다.

고객과 대화하면서 요구사항의 세부 내용에 대한 감을 잡지만, 세부사항을 기록하지는 않는다.
사용자 스토리란, 현재 진행 중인 요구사항에 관한 대화의 연상 기호다.
요구사항의 구현 일정을 수립하게 해주는 계힉 툴이다.

짧은 계획

개발중인 소프트웨어를 2주마다 공개한다.
2주마다 반복되는 작업은 이해당사자의 어떤 요구를 처리하는 소프트웨어를 만들어낸다.
그리고 그 반복 (iteration) 끝마다 이해당사자의 피드백을 받기 위해 시스템을 시연한다.

인수 테스트

시스템이 고객이 명시한 대로 동작하는지의 여부를 검증한다.
인수테스트는 자동적으로, 반복적으로 실행될 수 있는 스크립트 언어의 한 종류로 작성된다.

Read more

Agile Practices

애자일 실천방법을 정리한다.

가치

빠르게 일하고 변화에 반응할 수 있도록 가치와 원칙을 세운, “애자일 소프트웨어 개발 선언문” 을 보자.

프로세스와 툴보다 개인과 상호작용이 우선이다

팀을 구성하는 일이 환경을 구축하는 일보다 더 중요하다.
팀을 만들기 위해 노력하고 팀의 필요를 기반으로 환경을 구축하자.

포괄적인 문서보다 동작하는 소프트웨어가 우선이다

설계 의사결정의 이유와 시스템을 설명하는 문서를 만들어야한다. 그 문서는 짧고 요약적이어야한다.
하지만, 문서화에 집착하지 말자. 그 필요가 급박하고 중요하지 않다면 아무 문서도 만들지 말자.

계약 협상보다 고객 협력이 우선이다

성공적인 프로젝트를 위해서는, 규칙적으로 자주 고객의 피드백을 받아야한다.
계약서나 작업 기술서에 의존하지 말고, 자주 피드백을 주고 고겍이 개발팀과 가까이 일해야한다.

계획을 따르는 것보다 변화에 대한 반응이 우선이다

Read more

행위

주요 흐름

주요 제어 흐름을 명확하게 표현한다.
프로그램의 주요 흐름에는 예외도 발생할 수 있지만, 연산에는 큰 흐름이 있다.
프로그래밍 언어를 통해 주요 흐름을 명확히 표현하자.

메세지

메세지를 보내서 제어흐름을 표헌한다.

1
2
3
4
5
compute() {
input();
process();
output();
}

“이 연산을 이해하기 위해 세 단계를 알면 되고 당장 자세한 내용은 알 필요 없다” 라는 뜻을 가지고 있다.

선택 메세지

여러 선택 사항을 나타내기 위해 메세지 구현자를 다양화한다.
여러 방법 중 하나로 그래픽을 표시해야할 때, 런타임에 선택이 일어남을 나타내기 위해 다형적 메세지를 사용할 수 있다.

1
2
3
public void displayShape(Shape subject, Brush brush) {
brush.display(subject)
}

더블 디스패치

Read more

상태

직접 접근

객체 내의 상태를 직접 접근한다.
직접 접근의 장점은 표현의 명확성이다.

1
x = 10;

간접 접근

좀더 나은 유연성을 위해 메서드를 통해 상태에 접근한다.

1
2
3
4
Rectangle void setWitdh(int width) {
this.width = width;
area = width * height;
}

공용 상태

클래스의 모든 인스턴스에 적용되는 상태는 필드에 저장한다.

1
2
3
4
class Point {
int x;
int y;
}

가변 상태

Read more