1

私はこのコードを持っていました:

Private Sub carButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles carButton.Click
    fTrafficSurveyA.incrementCount("Car")
    Call updateView()
End Sub
Private Sub bicycleButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bicycleButton.Click
    fTrafficSurveyA.incrementCount("Bicycle")
    Call updateView()
End Sub
Private Sub lorryButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lorryButton.Click
    fTrafficSurveyA.incrementCount("Lorry")
    Call updateView()
End Sub

私はそれを次のように変更しました:

Private Sub carButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles carButton.Click
    ButtonClickCode(CType(sender, Button))
End Sub
Private Sub bicycleButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bicycleButton.Click
    ButtonClickCode(CType(sender, Button))
End Sub
Private Sub lorryButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lorryButton.Click
    ButtonClickCode(CType(sender, Button))
End Sub

Private Sub ButtonClickCode(ByVal mySender As Button)

    Dim incrementVehicle As String
    Select Case mySender.Name
        Case "carButton"
            incrementVehicle = "Car"
        Case "bicycleButton"
            incrementVehicle = "Bicycle"
        Case "lorryButton"
            incrementVehicle = "Lorry"
        Case Else
            incrementVehicle = ""
    End Select

    fTrafficSurveyA.incrementCount(incrementVehicle)
    Call updateView()

End Sub

新しいコードには、より多くのコード行があります。
新しいバージョンの方が良い習慣ですか、それとも私が従うべき3番目のパターンがありますか?


編集

Guffaの回答と他のコメントを使用して、基になるTrafficSurveyAモデルを列挙型を含むように変更し、その機能incrementCountをそのように変更しました....この列挙型は正しい場所にありますか?

Enum vehicleType
    Car
    Lorry
    Bicycle
End Enum

Public Sub incrementCount(ByVal vehicle As vehicleType)
    ' Preconditions: none
    ' Postconditions: If vehicle is "Car", "Bicycle" or "Lorry" then 1 is added
    ' to the corresponding count. Otherwise nothing is done.

    Select Case vehicle
        Case vehicleType.Car : fCars = fCars + 1
        Case vehicleType.Bicycle : fBicycles = fBicycles + 1
        Case vehicleType.Lorry : fLorries = fLorries + 1
        Case Else 'do nothing
    End Select
End Sub

インターフェイスコードは次のようになりました。

Private Sub carButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles carButton.Click
    ButtonClickCode(TrafficSurveyA.vehicleType.Car)
End Sub
Private Sub bicycleButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bicycleButton.Click
    ButtonClickCode(TrafficSurveyA.vehicleType.Bicycle)
End Sub
Private Sub lorryButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lorryButton.Click
    ButtonClickCode(TrafficSurveyA.vehicleType.Lorry)
End Sub
Private Sub ButtonClickCode(ByVal incrementVehicle As TrafficSurveyA.vehicleType)

    fTrafficSurveyA.incrementCount(incrementVehicle)
    Call updateView()

End Sub
4

1 に答える 1

2

イベント ハンドラーのコードは同一であるため、すべてのイベントに対して 1 つのイベント ハンドラーのみを使用できます。

Private Sub vehicleButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles carButton.Click, bicycleButton.Click, lorryButton.Click
  Dim mySender As Button = CType(sender, Button)

  Dim incrementVehicle As String
  Select Case mySender.Name
    Case "carButton"
      incrementVehicle = "Car"
    Case "bicycleButton"
      incrementVehicle = "Bicycle"
    Case "lorryButton"
      incrementVehicle = "Lorry"
    Case Else
      incrementVehicle = ""
  End Select

  fTrafficSurveyA.incrementCount(incrementVehicle)
  Call updateView()

End Sub

もう 1 つの方法は、個別のイベント ハンドラーを保持し、各イベント ハンドラーが正しいテキストを共通メソッドに送信できるという事実を利用することです。そのため、テキストを判別するためにコントロール名を確認する必要はありません。

Private Sub carButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles carButton.Click
  ButtonClickCode("Car")
End Sub

Private Sub bicycleButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bicycleButton.Click
  ButtonClickCode("Bicycle")
End Sub

Private Sub lorryButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lorryButton.Click
  ButtonClickCode("Lorry")
End Sub

Private Sub ButtonClickCode(ByVal incrementVehicle As String)
  fTrafficSurveyA.incrementCount(incrementVehicle)
  Call updateView()
End Sub
于 2012-12-21T08:53:46.813 に答える