是否可以简化(重构)我的比萨饼程序代码(VB.Net 2010)?

是否可以简化(重构)我的比萨饼程序代码(VB.Net 2010)?,vb.net,refactoring,Vb.net,Refactoring,我创建了一个简单的比萨饼计划(针对与教育无关的暑期项目),使用复选框确定客户想要什么。基本上是一个简单的比萨饼订购程序。 我想知道,由于我对不同的参数和变量反复使用了If语句,是否可以使用乘法数组来简化VB代码 有人建议我在VB.Net中使用构造函数,但我目前没有经验,你能帮我吗? 还是有更简单的方法来创建这个程序…或者更好的编程方法? 如何减少代码中的重复 Option Strict On Public Class Form1 Dim CurrentBalance As String Pri

我创建了一个简单的比萨饼计划(针对与教育无关的暑期项目),使用复选框确定客户想要什么。基本上是一个简单的比萨饼订购程序。 我想知道,由于我对不同的参数和变量反复使用了If语句,是否可以使用乘法数组来简化VB代码

有人建议我在VB.Net中使用构造函数,但我目前没有经验,你能帮我吗? 还是有更简单的方法来创建这个程序…或者更好的编程方法? 如何减少代码中的重复

Option Strict On
Public Class Form1

Dim CurrentBalance As String
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

    Dim SmallPizza As String
    SmallPizza = "5"
    CurrentBalance = Label4.Text
    If CheckBox1.Checked Then
        ListBox1.Items.Add("Small Pizza")
        Label4.Text = CStr(Val(CurrentBalance) + Val(SmallPizza))
    Else
        ListBox1.Items.Remove("Small Pizza")
        Label4.Text = CStr(Val(CurrentBalance) - Val(SmallPizza))
    End If
End Sub

Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
    Dim MediumPizza As String
    MediumPizza = "7"
    CurrentBalance = Label4.Text
    If CheckBox2.Checked Then
        ListBox1.Items.Add("Medium Pizza")
        Label4.Text = CStr(Val(CurrentBalance) + Val(MediumPizza))
    Else
        ListBox1.Items.Remove("Medium Pizza")
        Label4.Text = CStr(Val(CurrentBalance) - Val(MediumPizza))
    End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    CurrentBalance = Label4.Text
    MessageBox("Total cost: £" & CurrentBalance)
End Sub

Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
    Dim LargePizza As String
    LargePizza = "9"
    CurrentBalance = Label4.Text
    If CheckBox3.Checked Then
        ListBox1.Items.Add("Large Pizza")
        Label4.Text = CStr(Val(CurrentBalance) + Val(LargePizza))
    Else
        ListBox1.Items.Remove("Large Pizza")
        Label4.Text = CStr(Val(CurrentBalance) - Val(LargePizza))
    End If
End Sub

Private Sub CheckBox4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox4.CheckedChanged
    Dim ExtraLargePizza As String
    ExtraLargePizza = "7"
    CurrentBalance = Label4.Text
    If CheckBox4.Checked Then
        ListBox1.Items.Add("Extra Large Pizza")
        Label4.Text = CStr(Val(CurrentBalance) + Val(ExtraLargePizza))
    Else
        ListBox1.Items.Remove("Extra Large Pizza")
        Label4.Text = CStr(Val(CurrentBalance) - Val(ExtraLargePizza))
    End If
End Sub

Private Sub CheckBox5_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox5.CheckedChanged
    Dim Ham As String
    Ham = "1"
    CurrentBalance = Label4.Text
    If CheckBox5.Checked Then
        ListBox1.Items.Add("Ham")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Ham))
    Else
        ListBox1.Items.Remove("Ham")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Ham))
    End If
End Sub

Private Sub CheckBox6_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox6.CheckedChanged
    Dim Pineapple As String
    Pineapple = "1"
    CurrentBalance = Label4.Text
    If CheckBox6.Checked Then
        ListBox1.Items.Add("Pineapple")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Pineapple))
    Else
        ListBox1.Items.Remove("Pineapple")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Pineapple))
    End If
End Sub

Private Sub CheckBox7_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox7.CheckedChanged
    Dim Bananna As String
    Bananna = "1"
    CurrentBalance = Label4.Text
    If CheckBox7.Checked Then
        ListBox1.Items.Add("Bananna")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Bananna))
    Else
        ListBox1.Items.Remove("Bananna")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Bananna))
    End If
End Sub

