这个程序是否有效

时间:2015-03-17 07:06:44

标签: vb.net

我已经整理了一个运行良好的小型计算器应用程序,但尽管是VB.net的新手我知道该程序可能没有它应该的效率。这个想法是,在将数字输入文本框并按下数学运算符后,文本框将重置并继续等式,存储输入的过去值。

    Dim input1 As Double
Dim numfunction As Double
'numerical functions (null = 0, add = 1, subtract = 2, divide = 3, multiply = 4)
Private Sub btnAdd_Click(sender As Object, e As RoutedEventArgs) Handles btnAdd.Click
    If txtNum.Text = "" Then
        MsgBox("Please enter a number")
    Else
        numfunction = 1
        input1 = input1 + txtNum.Text
        txtNum.Text = ""
    End If
End Sub

Private Sub btnEqual_Click(sender As Object, e As RoutedEventArgs) Handles btnEqual.Click
    If txtNum.Text = "" Then
        MsgBox("Please enter a final number")
    End If

    If numfunction = 1 Then
        txtNum.Text = txtNum.Text + input1
        input1 = 0
    End If
End Sub

你能指出我正确的方向,我应该替换添加或删除,以使我的程序在未来更有效吗?请记住,BtnAdd_Click事件只是4中的一个(add,sub,divide,multiply),因为btnEqual_Click将有一些if语句,检查用户放入了什么函数,以及txtNum中是否有任何内容一点都不。

先谢谢,我不是要求任何人完成我的代码,但我很想知道我有什么选择,所以我将来会制作更高效的程序。

2 个答案:

答案 0 :(得分:0)

通过一些初步的努力,您可以通过使用面向对象编程的强大功能来简化此任务:

Public Class Form1
    ' hold a reference to all operations in a list of operations
    Private _operations As New List(Of Operation)

    ' the operation currently choosen
    Private Property _currentOperation As Operation

    ' the 2 numbers you want to perform the operations on
    Private _number1 As Double = 0
    Private _number2 As Double = 0

    Public Sub New()
        InitializeComponent()
        SetupOperations()
        TextBox1.Text = 0
    End Sub

    Public Sub ChangeOperation(operation As Operation)
        _number1 = _currentOperation.FunctionDelegate.Invoke(_number1, _number2)
        TextBox1.Text = _number1
        _currentOperation = operation
    End Sub

    Private Sub SetupOperations()
        _operations.Add(New Operation(Me, btnAdd, Function(x, y)
                                                      Return x + y
                                                  End Function))
        ' heres the crux ... you use anonymous method to define your functions hook them to the form (Me) and the related Button
        ' all at once
        ' Similar for the other operations (subtract / multiply / divide / pow, and so on)


        Dim equalsOperation As New Operation(Me, btnEqual, Function(x, y)
                                                               Return y
                                                           End Function)
        _operations.Add(equalsOperation)
        _currentOperation = equalsOperation
    End Sub

    ' for this example i used only one textbox and a lable indicating wheter the number entered is a valid double
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        Dim result As Double
        If Double.TryParse(TextBox1.Text, result) Then
            _number2 = result
            lblValid.Text = "Valid" ' tell the user that the number entered is valid or not
        Else
            lblValid.Text = "Invalid"
        End If

    End Sub

    ''' <summary>
    ''' An Operation that hooks up a button click and can execute the operation
    ''' </summary>
    Public Class Operation
        Private _owningForm As Form1
        Public Property FunctionDelegate As Func(Of Double, Double, Double) ' use a delegate to a Func that returns double with 2 double parameters

        Public Sub New(owningForm As Form1, boundButton As Button, functionDelegate As Func(Of Double, Double, Double))
            Me.FunctionDelegate = functionDelegate
            Me._owningForm = owningForm
            AddHandler boundButton.Click, AddressOf boundButton_Click ' make the operation hook up on the click event
        End Sub

        Private Sub boundButton_Click()
            _owningForm.ChangeOperation(Me)
        End Sub

    End Class

End Class

希望这对您来说不会太混乱,我打算向您展示一个比简单例程和大量事件处理程序更大的世界

答案 1 :(得分:0)

您可以通过将检查代码插入单独的子例程来简化代码。

Sub CheckVals()
If txtNum.Text = "" Then
    MsgBox("Please enter a final number")
End If

If numfunction = 1 Then
    txtNum.Text = txtNum.Text + input1
    input1 = 0
End If
End Sub

然后,您将从两个按钮单击事件中引用此子目录。

Private Sub btnAdd_Click(sender As Object, e As RoutedEventArgs) Handles btnAdd.Click
CheckVals()
End Sub