2012-10-05 3 views
1

두 속성 (KeyValue)을 사용하여 값 배열을 파싱 중입니다.상속 된 클래스에서 선택 케이스를 수정하는 가장 좋은 방법

키워드 Key을 기반으로 Value을 테스트하는 특정 함수가 호출됩니다.

문제는 새로운 프로젝트의 일부 프로젝트에서 키워드를 수정해야한다는 것입니다. 그들은 키워드의 90 %를 공유하지만 일부는 각 프로젝트마다 고유하고 다른 일부는 공통이지만 다른 함수는 호출해야합니다. 내가 처음 단순히 새로운 클래스를 구축하고 기존의 클래스를 상속하고 싶어

Public Structure Options 
    Public Property Key 
    Public Property Value 
End Structure 

Public Sub CheckPresentation(OptionsList as List(of Options)) 
    for each Elem in Optionslist 
     select case elem.key 
      case 1 
       if elem.Value<>"bla" then 
        logger.info("bla") 
       end if 
      case 2 
       ... 
      case 99 
       ... 
     end select 
    next 
End Sub 

: 같은

는 현재 코드가 보인다. 그러나 모든 로직이 선택 된 케이스에 있기 때문에 엄청난 코드 중복으로 전체 재구성이 필요합니다. 아무도 이걸 더 잘 만드는 방법을 알고 있습니까?

답변

1

각 키워드에 대해 메소드를 만들어야합니다.

Sub LogIfNotBla(elem As Options) 
    If elem.Value<>"bla" Then 
     logger.info("bla") 
    End If 
End Sub 

모든 키워드에 대해이 작업을 수행 : 당신의 case 1를 들어, 다음과 같은 방법을 만들 수 있습니다.

그런 다음, 사전 사용하여 핸들러에 각 키워드를 매핑하는 매핑을 만들 :

Public Sub CheckPresentation(OptionsList as List(of Options)) 
    For Each elem in Optionslist 
     handler(Elem.Key)(elem) 
    Next 
End Sub 
: 당신의 거대한 Select Case

Dim handler = new Dictionary(Of Int32, Action(Of Options)) From 
{ 
    {1, AddressOf LogIfNotBla}, 
    {2, AddressOf Foo}, 
    {99, AddressOf FooBar} 
} 

대신을, 단순히 올바른 방법을 전화 조회를 사용하여


이제 두 가지 방식으로 동작을 변경할 수 있습니다.

재정 :

마크 서브 클래스의 메소드 overridable 그들을 덮어 쓰기 :

Overrides Sub LogIfNotBla(elem As Options) 
    If elem.Value<>"bla" And SomeThingElse Then 
     SomeOtherLogger.info("bla") 
    End If 
End Sub 

재구성

알터 특정 키워드에 대한 다른 방법을 호출 할 handler 사전 :

handler(1) = AddressOf AnotherMethodInsteadOfLogIfNotBla 
+0

감사합니다. 매우 유망 해 보입니다. 나는 그것을 시도하고 원하는대로 작동하면 대답을 수락하십시오. –

0

기본 동작에 대한 기본 클래스의 메서드를 호출합니다. 예를 들어 키 1, 4 및 72에 대한 동작을 재정의하려는 경우 파생 클래스에서 이렇게 할 수 있습니다.

Public Overrides Sub CheckPresentation(OptionsList as List(of Options)) 
    For Each Elem In Optionslist 
     Select Case elem.key 
      Case 1 
       ... 
      Case 4 
       ... 
      Case 72 
       ... 
      Case Else 
       MyBase.CheckPresentation(OptionsList) 
     End Select 
    Next 
End Sub 
+0

Thx, 작동 할 수도 있지만 케이스 내부의 코드를 수정해야하는 경우에는 어렵습니다. 스테이크 (Steak)의 솔루션이 더 잘 작동한다고 생각합니다. 따라서이 솔루션과 함께 갈 것입니다. 미안 해요;) –

관련 문제