2010-12-15 3 views
2

예를 들어, 다음과 같이 if else가있는 경우이 패턴이 어떤 디자인 patern에 속하는지 알고 싶습니다. 일상 생활에서 이처럼 여러 번 보입니다. 그것의 좋은 어떤 guidence 정말 감사합니다 다른 블록else else 블록이 다른 디자인 패턴에 속하면

경우 많은 쓸 생각하지 않는다

샘플 ///

일반적으로
if(dotcom){ 
    else if (frenc){} 
    else if (german){} 
    else if (brazil){} 
    else if (someothercountry){} 
// and the else if block goes on 
    else {} 
    } 

답변

1

, 그것은 너무 많은 switch을 할 수있는 코드 냄새입니다 명세서 및 if-else if 개 그거. 두 가지 해결책이 있습니다 :

  1. 당신은 일반적으로 실행될 것 코드 조각을 파악하기 위해 객체 지향 언어가 제공하는 가상 메서드 파견 메커니즘에 피기 백한다. abstract 기본 클래스가있는 각 조건에 맞는 클래스가 있어야합니다. 각 클래스에서 동작을 사용자 지정하는 메서드를 재정의합니다.

  2. 조회 테이블을 사용하십시오 (특정 질문에서이 질문은 아마도 더 관련성이 있다고 생각합니다. 모든 경로에 유사한 코드가 있지만 일부 변수에 대해 다른 값을 사용하는 경우이 방법이 더 유용합니다).

이러한 종류의 블록에는 합법적 인 사용 사례가 있으며 대형 개체 계층 구조가 항상 가치 있다고 생각하지 않습니다. 그것은 어려운 규칙이 아니라 코드 냄새입니다. 나는 전략 패턴 향하다 것

+0

@afshari, 난 당신이 코드를 작성하고 싶지 않아, 하지만 당신은 나에게 가상 메소드 디스패치 메카니즘 예제에 대한 링크를 제공 할 수 있는가? 시간과 도움을 주셔서 감사합니다. – kobe

+0

@ gov : 기본적으로, 가상 메소드를 가진 추상 기반/인터페이스를 갖게 될 것입니다. 각 서브 클래스 (현재 코드에서 하나의'if' 브랜치를 나타냄)에서 가상 메소드를 오버라이드하여 해당 브랜치에 특정한 것을 수행합니다. 클라이언트 코드는 단순히 그 메소드를 호출합니다. –

2

입니다. 잘못되었거나 반복적으로 느껴진다면 아마도 더 좋은 방법 일 것입니다.

예제가 현지화 문제로 보입니다. .NET을 사용하고 있기 때문에 System.Globalization 네임 스페이스에서 객체 지향 방식으로 UI 로컬 리 제이션을 처리하는 방법에 대한 힌트를 얻을 수 있습니다.

주어진 상황에서 if/else 대신에 따라야 할 정확한 패턴은 중괄호 안에 무엇이 있는지에 달려 있습니다. 국가마다 "Population"이나 "Url Suffix"또는 "Url Suffix"와 같은 속성 값이 다릅니다 나는 거기에 가기 전에 비자를 신청해야합니까? " 후자를 가정 해 봅시다. 아마 99 %의 시간이 될 것입니다. 기본적으로,이 같은이있는 경우 :

public class Country 
{ 
    public string Name { get; set; } 
    public string DefaultLanguage { get; set; } 
    public bool NeedToApplyForAVisaFirst { get; set; } 
    public string DefaultWordForClickHere { get; set; } 
} 

코드에서 갈 수

if ("france") 
{ 
    button.Text = "French(Fr) for 'Click Here'"; 
} 
else if ("brazil") 
{ 
    button.Text = "Portuguese(Br) for 'Click Here'"; 
} 
..... 

에 :

button.Text = User.Country.DefaultWordForClickHere;