함수식 프로그래밍 디자인 모드: 제1부분 - 전략 모드

이 글은 함수식 프로그래밍 환경에서 디자인 모델을 활용한 시리즈의 첫 번째 부분이다.더 많은 정보를 알고 싶으시면 계속해서 제 사이트를 주목해 주십시오.

소개하다.


소프트웨어 엔지니어링(SE)의 디자인 모델(Design Patterns in Software Engineering, 약칭 SE)은 전투 테스트를 거친 방법으로 반복적으로 발생하는 시스템 설계 문제를 유연하고 재사용 가능한 방식으로 해결하는 데 자주 사용되는데, 이 책'디자인 모델: 대상 소프트웨어를 재사용할 수 있는 요소'(Design Patterns: Elements of Reusables Object Oriented Software, 4인방이 작성한 것)로 어디에도 자리를 잡을 수 없다.

현재 모든 소프트웨어 엔지니어의 책꽂이에는 이 필수 책이 있다.[ source ]
그러나 설계 모드는 일반적으로 OOP(Object Program) 방식으로 사용됩니다.많은 모델은 추상적인 클래스, 인터페이스와 다른 OOP 기능을 사용하는데 이런 기능은 함수식 프로그래밍(FP) 환경에서 의미가 없고 FP 환경에서 전체 시스템은 구체적인 클래스가 아닌 함수로 구성된다.
따라서 이것은 많은 엔지니어들에게 인지적 불일치이다. 그들은 이러한 OOP 모델을 내화하고 FP가 점점 유행하는 환경에 처해 있음을 발견했다.
이 기사와 그 다음 시리즈는 FP 환경에서 이러한 패턴을 사용하는 데 대한 설명과 예시를 제공하려고 한다.

전략 모드


GoF 책의 정책 모델은 봉인 알고리즘 가족을 변경할 수 있는 방법으로 설명되어 있으며, 실행할 때 상하문에서 서로 바꿀 수 있다.이 정의는 매우 간단할 수 있으니, 우리 그것을 분해합시다.

여기에는 다음과 같은 구성 요소가 있습니다.

  • 알고리즘 - 어떤 값을 입력으로 하고 입력에 대해 어떤 절차를 수행하며 출력을 만드는 과정이다.

  • 전략 - 모든 알고리즘으로 이루어진 유니버설 인터페이스.

  • 상하문 - 실행 중인 환경이나 부모 프로세스가 주어진 조건에서 서로 다른 알고리즘을 사용하려고 시도합니다.
  • 소매점의 예


    이 점을 더욱 쉽게 이해하기 위해 우리는 현실 생활에서 이런 모델을 채택할 것이다.
    만약에 우리가 소매점을 하나 가지고 있다면 우리는 서로 다른 가격 알고리즘을 실현하는 방법을 소개하고 고객 유형(방문 또는 온라인)에 따라 고객 주문서의 총 가격을 계산하고자 한다.
    먼저 다음과 같은 가격 알고리즘을 정의할 수 있습니다.

    전략 및 알고리즘


    interface PricingStrategy {
        public float getTotalPrice(CustomerOrder);
    }
    
    class WalkInPricing implements PricingStrategy {
      public float getTotalPrice(CustomerOrder order) {
          // Calculate the price per item in order
          // according to the walk-in pricing
          ...
          return totalPrice;
      }
    }
    
    class OnlinePricing implements PricingStrategy {
      public float getTotalPrice(CustomerOrder order) {
          // Calculate the price per item in order
          // according to the online pricing
          ...
          return totalPrice;  
      }
    }
    
    그런 다음 다음과 같이 정책 및 알고리즘에 대해 컨텍스트에서 설명할 수 있습니다.

    배경.


    PricingStrategy pricing;
    ...
    // First, we decide type of customer and pricing algorithm to use.
    switch(customer.type) {
        case "walkIn":
          this.pricing = new WalkInPricing();
          break;
        case "online":
          this.pricing = new OnlinePricing();
          break;
        default:
          throw new IllegalCustomerType("...");
    }
    
    // Secondly, we get the calculated total price for the order using the pricing algorithm.
    this.totalPrice = this.pricing.getTotalPrice(customer.order);
    ...
    
    이것은 매우 간단하고 직관적이다!
    이러한 방식으로 변형을 설계하면 몇 가지 장점이 있다.
  • 우리는 모든 조건을 고려하는 단일 알고리즘을 실현하는 것을 피한다.심지어 Context 자체에서 논리를 실현한다!(예를 들어 하나의 PricingAlgorithm 클래스를 실현하는데 이 클래스는if/else와 switch 문장으로 고객 유형을 검사한다).
  • 우리는 단독 봉인 알고리즘을 통해 확장성을 도입한다.만약에 우리가 새로운 고객 유형을 위해 새로운 가격 결정 알고리즘을 도입하고 싶다면 Context의 switch 문장을 확장하고 새로운 가격 결정 알고리즘Strategy 인터페이스를 실현하기만 하면 된다.
  • 기능적 방법


    우리가 대상을 대상으로 어떻게 전략 모델을 사용하는지 이미 확정한 이상 우리는 어떻게 FP우호적인 방식으로 같은 논리를 실현할 것인가?
    매우 간단하다. 우리는 고급 함수의 개념을 이용할 수 있고 함수는 다른 함수를 매개 변수로 할 수 있다.
    const getMathResult = (mathOperation, arguments) => {
        return mathOperation(arguments);
    };
    
    간단한 고급 함수
    이것은 우리로 하여금 OOP에서 인터페이스를 사용하여 유사한 추상을 나타낼 수 있게 한다.
    이를 어떻게 하는지 살펴보겠습니다.
    const walkInPricing = (orders: CustomerOrder): Number => {
        // Calculate the price per item in order
        // according to the walk-in pricing
        ...
        return totalPrice;
    }
    
    const onlinePricing = (orders: CustomerOrder): Number => {
        // Calculate the price per item in order
        // according to the online pricing
        ...
        return totalPrice;      
    }
    
    
    const getTotalPrice =
    (pricingStrategy: (CustomerOrder) => Number,
    orders: CustomerOrders): Number => {
        return pricingStrategy(orders);
    }
    
    ...
    let pricing;
    switch(customer.type) {
        case "walkIn":
          pricing = walkInPricing;
          break;
        case "online":
          pricing = onlinePricing;
          break;
        default:
          throw new IllegalCustomerType("...");
    }
    getTotalPrice(pricing, orders);
    
    보시다시피, 우리는 getTotalPrice 함수로 Strategy 인터페이스를 대체할 뿐입니다. 이 함수는 매개 변수로 지정된 pricing 알고리즘을 사용하고 주어진 함수의 가격을 되돌려줍니다.
    이런 구조는 우리가 모델을 이용하여 OOP 방법에서 제공한 동일한 확장성과 봉인 디자인을 허용한다!대상을 대상으로 하는 특정한 문법을 적게 사용하고 코드도 짧으며 이해하기 쉬워 더욱 복잡한 실현에 이익을 얻을 수 있다.

    다음


    이 글은 함수식 프로그래밍 환경에서 디자인 모델을 활용한 시리즈의 첫 번째 부분이다.함수식 프로그래밍 범례에서 이루어진 디자인 모델에 대해 더 알고 싶으시면 제 글을 계속 주목해 주십시오.

    좋은 웹페이지 즐겨찾기