diff --git "a/\354\261\225\355\204\260_3/\354\235\264\354\234\240\355\235\254.md" "b/\354\261\225\355\204\260_3/\354\235\264\354\234\240\355\235\254.md" new file mode 100644 index 0000000..9af0192 --- /dev/null +++ "b/\354\261\225\355\204\260_3/\354\235\264\354\234\240\355\235\254.md" @@ -0,0 +1,80 @@ + +### 액션, 계산, 데이터 구분하기 + +- 코드를 읽을 때 액션과 계산, 데이터 중 어떤 것에 속하는지 잘 살펴보자 +- 숨어있는 액션까지 잘 찾자 +- 하나의 액션을 데이터, 계산, 액션으로 쪼개자 + - 계속 나누다 보면 풍부한 모델링이 가능해진다 + - 냉장고 확인하기 + - 냉장실 확인하기 + - 냉동실 확인하기 + - 구입하기 + - 장바구니 담기 + - 계산하기 + +> 하나의 액션을 분리하는 과정이 OOP에서 단일책임원칙을 위해 메서드를 분리해 내는 과정과 비슷하다 생각함 +> 액션, 계산, 데이터는 분리를 어떻게 할 것인가의 기준을 제공해주는 느낌 + +- 데이터는 데이터만 조합할 수 있다 + - 데이터는 다른 영향을 주지 않는 그냥 데이터다. 데이터를 찾는 일을 먼저 해야 한다. + - 데이터를 찾았다면 동작에 대해 많은 것을 알 수 있다 +> 데이터를 찾았다면 동작에 대해 많은 것을 알 수 있다는 부분은 아직 감이 안 온다 + + +### 데이터 + +- 이벤트에 대한 사실. 일어난 일의 결과를 기록한 것 + - 의미 있게 처리한 입력 장치로부터 얻은 정보 +- 데이터의 의미는 데이터 구조로 담을 수 있다. 데이터 구조로 도메인을 표현할 수 있다 +- 데이터의 장점 + - 직렬화 + - 동일성 비교 + - 자유로운 해석. 반드시 해석이 필요하다는 점은 단점이다 + + +### 계산 + +- 입력값으로 출력값을 만드는 것 +- 실행 시점과 횟수에 관계없이 항상 같은 입력값에 대해 같은 출력값으로 돌려준다 + +- 액션보다 계산이 좋은 이유 + - 테스트하기 쉽다 + - 조합해서 더 큰 계산을 만들 수 있다 + - 동시에 실행, 실행 횟수 등을 신경쓰지 않아도 된다 +- 단점 + - 계산과 액션은 실행하기 전에 어떤 일이 발생할지 알 수 없다 + + +### 액션 + +- 외부 세계에 영향을 주거나 받는 것. +- 실행 시점과 횟수에 의존한다 + +#### 액션은 코드 전체로 퍼진다 + +- 액션을 부르는 함수도 액션이 된다 +- 그 함수를 부르는 다른 함수도 액션이 된다 +- 액션은 반드시 사용해야 하지만 제어하기 어렵때문에 가능한 적고, 작게 잘 제어해서 사용하는게 중요 +- 이상적인 액션 구조 + - 액션이 외부 세계와 상호작용하는 것을 제한 + - 내부에 계산과 데이터만 있고 가장 바깥쪽에 액션이 있는 구조 -> 18장 어니언 아키텍처 + + > 어니언 아키텍처 기대된다 + +- 함수형 프로그래머는 액션이 호출 시점과 횟수에 덜 의존하도록 만드는 기술을 적용한다 + +#### 액션의 형태 + +- 함수 호출 +- 메서드 호출 +- 생성자 + - 부르는 시점에 따라 다른 값을 가진다면 액션 +- 표현식 + - 공유 변수 라면 읽을 때마다 변경될 가능성이 있으므로 + - 변수 참조 + - 속성 참조 + - 배열 참조 +- 상태 + - 변경 가능하면 액션이다. 다른 코드에 영향을 주기 때문 + +> 전반적으로 코드를 액션, 계산, 데이터로 분리하는 과정은 예측 가능하며 유지보수 하기 쉬운 코드로 귀결된다고 생각함 \ No newline at end of file diff --git "a/\354\261\225\355\204\260_4/\354\235\264\354\234\240\355\235\254.md" "b/\354\261\225\355\204\260_4/\354\235\264\354\234\240\355\235\254.md" new file mode 100644 index 0000000..ddeaf23 --- /dev/null +++ "b/\354\261\225\355\204\260_4/\354\235\264\354\234\240\355\235\254.md" @@ -0,0 +1,130 @@ + + +1. 테스트하기 쉽게 만들기 +2. 재사용하기 쉽게 만들기 +3. 액션과 계산, 데이터를 구분하기 +4. 함수에는 입력과 출력이 있다 +1. 테스트와 재사용성은 입출력과 관련이 있다 +2. 액션에서 계산 빼내기 + + + +### 문제점 + +- `cart * 0.01` 를 테스트하기 위해서 `update_tax()`를 테스트해야 한다 + +```javascript +function update_tax(){ + set_tax(cart * 0.01) +} +``` + +- `update_tax()`에 요구사항이 추가되면 더 복잡해진다 + +- 개선 + - 테스트하기 쉽게 만들자 + - 재사용하기 쉽게 만들자 + + +### 함수형 사고로 리팩토링하기 + + +#### 액션, 계산, 데이터로 구분하기 + +- 코드를 액션, 계산, 데이터로 분류해보자 + + +#### 함수에는 입력과 출력이 있다 + +- 입력: 함수가 계산을 하기 위한 외부 정보 +- 출력: 함수 밖으로 나오는 정보나 어떤 동작 +- 함수 호출의 목적: 어떤 결과가 필요해서 + +```javascript + +var total = 0; +// 입력 +function add_to_total(amount){ + // 전역변수 읽기는 입력이다 + // 콘솔에 뭔가 찍는 것은 출력이다 + console.log("toatl :" + total); + // 전역변수를 바꾸는 것은 출력이다 + total += amount; + // 리턴값은 출력이다 + return total; +} +``` + +- 입력 + - 암묵적 입력 + - 인자 외 다른 입력 + - ex) 전역변수를 읽는 것 + - 명시적 입력 + - 인자 +- 출력 + - 암묵적 출력 + - 리턴값 외 다른 출력 + - ex) 콘솔에 찍는 것, 전역변수를 바꾸는 것 + - 명시적 출력 + - 리턴값 + +- ***함수에 암묵적 입력과 출력이 있으면 액션이 된다*** * + - 암묵적 입력과 출력은 명시적으로 바꾸자 + + + +#### 테스트와 재사용성은 입출력과 관련 있다 + +- 전역변수가 없어야 하며 의존하지 않아야 한다 +- 함수가 결괏값을 리턴해야 한다 + +> update 함수를 void로 선언하면 테스트하기 어려웠다. void에서 리턴 타입이 있게 변경하면 테스트하기 쉬워진다.
+> 근데 리턴 타입을 도메인 자체로 하면 객체가 오래 떠돌아 다닐 위험성이 있어 사이드 이펙트가 발생할듯?
+> 업데이트한 속성의 결과 값을 원시형으로 리턴하거나 래퍼 또는 vo를 생성해서 리턴하는게 나을까?
+ + +> 생각해보기 +> 동작을 유지하면서 코드를 바꾸는 것은 어떤 장점이 있을까?
+> 동작을 유지하면서 코드를 바꾸면 코드 변경의 사이드 이펙트 없이 수정하는 것이라 위험 부담이 줄어든다.
+> 리팩토링한 코드가 기존 동작대로 동작하는게 검증되면 구조를 바꾸거나 패턴으로 추상화 하면서 점진적 개선이 가능하지 않을까나 + + + +#### 액션에서 계산 빼내기 + +- 액션에서 계산에 해당하는 코드를 분리한다 +- 입력값은 인자로 출력값은 리턴값으로 바꾼다 + +```javascript +// 암묵적 출력 명시적으로 변경하기 + +// 개선 전 +function calc_cart_total(){ + // calc_total() 내부에서 전역변수를 갱신하는 코드는 암묵적 출력이다 + calc_total(); +} +// 개선 후 +function calc_cart_total(){ + // calc_total()의 리턴값은 이제 명시적 출력이다 + shopping_cart_total = calc_total(); +} +``` + + + +```javascript +// 암묵적 입력 명시적으로 변경하기 + +// 개선 전 +function calc_cart_total(){ + // calc_total() 내부에서 전역변수나 객체 프로퍼티를 읽는 코드는 암묵적 입력 + calc_total(); +} +// 개선 후 +function calc_cart_total(){ + // calc_total(shopping_cart) 인자로 입력하면 명시적 입력이다 + shopping_cart_total = calc_total(shopping_cart); +} +``` + +> \ No newline at end of file