기능적 파이프라인 예
메서드 체이닝(MC) 대 기능적 파이프라이닝(FP)
MC 대 FP에 대한 참고 사항
두 접근 방식은 매우 유사합니다. MC를 더듬을 수 있다면 FP 접근도 더듬을 수 있습니다.
MC 단점:
FP 전문가:
filterNotStartsWith
에서 excludeComments
까지 추상화할 수 있도록 args를 취하는 2개의 함수가 있습니다. 또한 replaceByRegex
에서 replaceNewlineWithDoubleAmpersand
로 . 그다지 인기 있는 동작이 아니기 때문에 이 작업을 수행하지 않았지만 FP 파이프라인은 훨씬 더 유창하게 읽을 수 있습니다. 소스 코드 예제
파이프베이스
/*
@func
a non-typed pipe
- that can dynamically handle sync or async funcs
@usage
this is a util func of the typed pipe funcs
@param {...Function} fns - one or more funcs spread to an arr of funcs
@return {(v: *) => *} - the first func in the pipe takes in any data, and the last func returns any data
*/
export const pipeBase = (...fns) => v => {
return fns.reduce((r, fn) => { // r = result or output of fn call
if (isPromise(r)) {
return r.then(fn);
}
return fn(r);
}, v);
};
파이프Str
/**
@func
a strongly-typed pipe that is invoked with a supplied str
@clientcode
const p1 = pipeStr(f1, f2, f3);
p1("");
@param {...Function} fns
@return {(s: string) => *}
*/
export const pipeStr = (...fns) => s => throwIfNotStr(s) || pipeBase(...fns)(s);
1.
/**
@func
split by \n chars
@notes
use forceSingleNewline() beforehand if str contains multiple blank lines in a row
@param {string} s
@return {string[]}
*/
export const splitByNewline = s => s.trim().split("\n");
2.
/**
@func
trim each str in arr of strs
@notes
if the elem is a str, trim it
- otherwise leave it as is
@param {string[]} a
@return {string[]}
*/
export const mapTrim = a => a.map(s => isStr(s) ? s.trim() : s);
삼.
/**
@func
only remove empty str elems in an arr
@notes
applies trim() before comparing
@param {string[]} a
@return {string[]} arr with empty elems removed
*/
export const filterOutEmptyStrs = a => a.filter(s => isNotEmptyStr(s));
4.
/**
@func complement
from the supplied arr, remove the elems that start with the supplied str chunk
@param {string} chunk
@return {(a: string[]) => string[]}
*/
export const filterNotStartsWith = chunk => a => fil(s => !s.startsWith(chunk), a);
5.
/**
@func
make a single str where each elem is placed on a new line
@param {string[]} a
@return {string} concatentated
*/
export const joinByNewLine = a => a.join("\n");
6.
/*
@func
replace a substring with another substring in a haystack of text
@cons
use the g flag to remove all matches
- otherwise it will just replace the first and return
case sensitive
@param {RegExp} n needleRegex
@param {string} r replacement
@return {(h: string) => string} // haystack -> a copy of the haystack with the needles replaced with the new values
*/
export const replaceByRegex = (n, r) => h => h.replace(n, r);
최종 FP 파이프라인 사용
/**
@func util
supply a template string of bash commands
- and return the logged output
@param {string} a line-separated chain of bash commands
@return {string} chain of commands separated by &&
*/
export const chainCmds = pipeStr(
splitByNewline,
mapTrim,
filterOutEmptyStrs,
filterNotStartsWith("//"), //exclude comments
joinByNewLine,
replaceByRegex(/\n/g, " && "), lStr,
);
기능 사용 예
lBashExecChain(`
pwd
git config -l --local
git show-branch
git status
git stash list
git stash --include-untracked
git pull
git stash pop
lerna bootstrap
`);
최종 노트
추신
질문이 있으시면 알려주세요.
Reference
이 문제에 관하여(기능적 파이프라인 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/functional_js/a-functional-pipeline-example-2n8e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)