Private Sub CheckBox8_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox8.CheckedChanged
    Dim Meat As String
    Meat = "1"
    CurrentBalance = Label4.Text
    If CheckBox8.Checked Then
        ListBox1.Items.Add("Meat")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Meat))
    Else
        ListBox1.Items.Remove("Meat")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Meat))
    End If
End Sub

Private Sub CheckBox9_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox9.CheckedChanged
    Dim ExtraCheese As String
    ExtraCheese = "1"
    CurrentBalance = Label4.Text
    If CheckBox9.Checked Then
        ListBox1.Items.Add("Extra Cheese")
        Label4.Text = CStr(Val(CurrentBalance) + Val(ExtraCheese))
    Else
        ListBox1.Items.Remove("Extra Cheese")
        Label4.Text = CStr(Val(CurrentBalance) - Val(ExtraCheese))
    End If
End Sub

Private Sub CheckBox10_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox10.CheckedChanged
    Dim Pepperoni As String
    Pepperoni = "1"
    CurrentBalance = Label4.Text
    If CheckBox10.Checked Then
        ListBox1.Items.Add("Pepperoni")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Pepperoni))
    Else
        ListBox1.Items.Remove("Pepperoni")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Pepperoni))
    End If
End Sub

Private Sub CheckBox11_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox11.CheckedChanged
    Dim Special As String
    Special = "1"
    CurrentBalance = Label4.Text
    If CheckBox11.Checked Then
        ListBox1.Items.Add("Special")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Special))
    Else
        ListBox1.Items.Remove("Special")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Special))
    End If
End Sub

Private Sub CheckBox12_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox12.CheckedChanged
    Dim Pickup As String
    Pickup = "1"
    CurrentBalance = Label4.Text
    If CheckBox12.Checked Then
        ListBox1.Items.Add("Pickup")
        Label4.Text = CStr(Val(CurrentBalance) - Val(Pickup))
    Else
        Label4.Text = CStr(Val(CurrentBalance) + Val(Pickup))
        ListBox1.Items.Remove("Pickup")
    End If
End Sub

Private Sub CheckBox13_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox13.CheckedChanged
    Dim Deliver As String
    Deliver = "5"
    CurrentBalance = Label4.Text
    If CheckBox13.Checked Then
        ListBox1.Items.Add("Deliver")
        Label4.Text = CStr(Val(CurrentBalance) + Val(Deliver))
    Else
        Label4.Text = CStr(Val(CurrentBalance) - Val(Deliver))
        ListBox1.Items.Remove("Deliver")
    End If
End Sub

Private Sub ChesseToastToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChesseToastToolStripMenuItem.Click
    Dim CheeseToast As String
    CheeseToast = "8"
    CurrentBalance = Label4.Text
    ListBox1.Items.Add("Cheese Toast")
    Label4.Text = CStr(Val(CurrentBalance) + Val(CheeseToast))
End Sub

Private Sub GarlicToastToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GarlicToastToolStripMenuItem.Click
    Dim GarlicToast As String
    GarlicToast = "11"
    CurrentBalance = Label4.Text
    ListBox1.Items.Add("Garlic Toast")
    Label4.Text = CStr(Val(CurrentBalance) + Val(GarlicToast))
End Sub

Private Sub BreadSticksToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BreadSticksToolStripMenuItem.Click
    Dim Breadsticks As String
    Breadsticks = "14"
    CurrentBalance = Label4.Text
    ListBox1.Items.Add("Bread Sticks")
    Label4.Text = CStr(Val(CurrentBalance) + Val(Breadsticks))
End Sub

Private Sub CashToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CashToolStripMenuItem.Click
    ListBox1.Items.Add("Paying by Cash")
End Sub

Private Sub ChequeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChequeToolStripMenuItem.Click
    ListBox1.Items.Add("Paying by Cheque")
End Sub

Private Sub DebitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DebitToolStripMenuItem.Click
    ListBox1.Items.Add("Paying by Debit Card")
End Sub

Private Sub CreditCardToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CreditCardToolStripMenuItem.Click
    ListBox1.Items.Add("Paying by Crebit Card")
End Sub

Private Sub VoucherToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoucherToolStripMenuItem.Click
    Dim Voucher As String
    Voucher = "5"
    CurrentBalance = Label4.Text
    ListBox1.Items.Add("Voucher")
    Label4.Text = CStr(Val(CurrentBalance) - Val(Voucher))
End Sub

Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
    End
End Sub

