Frontend/함수형 코딩 스터디

[함수형코딩] chapter 1 , 2 , 3 정리본

<zinny/> 2023. 6. 6. 23:47
728x90

chaper 1 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다 

 

함수형 프로그래밍은 무엇인가요?

  1. 수학함수를 사용하고 부수효과를 피하는 것이 특징인 프로그래밍 패러다임
  2. 부수효과 없이 순수함수만 사용하는 프로그래밍 

부수 효과 : 함수가 리턴값 이외에 하는 모든 일

순수 함수 : 인자에만 의존하고 부수 효과가 없는 함수로 같은 인자를 넣으면 항상 같은 결과를 돌려주는 함수로 수학 함수라고 하기도 함 

 

 

하지만 부수 효과는 필요하고, 함수형 프로그래밍은 부수 효과를 잘 다룰 수 있고, 실용적입니다

 

액션과 계산 데이터 구분하기 

함수형 프로그래머는 코드를 액션과 계산 데이터로 구분합니다. 

 

액션 계산 데이터
- 실행 시점과 횟수에 의존합니다. 
- 부수효과, 부수효과가 있는 함수, 순수하지 않은 함수 라고 부르기도 합니다. 


예) 이메일 보내기, 데이터 베이스 읽기 

- 입력으로 출력을 계산합니다. 
- 순수 함수, 수학함수라고도 합니다. 

예) 최댓값 찾기, 이메일 주소가 올바른지 확인하기
- 이벤트에 대한 사실 
- 일어난 일에 대한 결과를 기록한 것 
- 숫자나 문자 배열 객체 같은 것 

예) 사용자가 입력한 이메일 주소

 

액션과 계산 데이터를 구분하면 좋은 점 

여러 컴퓨터가 네트워크를 통해 통신하기 시작하면 소프트웨어가 복잡해집니다. 시간에 따라 바뀌는 값을 모델링할 때 동작 방법을 이해하는 것은 중요하지만 쉽지 않게 됩니다. 실행 시점이나 횟수에 의존하는 코드를 없애면, 코드를 더 쉽게 이해할 수 있게 됩니다

 

chapter1에서는 함수형 프로그래밍이 무엇인지 예시를 통하여 짧게 설명하고, 액션과 계산 데이터의 기본 구조를 설명하고 있습니다.

 


capter2 현실에서의 함수형 사고

 

함수형 프로그래밍을 적용 하기 위해서는 함수형 사고방식을 통해서 1. 액션, 계산, 데이터로 코드를 분리하고 2. 일급추상 방법을 피자집에 대한 예시로 설명 하고 있습니다

 

계층화 설계 맛보기

자주 바뀌지 않는 것을 하위 계층으로 두고 자주 바뀌는 것을 상위 계층으로 둬야 합니다.

각 계층은 그 아래에 있는 계층을 기반으로 만들어집니다 

가장 위에 있는 코드는 의존성이 거의 없어 쉽게 바꿀수 있습니다.

아래에 있는 코드들은 위에 있는 코드들 보다 의존성이 많아 바꾸기 어렵지만 자주 바뀌지 않습니다.

비즈니스 규칙, 도메인 규칙, 기술 스택 계층으로 구분합니다. 

계층형 설계로 만든 코드는 테스트, 재사용, 유지보수가 쉽습니다.

 

타임라인 다이어그램

액션이 시간 순서에 따라 어떻게 실행되는지 볼 수 있습니다. 

액션은 실행 시점에 의존하기 때문에 실행 순서가 중요합니다. 

분산 시스템을 사용해서 타임라인을 시각화할 수 있습니다. 

문제를 파악 하는데 도움은 되었지만 실행 순서가 섞이는 것은 피할 수 없습니다 

또한 타임라인을 서로 맞추지 않은 분산 시스템은 예측 불가능한 순서로 실행되게 됩니다. 

 

타임라인 커팅

여러 타임라인이 동시에 진행될 때 서로의 순서를 맞추는 방법입니다. 

고차 동작(고차 함수로 만든 동작)으로 구현합니다. 

타임라인은 독립적으로 동작하고 작업이 완료되면 다른 타임라인이 끝나기를 기다리게 됩니다. 

 

타임라인 커팅으로 서로 다른 작업을 쉽게 이해할 수 있습니다. 

타임라인 다이어그램을 사용하면 시간에 따라 진행하는 작업을 쉽게 이해할 수 있습니다.

 

chapter2에서는 피자 가게의 예시를 통해서 계층화 설계와 , 타임라인 다이어그램, 타임라인 커팅을 사용해서 작업에 대한 이해도를 높이는 방식에 대해 설명하였습니다.

capter3 액션과 계산, 데이터의 차이를 알기

 

함수형 프로그래머는 최대한 액션에서 계산을 빼내려고 노력하고, 계산에서는 데이터를 분리할 수 있는지 생각 해야 합니다.

