2011-09-12 2 views
3

특정 페이지 유형 (예 : 일반 페이지, 계정 페이지 등)의 페이지가 있다고 가정 해보십시오. 페이지는 Page 객체로 표현됩니다.enum, 클래스 또는 태그는 언제 사용합니까?

제 질문은 페이지 유형을 페이지에 어떻게 할당하겠습니까? Page 개체에 설정되어있는 PageType에서 열거를 사용하여

  1. :

    나는 이러한 옵션을 참조하십시오.

  2. PageType 클래스를 사용하고 Page 인스턴스에이 인스턴스를 할당하면됩니다.
  3. 페이지 태그를 사용하여 페이지 개체와 연결된 간단한 문자열입니다.

옵션 1은 코드 전용 접근 방식이므로 새 페이지 유형을 추가하면 (코어) 코드가 변경된다는 의미입니다. 옵션 2는 더 유연하지만 이러한 페이지 유형을 유지해야하는 데 추가 오버 헤드가 있습니다. 옵션 3은 유지 관리가없고 페이지 유형 이외의 다른 메커니즘으로 확장 할 수 있으므로 매우 유연합니다. 그러나 제약이 없으므로 쉽게 끊을 수 있습니다.

다른 하나를 선택하는 다른 객관적인 이유는 무엇입니까?

+1

응용 프로그램의 사용자가 새 페이지 유형을 추가 할 수있게 하시겠습니까? 아니면 고정 된 유형의 유형이 있습니까? 모든 페이지가 정확하게 한 가지 유형입니까, 아니면 둘 이상의 유형을 공유하는 페이지를 기대합니까? –

+0

사용자는 페이지 유형을 추가 할 수 없으며 페이지를 작성하면 기존 페이지 유형을 선택할 수 있습니다. 그러나 웹 개발자는 새로운 페이지 유형을 정의 할 수 있습니다. 특정 위젯에서이를 사용하여 의사 결정을 내릴 수 있습니다. –

답변

2

시스템 설계 및 페이지 요구 사항, 지원할 여러 페이지 유형 수 및 페이지 자체의 차이에 대한 세부 사항이 없으므로 그러한 결정을 내리기가 어렵습니다. 그런 경우에 나는 keep it simple에 추천하고 Enum를 사용하십시오.

  • 페이지에 고유 한 비즈니스 로직이있는 경우 페이지 유형별로 클래스를 지정할 수 있지만 실제로 페이지 별 로직이있는 경우에만 신중하게 처리하십시오.
  • UserControl/CustomControl 기능에 대해 생각해보십시오 (사용자가 ASP.NET이라고 가정) 페이지 기능을 담당하는 컨트롤 집합으로 페이지를 분할 할 수 있으므로이 방법으로 Single Responsibility Principle을 유지하고 결합이 덜 된 시스템 .
  • 일부 논리는 페이지 엔터티 자체에서 외부 도우미/팩토리/저장소로 extracted이어야하며 페이지 클래스에 삽입되어야합니다.

목표와 관련하여 잠재적으로 제자리에 배치 할 수있는 페이지 수와 제공해야하는 유연성 수준을 정의해야합니다. 또한 시스템의 확장 성 및 유지 관리와 같은 사항을 명심하십시오.

2

옵션 4는 어떻게됩니까?

기본 페이지 비헤이비어가있는 (추상) 기본 클래스와 각 특정 페이지의 하위 클래스를 만듭니다. 이것은 많은 장소에서 차이가있을 것으로 예상되는 경우 가장 좋은 디자인입니다. 수십 곳의 열거 형을 평가하는 문을 switch 문으로 작성하지 않아도됩니다.

'마법'문자열을 사용하지 않으므로 3보다 1 또는 2를 사용하는 것이 좋습니다. the strategy pattern을 사용하여 다른 동작의 플러그인을 사용할 수도 있습니다. 이것은 더 많은 유연성을 제공하지만, 클래스 초기화는 좀 더 번거로울 것입니다. 물론이 동작은 다시이 작업을 수행하는 클래스/팩토리 메서드로 래핑 할 수 있습니다.

0

위 항목 중 하나가 아닙니다.

분명한 질문은 왜 페이지 유형을 식별하려는 것입니까? 식별 자체는 유용하지 않습니다. 대부분의 경우 페이지에서 더 많은 것을하고 싶습니다.

IAccountingPage과 같은 모든 종류의 페이지에 대한 인터페이스를 생성 한 다음 일종의 저장소가 있습니다. 당신이이 IPagePreFilter<T> where T : IPage 같은 필터 인터페이스를 만들 표시되기 전에 페이지를 처리 ​​사전 다음 구현해야하는 경우가 좋아 :

public class DiscountFilter : IPagePreFilter<ISalesPage> 
{ 
    public void Process(ISalesPage page) 
    { 
     if (page.Product.Id == 1234) 
      page.AddParagraph("Product is at amazing 50% off"); 
    } 
} 

요약 :이 Liskovs 대체 원리를 나누기 때문에 if (page.PageType == PageEnum.Accounting) bla bla 같은 논리를 가지고 페이지를 식별하려고하지 마십시오 . 내가 제안한 것과 같은 강력한 솔루션을 수행하십시오.

관련 문제