기능적 핵심, 명령형 쉘
순수 함수는 다음을 수행하는 함수입니다.
참조 투명 - 항상 동일한 입력에 대해 동일한 출력을 반환합니다.
부작용이 없습니다 - 외부 세계에 영향을 미치지 않습니다
이는 우리에게 많은 이점(참조 투명성, 단위 테스트, 추론하기 더 쉬움)을 제공하며 가능한 한 많은 기능을 순수 기능으로 분할해야 하지만 어떻게 도달할 수 있습니까?
우리가 거기에 도달하는 데 도움이 될 수 있는 한 가지 기술은 "기능적 핵심, 명령형 셸"입니다. 이름에서 알 수 있듯이 아이디어는 효과적이고 명령적인 코드를 외부 셸로 분리하고 내부 코어를 순수(기능적 코어)로 유지하는 것입니다.
순전히 기능적인 언어는 디자인(예: IO 모나드)으로 인해 이러한 방향으로 유도하지만 거의 모든 프로그래밍 언어에서 이 기술을 사용하고 이점을 얻을 수 있습니다.
이 가이드를 읽고 있다면 최소한 JavaScript를 알고 있을 가능성이 높습니다. 그래서 우리는 그것으로 갈 것입니다.
어떤 면에서 자바스크립트는 우리를 이런 방향으로 인도하기도 합니다. 비동기 함수를 사용했을 것입니다. 일반적으로 콜백이나 약속보다 직접 사용하는 것이 더 좋지만 코드베이스의 나머지 부분과 잘 어울리지 않는다는 것을 곧 깨닫게 됩니다. 약속 내부의 값은 일반 값과 매우 다르며 약속을 반환하는 함수는 일반 기능과 다릅니다.
이것은 중요한 부분입니다. 코드베이스 전체에서 이 두 가지 개념을 혼합(및 프로세스의 거의 모든 것을 감염)하는 대신 비동기(그리고 불순한) 항목을 외부 셸로 가져와 격리하여 코어를 훌륭하고 깨끗하게 유지할 수 있도록 하는 아이디어입니다. .
다음은 express.js와 유사한 것을 사용한 적이 있다면 친숙해 보일 매우 간단한 예입니다.
// imperative shell
async function handler(req, res) {
var users = await fetchUsers()
var projects = await fetchProjects()
var result = render(transformData(users, projects))
res.send(result)
}
// functional core
function transformData(users, projects) {}
function render(model) {}
따라서 두 부분이 있습니다.
명령형 쉘
handler
는 외부 명령형 셸을 나타내는 표현형 요청 처리기 함수입니다. 여기에서 원하는 거의 모든 작업을 수행할 수 있습니다. 일반적으로 먼저 데이터를 어딘가에서 가져온 다음(불순한 부분) 데이터를 변환(순수한 부분)한 다음 결과를 보내야 합니다(불순한 부분).기능적 핵심
transformData
및 render
는 순수 함수입니다. 기능 코어를 호출하기 전에 필요한 모든 데이터를 준비해야 합니다. 이러한 함수는 매개변수에서 가져올 항목만 사용하기 때문입니다.이 예는 임의적이지만 이해하는 데 도움이 되는 몇 가지 사항은 다음과 같습니다.
transformData
함수는 렌더링을 위해 가져온 데이터를 변환(정규화 및 준비)합니다. 반환된 데이터를 ViewModel의 형식으로 볼 수 있습니다. 데이터는 보기에 필요한 방식으로 구성되며 외부 데이터 형식이 변경되면 매핑 기능만 변경하면 됩니다render
함수는 해당 모델을 가져와서 렌더링된 html 문자열을 반환합니다. html 부분을 반환하는 다른 순수 함수를 호출할 수 있습니다(예: 구성 요소 또는 부분 보기의 개념과 유사)보시다시피 아이디어 자체는 매우 간단하지만 해결하려는 문제의 특성에 따라 약간의 노력이 필요할 수 있습니다. 즉, IO가 많은 코드는 이런 방식으로 구성하기가 더 어렵습니다.
참고: 이것은 BetterWays.dev wiki 의 위키 페이지 스냅샷입니다. 최신(더 나은 형식) 버전은 betterways.dev/functional-core-imperative-shell 에서 찾을 수 있습니다.
Reference
이 문제에 관하여(기능적 핵심, 명령형 쉘), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/betterways/functional-core-imperative-shell-4fde텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)