더 나아가서 액션이 계산이 될 수 있는지, 계산은 데이터가 될 수 있는지 고민해야 합니다.

액션은 시간에 의존하기 때문에 숨어있는 액션까지 찾아내야 합니다.

 

데이터

  • 이벤트에 대한 사실, 일어난 일의 결과를 기록한 것입니다. 
  • JS에서는 숫자, 문자, 배열, 객체 같은 것을 의미 합니다.
  • 데이터 구조에 의미를 담을 수 있는데 예를 들어 목록의 순서가 중요하다면 순서를 보장하는 데이터 구조를 사용하면 됩니다.
  • 데이터 구조로 도메인을 표현할 수 있습니다.
  •  불변 데이터 구조를 만들기 위해 두 가지 원칙을 사용합니다. <얕은 복사> <깊은 복사>
  • 데이터는 데이터 그대로 이해할 수 있습니다.
  • 직렬화된 데이터는 전송하거나 디스크에 저장했다가 읽기 쉽습니다. 
  • 데이터는 서로 동일성 비교가 쉽습니다. 
  • 데이터는 여러 가지 방법으로 해석 가능해 자유로운 해석이 가능합니다. 
카피-온-라이트 : 얕은 복사 -> 변경할 때 복사본을 만들기
방어적 복사 : 깊은 복사 -> 보관하려고 하는 데이터의 복사본을 만들기

 

계산

  • 순수함수, 수학함수라고 불립니다.
  • 입력값으로 출력값을 만드는 것입니다.
  • 실행 시점과 횟수에 관계없이 항상 같은 입력값에 대해 같은 출력값을 돌려줍니다. 
  • 계산은 함수로 구현합니다.
  • 계산에는 연산을 담을 수 있습니다. 
  • 계산은 언제 어디서나 원하는 만큼 데스트를 실행할 수 있어서 액션보다 좋습니다. 
  • 기계적인 분석이 쉽습니다. 
  • 계산은 조합하기 좋습니다. 계산 조합을 통해서 더 큰 계산을 만들 수 있습니다. ( 일급 계산)
  • 계산을 쓰면서 동시에 실행되는 것, 과거에 실행되었던 것이나 미래에 실행할 것, 실행 횟수는 걱정하지 않아도 됩니다. 
  • 액션보다 계산이 읽기 쉽고 무엇을 하는지 이해하기도 쉽습니다. 
  • 하지만 실행하기 전에 어떤 일이 발생할지 알 수 없다는 단점이 있습니다

 

액션

  • 순수하지 않은 함수(impureF), 부수 효과 함수(side-effectingF), 부수 효과가 있는 함수 (Fwith side effects)라고도 합니다. 
  • 외부 세계에 영향을 주거나 받는 것을 말합니다. 
  • 실행 시점과 횟수에 의존합니다. 언제 실행되는지, 얼마나 실행되는지 
  • 액션은 함수로 구현합니다. -> 함수형 사고를 통해서 계산과 액션을 구분해야 합니다. 
  • 액션은 다루기 힘들지만 꼭 사용해야 합니다. 
  • 가능한 액션은 적게 사용하며 액션 대신 계산을 사용할 수 있는지 생각해봐야 합니다. 
  • 액션은 가능한 작게 만드는 게 좋습니다. 
  • 액션이 외부 세계와 상호작용하는 것을 제한할 수 있습니다. 내부에 계산과 데이터만 있고 가장 바깥쪽에 액션이 있는 구조가 이상적입니다. 
  • 액션이 호출되는 시점에 의존하는 것을 제한해야 합니다.

액션의 다양한 형태

// 함수 호출 (팝업 창이 뜨는 것은 액션)
    alert("Hello world");
    
// 메서드 호출
    console.log("hello");
    
// 생성자 (부르는 시점에 따라 다른 값을 가지기 때문에)
    new Date();
    
// 표현식 - 변수 참조 (y가 공유되고 변경 가능한 변수라면 읽는 시점에 따라 값이 다를 수 있다)
	y
    
// 표현식 - 속성 참조 (user가 공유되고 변경 가능한 객체라면 읽는 시점에 따라 값이 다를 수 있다.)
    user.first_name
    
// 표현식 - 배열 참조 (stack이 공유되고 변경 가능한 배열이라면 첫번째 항목은 읽는 시점에 따라 값이 다를 수 있다.)
    stack[0]
    
// 상태 - 값 할당 (공유하기 위해 값을 할당했고 변경 가능한 변수라면 다른 코드에 영향을 주기 때문에 액션이다.)
	z = 3
    
// 상태 - 속성 삭제 (속성을 지우는 것은 다른 코드에 영향을 주기 때문에 액션이다.)
    delete user.first_name;

 

chapter3에서는 데이터와 계산 액션의 보다 명확한 차이점에 대해 설명하고, 다양한 예시를 통해서 세 가지를 구분하는 것에 대해 설명하였습니다.
728x90