JavaScript의 유틸리티 함수 프로그래밍 - 부작용 및 순도
안녕하세요.🌍. 제 함수 프로그래밍 시리즈의 n기: 자바스크립트의 실용적인 함수 프로그래밍을 읽었습니다.이 아름다운 날에 나는 두 가지 방법을 합쳐 문제를 해결하고 생활을 간단하게 할 것이다. 부작용과 순수함이다.
순도를 이야기합시다.함수에 다음 속성이 있으면 순수 함수라고 합니다.
A side effect refers simply to the modification of some kind of state - for instance:
- Changing the value of a variable;
- Writing some data to disk;
- Enabling or disabling a button in the User Interface.
여기에 또 부작용의 예가 있다
부작용이 가득한 세계에서 기능 프로그래머로서 당신의 목표는 이러한 부작용을 프로그램의 경계로 격리시키는 것이다.부작용을 분리하면 순도가 발휘된다.본질적으로 말하자면 순도는 데이터 흐름과 관련이 있다. 예를 들어 데이터가 어떻게 한 프로세스에서 다른 프로세스로 전환되는지.부작용과 대비되며 부작용은 외부 일만 하는 것과 관련이 있다.부작용과 순도에 따라 프로그래밍 관심사를 분리하면 코드의 구조가 더욱 뚜렷해진다.
이것은 불순함수
add10
입니다.let numCalls = 0
const add10 = number => {
console.log('add10 called with', number)
numCalls += 1
console.log('add10 called', numCalls, 'times')
return number + 10
}
add10(10) /*
> add10 called with 10
> add10 called 1 times
> 20
*/
add10
로그아웃 콘솔, 변이 변수numCalls
와 다시 로그아웃하는 부작용이 있다.콘솔 로그는 콘솔을 로그아웃하고 외부 세계에 존재하기 때문에 부작용이다add10
.점증numCalls
도 부작용이다. 같은 스크립트의 변수를 인용했지만 add10
의 범위를 넘어섰기 때문이다.add10
불순하다.컨트롤러 로그와 변수 변이를 없애면 순수
add10
를 얻을 수 있다.let numCalls = 0
const add10 = number => number + 10
console.log('add10 called with', 10) // > add10 called with 10
numCalls += 1
console.log('add10 called', numCalls, 'times') // > add10 called 1 times
add10(10) // > 20
아, 달콤한 순수함.현재add10
는 순수하지만 우리의 부작용은 모두 엉망이다.만약 우리가 이 문제를 해결하고 싶다면, 우리는 고급 함수 프로그래밍 함수의 도움을 필요로 한다.함수 프로그래밍 라이브러리에서 이러한 함수를 찾을 수 있습니다. 예를 들어 rubico, True로 작성된, Ramda 또는 RxJS 등입니다.라이브러리를 사용하지 않으려면 vanilla JavaScript에서 이 함수의 자체 버전을 실행할 수 있습니다.예를 들어 우리가 사용할 함수의 최소 버전
pipe
과 tap
을 다음과 같이 실현할 수 있습니다.const pipe = functions => x => {
let y = x
for (const f of functions) y = f(y)
return y
}
const tap = f => x => { f(x); return x }
우리는 그것들을 사용하여 부작용과 순도에 대한 사고를 간소화할 것이다.파이프는 일련의 함수를 받아들여 연결시키고 이전 함수의 출력으로 다음 함수를 호출합니다.
pipe
이런 방식으로 데이터 흐름을 만들었기 때문에 우리는 그것으로 순도를 고려할 수 있다.pipe's documentation 에서 실행 가능한 예시를 찾을 수 있습니다.tap는 단일 함수를 받아들여서 전달된 모든 입력을 항상 되돌려줍니다.한 함수에서
tap
을 사용할 때, 당신은 기본적으로 "이 함수의 반환에 관심이 없다. 입력으로 함수를 호출하고 나의 입력을 되돌려주기만 하면"이라고 말한다.부작용에 매우 유용하다.tap's documentation 에서 실행 가능한 예시를 찾을 수 있습니다.pipe
과tap
의 부작용을 계산한다.만약 이 예가 좀 낯설어 보인다면, 나의 이전 문장을 참고하세요.const logCalledWith = number => console.log('add10 called with', number)
let numCalls = 0
const incNumCalls = () => numCalls += 1
const logNumCalls = () => console.log('add10 called', numCalls, 'times')
const add10 = number => number + 10
pipe([
tap(logCalledWith), // > add10 called with 10
tap(incNumCalls),
tap(logNumCalls), // > add10 called 1 times
add10,
])(10) // > 20
우리는 자신의 함수logCalledWith
, incNumCalls
, logNumCalls
에서 컨트롤러 로그와 변수 돌연변이 부작용을 정의하여 프로그램의 경계로 격리시켰다.우리는 또 이전의 순수 add10
함수를 보존했다.최종 프로그램은 부작용 함수와 순수 함수로 구성되어 명확한 관심사 분리를 가지고 있다.pipe
를 통해 우리는 데이터 흐름을 볼 수 있다.사용tap
, 부작용을 지정하고 격리합니다.이것은 조직적이다.부작용과 순결을 통해 문제를 해결하면 생활이 수월해진다.오늘 저는 여러분께 컨트롤러 로그가 필요하다면tap을 사용하라는 경험칙을 남겨 드리겠습니다.
다음에 나는
map
,filter
과reduce
를 사용하여 데이터 전환을 깊이 연구할 것이다.읽어주셔서 감사합니다!너는 루비코awesome resources에서 이 시리즈의 나머지 부분을 찾을 수 있다.다음에 뵙겠습니다. JavaScript 유틸리티 함수 프로그래밍 - 변환 소개
Reference
이 문제에 관하여(JavaScript의 유틸리티 함수 프로그래밍 - 부작용 및 순도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/richytong/practical-functional-programming-in-javascript-side-effects-and-purity-1838텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)