1부 1장 다중 통화를 지원하는 Money 객체

0. 들어가며

주식 거래소를 운영하고 있다고 가정한다. 현재는 USD만 지원하지만 Franc도 지원하게 수정하고 싶다. 앞으로의 과정들은 이것을 설명한다.

  • 목록에서 구현을 시작하는 부분은 굵게, 끝난 부분은 줄을 그을 것이다.

< 현재 구현해야할 목록 >

  • $5 + 10CHF = $10 (환율이 2:1일 경우)
  • $5 * 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용
  • Money 반올림

-> 통화가 다른 두 금액을 더해서 주어진 환율에 맞게 변한 금액을 결과로 얻을 수 있어야 한다.
-> 주가를 주식의 수에 곱한 금액을 결고로 얻을 수 있어야 한다.

1. 간단한 곱셈

public void testMultiplication() {
	Dollar five = new Dollar();
	five.times(2);
	assertEquals(10, five.amount);
}
  • Dollar class 없음
  • 생성자가 없음
  • times(int) method 없음
  • amount 필드 없음

Dollar class를 만들어서 위의 오류를 잡는다.

public class Dollar {
    public int amount;

    public Dollar(int amount) {

    }
    public void times(int multiplier) {

    }
}

오류는 모두 잡혔고 실행한다면 에러가 발생한다. 우리는 10을 바랐지만 값은 0으로 나왔다. 우선 테스트를 통과하기 위해서 아래와 같이 수정한다.

public class Dollar {
    public int amount = 10;

    public Dollar(int amount) {

    }
    public void times(int multiplier) {

    }
}

테스트를 통과함을 볼 수 있다!

주기는 아래와 같다.

  1. 작은 테스트를 하나 추가한다.
  2. 모든 테스트를 실행해서 테스트가 실패하는 것을 확인한다.
  3. 조금 수정한다.
  4. 모든 테스트를 실행해서 테스트가 성공하는 것을 확인한다.
  5. 중복을 제거하기 위해 리팩토링한다.
public class Dollar {
    public int amount;

    public Dollar(int amount) {
        this.amount = amount;
    }
    public void times(int multiplier) {
        amount *= multiplier;
    }
}

위와 같이 리팩토링하면 중복을 제거하고 변하는 값에 따라서 원하는 값을 얻을 수 있게 되었다.

우리가 진행한 작업은 다음과 같다.

  • 작업해야 할 테스트 목록을 만들었다.
  • 오퍼레이션이 외부에서 어떻게 보이길 원하는지 말해주는 이야기를 코드로 표현
  • JUnit에 대한 상세한 사항은 잠시 무시
  • 스텁 구현을 통해 테스트를 컴파일
  • 끔찍한 죄악을 범하여 테스트만 통과
  • 상수를 변수로 변경해서 일반화
  • 할일을 한번에 처리하는 대신 목록에 추가만 함

좋은 웹페이지 즐겨찾기