Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 전략 디자인 패턴을 사용하는 방법

전략 디자인 패턴에 대해 이야기합시다!

이 디자인 패턴은 메소드 내부의 주요 알고리즘을 변경하는 데 도움이 됩니다.

클래스에 하드코딩하는 대신 이 알고리즘을 구현하는 클래스를 전달하면 됩니다.

그리고 내가 알고리즘이라고 하면 멋진 컴퓨터 과학 알고리즘이 아니라 결과를 얻기 위해 일련의 단계를 따르는 모든 코드를 의미합니다.

전략 패턴을 사용하는 경우

이 패턴이 정확히 어떤 문제를 풀고 있습니까?

개방/폐쇄 원리 문제.

이 원칙은 다음과 같이 말합니다.

<블록 인용>

"소프트웨어 엔터티(클래스, 모듈, 메서드)는 확장을 위해 열리고 수정을 위해 닫혀야 합니다."

이것은 클래스가 새로운 일을 하도록 만들기 위해 클래스 자체를 변경할 필요가 없다는 것을 의미합니다. 이렇게 하면 코드가 더 유연하고 강력해집니다.

하지만 어떻게 합니까?

전략 패턴과 같은 디자인 패턴 사용 🙂

ReportGenerator가 있다고 가정해 보겠습니다. 같은 데이터를 사용하여 다양한 종류의 보고서 형식을 생성하려고 합니다.

각 보고서 유형에 대한 메소드를 작성할 수 있지만, 이는 새 유형을 추가하고 싶을 때마다 클래스를 변경해야(새 메소드를 추가하여)해야 하므로 열기/닫기 원칙을 깨야 합니다.

아니면 더 나빠요!

모든 종류의 if 문과 함께 하나의 HUGE 메서드를 가질 수 있습니다... 이것들은 종종 잘 끝나지 않습니다.

하지만 학급에서 보고서 형식을 지정하는 방법을 알 필요가 없다면 어떻게 될까요?

알고리즘이 클래스 외부에서 온 경우 ?

그러면 클래스 자체를 변경하지 않고 언제든지 형식 지정 알고리즘을 변경할 수 있습니다.

이렇게 하면 문제가 해결됩니다.

이것이 바로 전략 패턴입니다. 모든 것입니다.

전략 패턴 예시

전략은 하나의 메소드로 클래스 형태로 구현됩니다.

다음은 ReportGenerator에 대한 몇 가지 형식 지정 전략입니다. 클래스:

require 'json'

module ReportFormatters
  class JSON
    def self.format(data)
      data.to_json
    end
  end

  class PlainText
    def self.format(data)
      data.to_s
    end
  end

  class HTML
    def self.format(data)
      html = ""

      html << "
    " data.each { |product, amount| html << "
  • #{product}: #{amount}
  • " } html << "
" html end end end

모든 전략이 format을 구현하는 방법에 주목하세요. 방법. 이 메소드는 보고서 생성기 클래스에 의해 호출됩니다.

코드는 다음과 같습니다. :

class ReportGenerator
  def self.generate(data, formatter)
    formatter.format(data)
  end
end

data = { onions: 31, potatoes: 24, eggs: 10 }

p ReportGenerator.generate(data, ReportFormatters::HTML)
p ReportGenerator.generate(data, ReportFormatters::JSON)
p ReportGenerator.generate(data, ReportFormatters::PlainText)

지금:

출력 형식을 변경하려는 경우(HTML에서 PlainText로 ) 다른 전략을 전달해야 하며 전략이 format을 구현하는 한 작동합니다. 방법.

이 패턴에 대해 생각하는 또 다른 방법은 특정 비즈니스 전략을 전문으로 하는 컨설턴트를 고용하면 컨설턴트가 와서 전략을 구현한다는 것입니다. 당신을 위해, 이 전략은 특정한 결과를 산출할 것입니다.

이에 반해 데코레이터 패턴과 같은 패턴은 크리스마스 트리에 새로운 장식품을 추가하여 더욱 화려하게 만드는 것과 같습니다.

한 번에 하나의 전략으로만 작업할 수 있지만 원하는 만큼 장신구를 가질 수 있습니다.

동영상

요약

전략 디자인 패턴에 대해 배웠습니다. 클래스 자체를 변경하지 않고 클래스가 수행하는 작업의 일부를 변경해야 할 때 사용하세요.

읽어주셔서 감사합니다!

이 게시물을 공유하는 것을 잊지 마세요. Twitter에서 재미있다 , 더 많은 사람들이 즐길 수 있도록 도와드리겠습니다 🙂