본문 바로가기

책읽기/TDD:ByExample

(10)
점진적인 개선 이번 장에서는 명령행 인수 구문분석기 사례를 가지고 코드를 개선해 나가는 과정을 설명한다. 깨끗한 코드를 짜려면 지저분한 코드를 짠 뒤에 정리해야 한다. 1차 초안 의미전달을 못하는 문자열, HashSet, TreeSet, try-catch-finally 구문 모두 지저분한 코드를 유발한다. Boolean 형을 제공하다가 새로운 인수 유형 Integer, String 을 제공하는 코드를 추가하니 코드가 엄청나게 지저분해졌다. 그래서 이 시점에서 멈추고 리펙토링을 진행했다고 한다. 리펙터링 새로운 인수 유형을 추가하기 위해서는 다음과 같은 부분에서 코드의 변경과 추가가 필요했다. 인수 유형에 해당하는 HashMap을 선택하기 위해 스키마 요소의 구문을 분석한다. 명령행 인수에서 인수 유형을 분석해 진짜 유..
TDD_9 14장 바꾸기. $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 $5 + $5에서 Money반환하기 //해결//Bank.reduce(Money) //수행예정//Money에 대한 통화 변환을 수행하는 Reduce Reduce(Bank, String) 이젠 달러 뿐만아니라 프랑을 달러로 바꾸는 과정을 진행한다. 은행에 환율을 지정하고, 프랑을 달러로 변환하고 알맞게 환전되었는지 확인하면 되겠다. 우리는 2프랑을 1달러로 바꿀 수 있는 2:1비율로 환율을 설정할 것이다. 컴파일 에러를 잡기위해 Bank에 addRate() 추가하고 테스트를 완료시키기 위해현재 bank의 reduce가 Money를 부르고 있으므로 Money의 reduce를 수정해본다. 음.. 테스트는 초록막대를..
TDD_8 13장 진짜로 만들기 $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 지금까지 $5 + $5 = $10을 해결하고 있었다. 하지만 코드에 중복이 있기에 완료표시를 할 수 없다. 현재 Bank클래스로 만든 bank인스턴스의 메소드 reduce는 amount가 10인 Money형 객체를 반환하고 있다. 이와 테스트코드의 five.plus(five)는 중복코드라고 볼 수 있다. reduce메소드에서 적절한 Money객체를 반환하도록 해야 한다. $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 $5 + $5에서 Money반환하기 우리의 코드를 잘 보면 plus메소드는 Money객체를 생성시켜서 Expression형으로 반환한다. 따라서 plus는 ..
TDD_7 12장 드디어, 더하기 $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 더하기의 전체기능을 구현하기 어렵다. 그래서 먼저 5+5=10이라는 쉬운 기능 먼저 해본다. 사실 이 이후의 설명들이 잘 와닿지가 않는다. 편하게 여러 환율을 표현할 수 있으면서도 산술연산 비슷한 표현들을 여전히 산술 연산처럼 다룰 수 있는 해법이 있으면 좋을 것 같다. 객체가 이 역할을 한다고 한다... [가지고 있는 객체가 우리가 원하는 방식으로 동작하지 않을경우엔 그 객체와 외부 프로토콜이 같으면서 내부 구현은 다른 새로운 객체를 만들 수 있다.] => Money와 비슷하게 동작하지만 사실은 두 Money의 합을 나타내는 객체를 만드는 것 이 메타포가 나오기 전의 다른 메타포의 예) Money를 ..
TDD_6 10장 흥미로운 시간. 10장에서는 공용 times를 제거하게 된다. 현재 두 클래스의 times는 비슷하다. 하지만 어떻게 처리해야 할 지 명백한 방법이 떠오르지 않는다. 그래서 팩토리 메서드를 적용하기 전으로 돌아가 본다. Franc에서는 currency가 항상 "CHF", Dollor에서는 "USD"이므로 변수를 이용하도록 바꾼다. 이 때, 각 times()에서 Money를 반환할지, Dollor나 Franc를 반환 할 지 결정해야 한다. 우리는 Money로 공통되게 하고 싶다. 고민하는 대신 그냥 넣어보자. 현재는 Money가 추상클래스로 정의되어 있다. 추상클래스는 인스턴스를 반환할 수 없으므로 concrete클래스로 바꿔주라는 오류 메세지이다. 추상 메소드로 Money에 선언한 times() ..
TDD_5 7장 사과와 오렌지 You can't compare apples and oranges. 영어권 속담, 다른 것을 비교할 수 는 없다. $5 + 10CHF = $10(환율이 2:1 인 경우) // 해결 // $5 x 2 = $10 // 해결 // amount를 private로 만들기 // 해결 // Dollor 부작용? Money 반올림 // 해결 // equals() hashCode() Equal null Equal object //해결// 5CHF x 2 = 10CHF Dollor,Franc 중복 //해결// 공용 equal 공용 times //추가// Franc와 Dollor비교하기 최근에 추가한 Franc와 Dollor를 비교하기 위해 testEquality()에 새로운 테스트코드를 작성한다. 실패..
TDD_4(값 객체 패턴) 3장 모두를 위한 평등. Dollor 객체를 값 객체 패턴으로 설명한다. 값 객체 - immutable : (생성자에 의해 생성된 후)변경 불가능한 객체이다. - 값 객체는 [두개의 값 객체의 동일성(equality) 은 Identity에 기반하지 않고 그들의 컨텐츠로 한다]로 정의된다. ==> Identity : 데이터베이스의 인덱스 처럼 자신을 나타내는 요소, 컨텐츠가 같을 때 두 객체를 구분하는 요소 - 별칭문제를 해결할 수 있다. (dollor가 $5일때 영원히 5의 값을 가짐을 보장, $7을 만들고 싶다면 새로운 객체를 만들어야함.) 이를 통해 값 객체가 암시하는 것을 알 수 있다. 1. 모든 연산은 새 객체를 반환해야 한다. 2. equals()를 통해 같음을 보장받아야 한다. 값 객체는 다음..
TDD_3 1장에서 진행하는 다중화폐예시는 워드가 와이캐시에서 만든 달러로 관리되던 채권을 다중통화로 관리될 수 있게 하는 개발과정에서 테스트를 연습한다. 책에서 제시하는 TDD의 리듬은, 1. 재빨리 테스트 하나 추가 2. 모든 테스트를 실행하고 추가한 테스트가 실패하는지 확인 3. 코드 수정 4. 모든 테스트를 실행하고 전부 성공하는지 확인 5. 리펙토링을 통해 중복제거 이다. 이 부분을 생각하며 예제를 진행할 것이다! 먼저 다중통화를 이용하는 보고서를 만드려면 다음의 일을 해야한다. $5 + 10CHF = $10(환율이 2:1 인 경우) $5 x 2 = $10 첫 번째 할 일은 환율에 맞게 각 화폐를 더한 값을 출력해야 한다. 두 번째 할 일은 통화에 주가의 수 만큼을 곱한 값을 출력해야 한다. 비교적 두 번..