FE/함수형 코딩 스터디

[함수형코딩] chapter 10 , 11 정리본

<zinny/> 2023. 7. 2. 20:51
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)

값을 다른 변수에 할당하거나, 함수의 인자로 전달할 수 있는 값을 의미합니다. 

  1. 변수에 할당하기 즉 값을 변수에 넣어서 사용할 수 있습니다. 
  2. 함수의 인자로 넘기기, 함수에 일급 값이 전달되면 함수에서 해당 값을 사용할 수 있습니다. 
  3. 함수의 리턴값으로 받기, 함수의 실행 결과로써 일급 값이 리런 될 수 있습니다 
  4. 배열이나 객체에 담기 , 객체 배열 등에 데이터 구조에 저장될 수 있습니다.

 

일급인 것과 일급이 아닌 것을 구별하기 

  • 일급인 것 : 문자열, 숫자, 불리언 값, 배열, 객체, 함수 
  • 일급이 아닌 것 : 수식연산자, 반복문, 조건문, 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));

 

함수를 정의하는 방법

  1. 전역으로 정의하기 
  2. 지역적으로 정의하기
  3. 인라인으로 정의하기 : 함수를 변수 같은 곳에 정의하지 않고 쓰는 곳에서 바로 정의하는 방법으로 익명함수라고도 합니다.
//전역으로 정의하기 
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