更新类和函数

时间:2014-08-18 06:33:14

标签: vb.net class oop vb.net-2010

假设我们有一个名为“MyClass”的类

Public Class MyClass

End Class

这个类有一个叫做“我的函数”的函数

Public Class MyClass
    Public Function MyFunction()

    End Function
End Class

这个课程已经实施了一段时间,并且工作正常。现在我们需要更改函数“MyFunction”实现。一种选择是打开源代码并在那里进行更改。但我猜测必须有更好的方法。

我想到

继承,但我不想更改派生类名称。我希望类的名称仍然是“MyClass”,但我猜测下面的代码会导致错误:

Public Class MyClass
    Inherits MyClass
    Public Function MyFunction()

    End Function
End Class

换句话说,我试图通过保持大多数成员相同但只是改变一些功能来创建旧类的新版本。

为了解释整个项目,该计划旨在进行结构设计。它是什么设计结构部件(即柱,梁,板,......)。设计程序由第三方(政府法规)规定。例如: 在2007年,政府法规规定列尺寸应满足等式 F

H*B < Fy^2/L

在2008年,他们推出了一个新功能 G ,他们说列尺寸必须满足这个新功能:

H*B^2 < Fy^0.5/E+Alpha^2/L

其中H和B是列尺寸。

我不想做的是每年打开源代码并进行这些更改。我想以某种方式覆盖需要在不打开源的情况下进行更改的函数。

任何想法?

3 个答案:

答案 0 :(得分:2)

代码通常不应该随着时间的推移而改变。也就是说 - 如果您编写的代码可以保证在2周后自行中断,您可能应该重新考虑您的设计。

随着规则/法规的出台,您通常会更新输入数据(以XML格式或大量数据的关系数据库),您的程序会自动选择这些数据。

在这种情况下,您将更新程序的唯一情况是出现新类型的法规。但即使在这种情况下,变化通常也很小。

一个很好的反模式示例 - 你有500个表单,每个表单有500行代码,因此你的UI层中有250000行代码。出现了新法规,要求每种形式更改50%的代码。您的影响是125000,每天40行代码需要8.5开发人员。

对此的解决方案是在所有表单中更改100行,每行添加1行,或保留所有内容。还有来自政府/其他文件的数据加载/转换过程,它以适当的格式填充数据库,更新值或添加新值。如果您相信每天40 LoC,那么该计划可能会有10行变化,但这就是它,3天的工作量。否则它仍然不到开发人员的2周时间。

根据您的实施方式,这种方法的好处可能是您也支持旧标准,因此可以匹配旧的输入并生成生产报告。能够更新报告是一种很好的做法,因为有时报告代码中的问题在被发现之前几个月都未被注意到。

编辑:我在评论中建议的更有条理的方法是在DB中存储表达式树。最简单的形式只是一个线性工作流程,使用后缀表示法(单表)。例如,A, B, + C -相当于A + B - C。然后,您可以为某些配置工具提供用户界面,该工具仅允许用户输入适用的值和功能。这是假设适用的值也作为参数存储在DB中(一个结构组件可以有0...N个。)

答案 1 :(得分:0)

继承可以做你想要的,但你需要创建一个新的祖先,而不是后代。

将原始类的名称更改为表示它是基类的名称。此外,将 MustInherit 修饰符添加到类中,将可覆盖添加到您可能需要覆盖的任何方法或属性。

要注意的一件事是此基类中的私有成员。任何需要从后代类访问的成员都不能是私有的,必须更改为受保护

原始课程看起来像这样。

Public MustInherit Class MyBaseClass
    Public Overridable Function MyFunction() As String
        ' code...
    End Function

    Public Overridable Function AnotherFunction() As String
        ' code...
    End Function

End Class

现在使用原始类的名称创建一个新类,该类继承自基类。仅覆盖需要不同的成员。

Public Class MyClass
    Inherits MyBaseClass

    Public Overrides Function MyFunction() As String
        ' new code...
    End Function

End Class

那会让你开始。 Template Pattern将允许您进行更细粒度的代码更改,其中只需要更改方法的某些部分。

答案 2 :(得分:0)

公式有点复杂,除非您以某种方式将这些代码存储在数据库中,否则您仍需要更改某些代码。

一个选项是使用工厂方法继承。

Public Class BaseClass

    Public MustOverride Function MyFunction()

    Public Function GetInstance(ByVal year As Integer) As BaseClass

        If year = 2007 Then Return New Class2007()
        If Year = 2008 Then Return New Class2008()

    End Function

End Class

Public Class Class2007
    Inherits BaseClass

    Public Overrides Function MyFunction()
        ' H*B < Fy^2/L
    End Function

End Class

Public Class Class2008
    Inherits BaseClass

    Public Overrides Function MyFunction()
        ' H*B^2 < Fy^0.5/E+Alpha^2/L
    End Function

End Class

然后,在您的代码中的任何地方,您都使用BaseClass从不知道Class2007和Class2008存在

Dim o As BaseClass

o = BaseClass.GetInstance(2007)
o.MyFunction()

根据需要,也可以通过界面完成。

如果需要将公式作为字符串存储在数据库中,则需要获取解析器,这也可以使用第三方库找到。 https://stackoverflow.com/questions/1387430/recommended-math-library-for-c-net