기능적 핵심, 명령형 쉘

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

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

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

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

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

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

    순전히 기능적인 언어는 디자인(예: 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는 외부 명령형 셸을 나타내는 표현형 요청 처리기 함수입니다. 여기에서 원하는 거의 모든 작업을 수행할 수 있습니다. 일반적으로 먼저 데이터를 어딘가에서 가져온 다음(불순한 부분) 데이터를 변환(순수한 부분)한 다음 결과를 보내야 합니다(불순한 부분).

    기능적 핵심


    transformDatarender는 순수 함수입니다. 기능 코어를 호출하기 전에 필요한 모든 데이터를 준비해야 합니다. 이러한 함수는 매개변수에서 가져올 항목만 사용하기 때문입니다.

    이 예는 임의적이지만 이해하는 데 도움이 되는 몇 가지 사항은 다음과 같습니다.
  • transformData 함수는 렌더링을 위해 가져온 데이터를 변환(정규화 및 준비)합니다. 반환된 데이터를 ViewModel의 형식으로 볼 수 있습니다. 데이터는 보기에 필요한 방식으로 구성되며 외부 데이터 형식이 변경되면 매핑 기능만 변경하면 됩니다
  • .
  • render 함수는 해당 모델을 가져와서 렌더링된 html 문자열을 반환합니다. html 부분을 반환하는 다른 순수 함수를 호출할 수 있습니다(예: 구성 요소 또는 부분 보기의 개념과 유사)
  • .

    보시다시피 아이디어 자체는 매우 간단하지만 해결하려는 문제의 특성에 따라 약간의 노력이 필요할 수 있습니다. 즉, IO가 많은 코드는 이런 방식으로 구성하기가 더 어렵습니다.



    참고: 이것은 BetterWays.dev wiki 의 위키 페이지 스냅샷입니다. 최신(더 나은 형식) 버전은 betterways.dev/functional-core-imperative-shell 에서 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기