1

2 つのプロパティ (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

最初は単純に新しいクラスを作成し、古いクラスを継承したかったのです。ただし、すべてのロジックは選択されたケースにあるため、コードが大幅に重複する完全な再構築が必要になります。これをより良く構築する方法を知っている人はいますか?

4

2 に答える 2

1

キーワードごとにメソッドを作成する必要があります。

たとえばcase 1、次のメソッドを作成します。

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

すべてのキーワードに対してこれを行います。

次に、辞書を使用して各キーワードをそのハンドラーにマップするマッピングを作成します。

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

巨大な の代わりにSelect Case、ルックアップを使用して適切なメソッドを呼び出すだけです。

Public Sub CheckPresentation(OptionsList as List(of Options))
    For Each elem in Optionslist
        handler(Elem.Key)(elem)
    Next
End Sub

これで、次の 2 つの方法で動作を変更できます。

オーバーライド:

メソッドをマーク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
于 2012-10-05T09:23:37.620 に答える
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
于 2012-10-05T14:01:59.707 に答える