우선 if/else
블록의 큰 덩어리는 쉽게 테스트 할 수 없습니다 . 각각의 새로운 "분기"는 또 다른 실행 경로를 추가하여 순환 복잡성 을 증가시킵니다 . 코드를 철저히 테스트하려면 모든 실행 경로를 다루어야하며 각 조건마다 최소 하나 이상의 테스트를 작성해야합니다 (작고 집중된 테스트를 작성한다고 가정). 반면에 전략을 구현하는 클래스는 일반적으로 테스트하기 쉬운 하나의 공개 메소드 만 노출합니다.
따라서 중첩을 사용 if/else
하면 코드의 한 부분에 대한 많은 테스트가 끝나고 전략을 사용하면 더 간단한 여러 전략에 대한 테스트가 거의 없습니다. 후자는 실행 경로를 놓치기가 더 어렵 기 때문에 더 나은 적용 범위를 쉽게 가질 수 있습니다.
확장성에 관해서는 사용자가 자신의 행동을 주입 할 수 있어야하는 프레임 워크를 작성한다고 가정하십시오. 예를 들어, 일종의 세금 계산 프레임 워크를 작성하고 다른 국가의 세금 시스템을 지원하려고합니다. 이들 모두를 구현하는 대신 프레임 워크 사용자에게 특정 세금을 계산하는 방법에 대한 구현을 제공 할 수있는 기회를 제공하려고합니다.
전략 패턴은 다음과 같습니다.
- 당신은 예를 들어, 인터페이스를 정의
TaxCalculation
하고 프레임 워크는 계산 세금이 유형의 인스턴스를 받아
- 프레임 워크 사용자는이 인터페이스를 구현하고이를 프레임 워크에 전달하는 클래스를 작성하여 계산의 일부를 수행 할 수있는 방법을 제공합니다.
if/else
프레임 워크의 코드를 변경해야하므로 더 이상 프레임 워크가 아니기 때문에 와 동일하게 작업 할 수 없습니다 . 프레임 워크는 종종 컴파일 된 형태로 배포되기 때문에 이것이 유일한 옵션 일 수 있습니다.
그래도 정규 코드를 작성하더라도 의도가 명확 해지기 때문에 전략이 유리합니다. "이 논리는 플러그 가능하고 조건부로되어 있습니다"라고되어 있습니다. 즉, 사용자 작업, 구성 또는 플랫폼에 따라 다양한 구현이있을 수 있습니다.
전략 패턴을 사용하면 가독성 이 향상 될 수 있습니다. 특정 전략을 구현하는 클래스는 일반적으로 설명이 포함 된 이름을 가져야합니다. 예를 들어 USAIncomeTaxCalculator
, if/else
블록에는 "이름이 없습니다", 방금 언급 한 주석이있을 수 있습니다. 또한 내 개인적인 취향에 따라 3 개 이상의 if/else
블록을 연속으로 갖는 것은 읽을 수 없으며 중첩 된 블록으로 인해 꽤 나쁩니다.
오픈 / 청산 원칙은 내가 위의 예에서 설명 된 바와 같이, 전략은 당신이 "수정을 위해 폐쇄"(그 부분을 다시 작성하지 않고 코드 ( "확장 오픈")의 일부의 논리를 확장 할 수 있습니다, 때문에, 매우 관련이 ).