728x90
chapter 10-11 일급 함수
함수 이름에 암묵적 인자가 있는 코드의 특징
- 함수 구현이 거의 똑같은 함수
- 함수 이름이 구현의 차이를 만들고 있는 함수
리팩터링 해보기 : 암묵적 인자를 드러내기
- 함수 이름에 있는 암묵적 인자를 확인합니다.
- 명시적 인자를 추가합니다.
- 함수 본문에 하드 코딩된 값을 새로운 인자로 바꿉니다.
- 함수를 호출하는 곳을 고칩니다.
//기존 setPriceByName 함수를 어떤 필드 값이든 사용 할 수 있도록 변경
function setFieldByName(cart, name, field, value){
//field : 명시적 인자 추가, value : 기존 인자는 더 일반적인 이름으로 변경
const item = cart[name];
const newItem = objectSet(item, field, value);
const newCart = objectSet(cart, name, newItem);
return newCart
}
function objectSet(object, key, value){
let copy = Object.assign({}, object);
copy[key] = valuel
return copy
}
//호출하는 곳
cart = setFieldByName(cart, "shoe", 'price', 13);
일급값 (First-class valu)
값을 다른 변수에 할당하거나, 함수의 인자로 전달할 수 있는 값을 의미합니다.
- 변수에 할당하기 즉 값을 변수에 넣어서 사용할 수 있습니다.
- 함수의 인자로 넘기기, 함수에 일급 값이 전달되면 함수에서 해당 값을 사용할 수 있습니다.
- 함수의 리턴값으로 받기, 함수의 실행 결과로써 일급 값이 리런 될 수 있습니다
- 배열이나 객체에 담기 , 객체 배열 등에 데이터 구조에 저장될 수 있습니다.
일급인 것과 일급이 아닌 것을 구별하기
- 일급인 것 : 문자열, 숫자, 불리언 값, 배열, 객체, 함수
- 일급이 아닌 것 : 수식연산자, 반복문, 조건문, try/catch 블록..
일급이 아닌 것을 찾고 일급으로 바꾸는 과정에서 문제를 해결할 수 있는 새로운 능력을 얻을 수 있게 되어 두 가지를 구분하는 것이 중요합니다.
필드명을 문자열로 사용하면 버그가 생기지 않을까요?
문제를 해결하는데 두 가지의 방법이 있습니다.
- 컴파일 타임에 검사하는 것 : 정적 타입 시스템에서 사용 할 수 있으며, 타입 시스템을 사용하면 됩니다.
- 런타임에 검사하는 것 : 함수를 실행할 때마다 동작하게 해서 전달한 문자열이 올바른 문자열인지 확인 하도록 합니다.
연습문제
//연습문제 2
funtion incremetnFieldByName(cart, name, field){
const item = cart[name];
const value = item[field]
const newValue = value + 1;
const newItem = objectSet(item, field, newValue);
return objectSet(cart, name, newItem)
}
데이터 지향(data orientation) : 이벤트와 엔티티에 대한 사실을 표현하기 위해 일반 데이터 구조를 사용하는 프로그래밍 형식
정적 타입 vs 동적 타입
정적 타입 (Static typing)
- 정적 타입은 변수의 데이터 타입을 컴파일 시점에 결정하며, 변수의 타입을 명시적으로 선언해야 합니다.
- 컴파일러가 코드를 분석하면서 변수의 타입을 검사하고, 타입이 맞지 않으면 컴파일 오류를 발생시킵니다
- 정적 타입 언어에서는 변수의 타입이 미리 정해지므로 타입 관련 버그가 줄어들고, IDE나 툴에서 더 정확한 코드 분석과 코드 완성 기능을 제공할 수 있습니다.
- 대표적인 정적 타입 언어로는 C, C++, Java, C#, TypeScript 등이 있습니다.
function add(a: number, b: number): number {
return a + b;
}
const result: number = add(2, 3); // 타입이 정적으로 검사되고 result는 number 타입
동적 타입 (Dynamic typing)
- 동적 타입은 변수의 데이터 타입을 런타임 시점에 결정하며, 변수를 선언할 때 타입을 명시적으로 선언할 필요가 없습니다.
- 변수에 할당되는 값에 따라 자동으로 타입이 결정되며, 런타임 중에도 변수의 타입이 변경될 수 있습니다.
- 동적 타입 언어는 유연성이 높고 개발자가 타입을 명시적으로 관리할 필요가 없으나, 코드 실행 시점에서 타입 오류가 발생할 수 있습니다.
- 대표적인 동적 타입 언어로는 JavaScript, Python, Ruby, PHP 등이 있습니다.
function add(a, b) {
return a + b;
}
const result = add(2, 3); // 변수 result는 런타임 시점에 동적으로 결정됨
리팩터링 해보기 : 함수 부분을 콜백으로 바꾸기
- 본문과 본문의 앞부분과 뒷부분을 구분합니다.
- 전체를 함수로 빼냅니다
- 본문 부분을 빼낸 함수의 인자로 전달한 함수로 바꿉니다.
function withLogging(f){
try{
f();
}
catch(error){
logToSnapErrors(error)
}
}
withLogging(()=>saveuserData(user));
함수를 정의하는 방법
- 전역으로 정의하기
- 지역적으로 정의하기
- 인라인으로 정의하기 : 함수를 변수 같은 곳에 정의하지 않고 쓰는 곳에서 바로 정의하는 방법으로 익명함수라고도 합니다.
//전역으로 정의하기
function saveCurrentUserData(){
saveUserData(user)
}
withLogging(saveCurrentUserData)
//지역적으로 정의하기
function someFunction(){
let saveCurrentUserData = () => saveUserData(user);
withLogging(saveCurrentUserData);
}
//인라인으로 정의하기
withLogging(()=> saveUserData(user))
카피-온-라이트 함수를 함수 본문을 콜백으로 바꾸기 리팩터링 적용 해보기
//기존 코드
function arraySet(array, idx, value){
let copy = array.slice();
copy[idx] = value;
return copy
}
- 함수 빼내기
function withArrayCopy(array){
let copy = array.slice();
copy[idx] = value;
return copy
}
- 콜백 빼내기
function arraySet(array, idx, value){
return withArrayCopy(arrat, (copy) => copy[idx] = value)
}
function withArrayCopy(array, modify){
let copy = array.slice();
modify(copy);
return copy;
}
728x90
'FE > 함수형 코딩 스터디' 카테고리의 다른 글
[함수형코딩] chapter 8 , 9 정리본 (0) | 2023.06.25 |
---|---|
[함수형코딩] chapter 4 , 5 정리본 (0) | 2023.06.11 |
[함수형코딩] chapter 1 , 2 , 3 정리본 (0) | 2023.06.06 |