Private Sub MessageBox(ByVal p1 As String)
    Throw New NotImplementedException
End Sub

非常感谢您的帮助。

您可以使用以下参数创建一个添加/删除项目的函数:名称、价格、checkboxInstance

  • 名称将包含项目名称(凭证、提货单等)

  • 价格将用于更改Label4.Text中的值

  • checkboxInstance将帮助您决定要执行的操作:

因此函数的主体将如下所示:

  If checkboxInstance.Checked Then
       ListBox1.Items.Add(name)
       Label4.Text = Val(CurrentBalance) - Val(price)
  Else
      Label4.Text = Val(CurrentBalance) + Val(price)
      ListBox1.Items.Remove(name)
  End If
我真的不记得VB.NET的语法了。但由于这是你的家庭作业,我想最好提供一个提示,而不是一个代码


编辑:还有一件事可以从根本上简化代码。您可以使用checkbox的“tag”属性保存商品名称,而不是使用checkbox1、checkbox2、,。。您可以在Visual Studio的designer中创建一个复选框数组,以便对它们进行索引(MyCheckBox[0]、MyCheckBox[1]、…)-查看此网站。

某些选项(大小和付款方式)似乎相互排斥,因此最好将这些单选按钮放在两个单独的分组框中。我还建议不要在更新中执行任何计算,而是使用CalculateCost Sub,当需要重新计算成本时,所有事件都会遵循该Sub。您应该避免将ExtraLargePizza定义为字符串-您可以将其设置为整数(或十进制)-这样在执行计算时就不需要将其包装为Val(…)。

您的代码文件中似乎有很多重复。你可能想考虑使用A来让你创建不同类型的比萨饼变得更容易。
祝你好运,希望这对你有所帮助。

VB.NET的一些原则:

  • 始终打开选项(我因此看到了恐怖)
  • 您可以直接将值分配给如下变量:
    Dim s As String=“MyString”
  • 帮自己一个忙,从项目中删除
    Microsoft.VisualBasic
    -名称空间,开始使用新类(比如
    MessageBox
    而不是
    MsgBox
    )*
您的项目: 一种更好的重构方法可能是将所有内容都塞进
字典(字符串、十进制)
,这样可能会更好

Private prices As New Dictionary(Of String, Decimal)
Private balance As Decimal = 0D

' Add this to the constructor '
prices.Add("Ham", 1D)
prices.Add("Banana", 1D)
prices.Add("Pineapple", 1D)
' etc. ... '

For Each item As KeyValuePair(Of String, Decimal) In prices
    CheckedListBox1.Add(item.Key)
Next

' End of Constructor '

' Don't forget to give your Controls meaningful names!
Private Sub CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    If e.NewValue Then
        balance += prices(CheckedListBox1.Item(e.Index))
    Else
        balance -= prices(CheckedListBox1.Item(e.Index))
    End if

    Label4.Text = balance.ToString("C2")
End Sub

*:正如Konrad Rudolph指出的,如果您不想包含
表单
-名称空间,这可能是控制台项目的一个很好的解决方案。不过,我不同意这一点。

谢谢,我会看一看阵列……非常感谢。只是出于好奇:你在这个答案上打勾了吗?昨天打了勾,现在不是了。这很有趣,因为据我所知,不可能解除锁定。这对几年前的OU课程项目来说听起来相当熟悉。暑期项目还是家庭作业?很抱歉,不,只是一个我自己在自己的时间里开始做的小项目……否则我整个夏天都会感到很无聊。很公平:)我想知道他们是否更新了他们的Java代码!哈哈,起初我以为“披萨程序”指的是一种特定的编程风格,就像“意大利面代码”!我不同意
MsgBox
MessageBox
(特别是因为后者需要引用
Microsoft.Windows.Forms
,默认情况下,控制台项目中不包括这些内容。但其他内容都很准确。@Konrad Rudolph:Mh,没错。但我认为这是个人喜好的问题。我宁愿包含
Forms
-命名空间,而不是传统的VB6命名空间。此外,我从不使用Mes控制台应用程序中的sageBox…但可能只有我一个人。我必须在这两个方面达成一致。控制台应用程序中的
MsgBox
有时用于调试(例如,当我不想干扰正常的控制台输出流时…。@Konrad Rudolph:
系统诊断
-命名空间不是吗(有了
Debug
Trace
-类)更适合这种类型?特别是因为
Debug
-命令不会进入发布版本,只会在调试模式下出现。