Skip to content

Commit 78ef05b

Browse files
committed
0925 TDD 4장
1 parent dffe102 commit 78ef05b

File tree

2 files changed

+123
-41
lines changed

2 files changed

+123
-41
lines changed

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ Today I Learned!
99
###
1010
- [200306 flexbox예습](https://github.com/SeongIkKim/TIL/blob/master/Flexbox(20.03.06)/flexpractice.html)
1111

12+
### TDD
13+
14+
* [200925 <테스트 주도 개발 - 켄트 백> 1~4장 정리](https://github.com/SeongIkKim/TIL/blob/master/TDD/Ch1~4.md)
15+
1216
### DevOps
17+
1318
- [200530 Docker 간단배포](https://github.com/SeongIkKim/TIL/blob/master/DevOps/Docker_simple_practice.md)
1419

1520
### Machine/Deep Learning

TDD/1-4장.md TDD/Ch1~4.md

+118-41
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,23 @@ public void testMultiplication() {
5555

5656
이 코드는 지금 '빨강' 상태이다. public 필드이기도 하고, 금액 계산에 정수형을 사용하고 있다. 일단 '초록'을 보기 위해 문제사항들을 다 적어놓고 진행한다.
5757

58-
* $5 + 10CHF = $10(환율이 2:1일 경우)
59-
* $5 * 2 = $10
60-
* amount를 private으로 만들기
61-
* Dollar 부작용?
62-
* Money 반올림?
58+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
59+
> * $5 * 2 = $10
60+
> * amount를 private으로 만들기
61+
> * Dollar 부작용?
62+
> * Money 반올림?
63+
>
6364
6465

6566

6667
컴파일이 되게 만드려면 다음과 같은 컴파일에러를 해결해야한다.
6768

68-
> 1. Dollar 클래스가 없음
69-
>
70-
> 2. 생성자가 없음
71-
>
72-
> 3. times(int) 메서드가 없음
73-
>
74-
> 4. amount 필드가 없음
69+
1. Dollar 클래스가 없음
70+
2. 생성자가 없음
71+
72+
3. times(int) 메서드가 없음
73+
74+
4. amount 필드가 없음
7575

7676

7777

@@ -160,11 +160,13 @@ void times(int multiplier){
160160

161161

162162

163-
* $5 + 10CHF = $10(환율이 2:1일 경우)
164-
* ~~$5 * 2 = $10~~
165-
* amount를 private으로 만들기
166-
* **Dollar 부작용?**
167-
* Money 반올림?
163+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
164+
> * ~~$5 * 2 = $10~~
165+
> * amount를 private으로 만들기
166+
> * **Dollar 부작용?**
167+
> * Money 반올림?
168+
169+
168170

169171
다섯가지 문제 사항 중 4번에 집중해보자.
170172

@@ -248,13 +250,13 @@ Dollar 객체와 같이 객체를 값처럼 쓸 수 있는데, 이를 __값 객
248250

249251
값 객체를 사용했을 때 기억 할 점은 2장에서 다루었던 것과 마찬가지로, 모든 연산이 새 객체를 반환해야 한다는 점과, `equals()` 를 구현해야 한다는 점이다. 만약 Dollar를 해시 테이블의 키로 쓸 것이라면 `equals()` 를 구현할 때 `hashCode()` 도 만들어야 하지만, 일단 그것은 나중에 생각하기로 한다.
250252

251-
* $5 + 10CHF = $10(환율이 2:1일 경우)
252-
* ~~$5 * 2 = $10~~
253-
* amount를 private으로 만들기
254-
* ~~Dollar 부작용?~~
255-
* Money 반올림?
256-
* __equals()__
257-
* hashCode()
253+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
254+
> * ~~$5 * 2 = $10~~
255+
> * amount를 private으로 만들기
256+
> * ~~Dollar 부작용?~~
257+
> * Money 반올림?
258+
> * __equals()__
259+
> * hashCode()
258260
259261

260262

@@ -318,13 +320,13 @@ public boolean equals(Object object){
318320

319321

320322

321-
* $5 + 10CHF = $10(환율이 2:1일 경우)
322-
* ~~$5 * 2 = $10~~
323-
* amount를 private으로 만들기
324-
* ~~Dollar 부작용?~~
325-
* Money 반올림?
326-
* ~~equals()~~
327-
* hashCode()
323+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
324+
> * ~~$5 * 2 = $10~~
325+
> * amount를 private으로 만들기
326+
> * ~~Dollar 부작용?~~
327+
> * Money 반올림?
328+
> * ~~equals()~~
329+
> * hashCode()
328330
329331

330332

@@ -340,20 +342,95 @@ __값 객체 두개를 비교하도록 하는 동일성 문제__ 는 해결되
340342

341343

342344

343-
* $5 + 10CHF = $10(환율이 2:1일 경우)
344-
* ~~$5 * 2 = $10~~
345-
* amount를 private으로 만들기
346-
* ~~Dollar 부작용?~~
347-
* Money 반올림?
348-
* ~~equals()~~
349-
* hashCode()
350-
* Equal null
351-
* Equal object
345+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
346+
> * ~~$5 * 2 = $10~~
347+
> * amount를 private으로 만들기
348+
> * ~~Dollar 부작용?~~
349+
> * Money 반올림?
350+
> * ~~equals()~~
351+
> * hashCode()
352+
> * Equal null
353+
> * Equal object
352354
353355

354356

355357
3장에서 다룬 내용은 다음과 같다.
356358

357359
* 값 객체를 사용한다면 새로운 오퍼레이션을 구현해야한다( 여기서는 `equals()`)
358360
* 해당 오퍼레이션을 테스트하고, 간단히 구현한다.
359-
* 삼각 측량법에 따라 두 경우를 모두 수용할 수 있을 정도로 리팩토링한다.
361+
* 삼각 측량법에 따라 두 경우를 모두 수용할 수 있을 정도로 리팩토링한다.
362+
363+
364+
365+
---
366+
367+
# 4장 프라이버시
368+
369+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
370+
> * ~~$5 * 2 = $10~~
371+
> * **amount를 private으로 만들기**
372+
> * ~~Dollar 부작용?~~
373+
> * Money 반올림?
374+
> * ~~equals()~~
375+
> * hashCode()
376+
> * Equal null
377+
> * Equal object
378+
379+
380+
381+
```java
382+
public void testMultiplication(){
383+
Dollar five = new Dollar(5);
384+
Dollar product = five.times(2);
385+
assertEquals(10, product.amount);
386+
product = five.times(3);
387+
asssertEquals(15, product.amount);
388+
}
389+
```
390+
391+
392+
393+
`Dollar.times()` 연산은 호출받은 Dollar 객체 값에 인자로 받은 곱수만큼 곱한 값을 갖는 Dollar를 반환해야 한다. 그럼 `assertEquals()` 에서 불필요한 부분을 리팩토링 해볼 수 있다.
394+
395+
396+
397+
```java
398+
public void testMultiplication(){
399+
Dollar five = new Dollar(5);
400+
assertEquals(new Dollar(10, five.times(2));
401+
assertEquaals(new Dollar(15). five.times(3));
402+
}
403+
```
404+
405+
406+
407+
불필요한 product 변수를 걷어냈으므로, Dollar의 amount 변수를 public에서 사용하지 않아도 되게 되었다. 따라서, amount 변수를 private으로 선언할 수 있다.
408+
409+
410+
411+
```java
412+
private int amount;
413+
```
414+
415+
416+
417+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
418+
> * ~~$5 * 2 = $10~~
419+
> * ~~amount를 private으로 만들기~~
420+
> * ~~Dollar 부작용?~~
421+
> * Money 반올림?
422+
> * ~~equals()~~
423+
> * hashCode()
424+
> * Equal null
425+
> * Equal object
426+
427+
428+
429+
한 가지를 해결했지만, 주의할 점이 있다. 3장에서 만들었던 `equals()` 라는 동치성 테스트가 제대로 작동하지 않는다면, 새로 조정한 테스트코드가 정확하게 작동한다는 것을 보장할 수 없다는 것이다. equals가 두 값 객체를 올바르게 비교한다는 가정 하에 `10` 과 `product.amount` 를 걷어낸 것이기 때문이다.
430+
431+
이번 장에서 배운것은 다음과 같다.
432+
433+
* 개발된 기능은 테스트의 개선을 위해서만 사용했다.( `Dollar.times()` )
434+
* 두 테스트가 동시에 실패하면, 망한다.( `equals()` 가 제대로 안 만들어졌다면 망할 것이다)
435+
* 위험요소가 있음에도 계속 진행한다.(그럼에도 불구하고 테스트코드를 짰다면 코드는 전진한다)
436+
* 테스트와 코드 사이에 결합도를 낮추기 위해, 테스트하는 객체의 새 기능을 사용했다. -> 테스트코드에서 `amount` 를 사용했기 때문에 `amount` 를 private 변수로 만들 수 없다면, 테스트와 코드가 너무 결합된 것이다. 따라서 `Dollar.times()` 의 새 기능(값 객체를 반환)을 활용하여 결합도를 낮추었다.

0 commit comments

Comments
 (0)