If - 절차적, 기능적, 객체 지향

if 문에 대해 이야기합시다. 많은 사람들이 이것을 프로그래밍의 초석으로 봅니다. 예를 들어 CSS가 프로그래밍 언어인지 아닌지(그것은) 질문에 대해 논의할 때마다 누군가는 "CSS에는 if 문이 없으므로 PL로 간주할 수 없습니다."이 아이디어가 어디서 나오는지 모르겠습니다. if 문은 goto, 점프, 예외, 루프 등과 같은 많은 제어 흐름 구조 중 하나입니다.

절차적


if의 가장 잘 알려진 형식은 "절차적"또는 structured 형식이라고 생각합니다.

if (condition) {
  thenAction();
} else {
  elseAction();
}

"절차적"이란 명령형 프로그래밍 유형을 의미하지만 단순한 Von Neumann 기계보다 더 조직적입니다. (명령형 프로그래밍은 기계에 직접 지시를 내릴 때 1단계, 2단계 등을 수행하는 것입니다.)

정확한 정의 대신 예를 들어 보겠습니다.
  • 대부분의 명령형 언어: 어셈블리(기계어 코드), 포트란.
  • 덜 명령적인 언어, 이른바 "절차적"또는 structured ): Algol, Pascal(Go도 마찬가지일 것 같습니다).

  • 기능의



    기능적 스타일로 구현if하려면 다음과 같이 기능으로만 제한해야 합니다.

    // Implementation:
    const True = (x) => (y) => x;
    const False = (x) => (y) => y;
    const If = (condition, thenAction, elseAction) => {
      const action = condition(thenAction)(elseAction);
      return action();
    }
    // Usage:
    If(condition, thenAction, elseAction);
    

    이 아이디어는 람다 미적분에서 Church Encoded True , False를 직접 번역한 것입니다.

    True = λx.λy.x
    False = λx.λy.y
    

    객체 지향



    기능적 스타일로 구현if하려면 객체로만 제한해야 합니다.

    // Implementation:
    class TrueClass {
      Then(callBack) {
        callBack.call()
        return this
      }
      Else(callBack) {
        return this
      }
    }
    class FalseClass {
      Then(callBack){
        return this
      }
      Else(callBack){
        callBack.call()
        return this
      }
    }
    const True = new TrueClass();
    const False = new FalseClass();
    // Usage:
    // const condition = True or False
    condition.Then(thenAction).Else(elseAction)
    

    결론



    실제로 많은 OOP와 FP languages은 절차적 스타일if을 사용합니다(그것 없이도 벗어날 수 있습니다).

    내가 이러한 예를 제시한 이유는 "순수한"FP 및 OOP 구현을 보여 주어 비교할 수 있도록 하기 위함입니다. 전체 그림을 보려면 OOP 예제가 SmallTalk 스타일이고 SmallTalk는 Scheme에서 약간의 영감을 얻었으며 이는 차례로 람다 미적분¯\_(ツ)_/¯의 아이디어를 사용합니다. 어떤 사람들은 "순수한"OOP의 정의를 SmallTalk로 주장할 것입니다. 다른 기사로 넘어가겠습니다.

    Photo by Tom Parsons on Unsplash

    좋은 웹페이지 즐겨찾기