기능적 핵심, 명령형 쉘

기본적인 함수형 프로그래밍 개념에 어느 정도 익숙하다고 가정하겠습니다.

순수 함수는 다음을 수행하는 함수입니다.

  • 참조 투명 - 항상 동일한 입력에 대해 동일한 출력을 반환합니다.

  • 부작용이 없습니다 - 외부 세계에 영향을 미치지 않습니다

  • 이는 우리에게 많은 이점(참조 투명성, 단위 테스트, 추론하기 더 쉬움)을 제공하며 가능한 한 많은 기능을 순수 기능으로 분할해야 하지만 어떻게 도달할 수 있습니까?

    우리가 거기에 도달하는 데 도움이 될 수 있는 한 가지 기술은 "기능적 핵심, 명령형 셸"입니다. 이름에서 알 수 있듯이 아이디어는 효과적이고 명령적인 코드를 외부 셸로 분리하고 내부 코어를 순수(기능적 코어)로 유지하는 것입니다.

    순전히 기능적인 언어는 디자인(예: 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 에서 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기