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

我首先想简单地构建一个新类并继承旧类。但是由于所有的逻辑都在选择的情况下,这将需要完全重建并有大量的代码重叠。有人知道如何更好地构建它吗?

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

现在您可以通过两种方式更改行为:

覆盖

标记方法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 回答