Probleme beim Einloggen
Nur für XING Mitglieder sichtbar Refaktorisieren von GUI-Code
Hallo zusammen,
ich mach in diesem Forum mal einfach den Anfang, mein derzeit einziger Kunde kommt gestern einfach so mit einer neuen Anforderung. Er möchte beim Mouseover auf einem Knoten eines TreeView-Controls die entsprechende Beschreibung des Elements in einem Tooltip angezeigt bekommen. Ich hoffe mal, die Problemstellung wird aus dieser Beschreibung und dem folgenden Code dazu ausreichend ersichtlich.
Hier nun der Code, den ich im ersten Anlauf dafür erstellt habe:
<<
Protected mAktuellerKnotenIndex As Integer
Protected mAktuellerKnotenLevel As Integer
Private Sub treTestphasen_NodeMouseHover(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseHoverEventArgs) Handles treTestphasen.NodeMouseHover
If Not (e.Node Is Nothing) Then
If e.Node.Index <> mAktuellerKnotenIndex Or e.Node.Level <> mAktuellerKnotenLevel Then
Dim gesuchteID As Integer = CInt(e.Node.Tag)
Dim Tooltiptext As String = ""
Select Case e.Node.Level
Case 0 'Testphase
Dim Testphasenbeschreibung As String = "nicht vorhanden"
Try
Testphasenbeschreibung = DatasetTestpaketStarten.Testphasen.FindByID(gesuchteID).Beschreibung
Catch ex As Exception
'wenn DBNull, dann Beschreibungtext = "nicht vorhanden"
End Try
Tooltiptext = "Testphasenbeschreibung" & Environment.NewLine & Environment.NewLine & Testphasenbeschreibung
Case 1 'Testobjekt
Dim Testobjektbeschreibung As String = "nicht vorhanden"
Try
Testobjektbeschreibung = DatasetTestpaketStarten.Testobjekte.FindByID(gesuchteID).Beschreibung
Catch ex As Exception
'wenn DBNull, dann Beschreibungtext = "nicht vorhanden"
End Try
Tooltiptext = "Testobjektbeschreibung" & Environment.NewLine & Environment.NewLine & Testobjektbeschreibung
Case 2 'Testfall
Dim Testfallbeschreibung As String = "nicht vorhanden"
Try
Testfallbeschreibung = DatasetTestpaketStarten.Testfallbeschreibungen.FindByID(gesuchteID).Beschreibung
Catch ex As Exception
'wenn DBNull, dann Beschreibungtext = "nicht vorhanden"
End Try
Tooltiptext = "Testfallbeschreibung" & Environment.NewLine & Environment.NewLine & Testfallbeschreibung
Case 3 'Testdatenkombination
Dim TDKBeschreibung As String = "nicht vorhanden"
Try
TDKBeschreibung = DatasetTestpaketStarten.Testdatenkombinationen.FindByID(gesuchteID).Beschreibung
Catch ex As Exception
'wenn DBNull, dann Beschreibungtext = "nicht vorhanden"
End Try
Tooltiptext = "TDK-Beschreibung" & Environment.NewLine & Environment.NewLine & TDKBeschreibung
End Select
mAktuellerKnotenIndex = e.Node.Index
mAktuellerKnotenLevel = e.Node.Level
Dim BezugspositionTooltip As New System.Drawing.Point(e.Node.Bounds.X + e.Node.Bounds.Width + 10, _
e.Node.Bounds.Y + (e.Node.Bounds.Height \ 2))
ToolTipTreTestphasen.Show(Tooltiptext, treTestphasen, BezugspositionTooltip)
End If
End If
End Sub

>>
Ich finde dieses Beispiel insofern interessant, als dass es "unheiligen" GUI-Code notwendig macht (in den meisten Beispielen in Büchern und Fachzeitschriften wird dieses Thema ja oftmals eher stiefmütterlich behandelt ). Außerdem ist es meines Erachtens ein schönes Beispiel dafür, wie Anforderungen gerade im GUI-Umfeld reingekippt werden. Was auf den ersten Blick ziemlich einfach aussieht, kann bei Berücksichtigung aller Eventualitäten dann doch einigermassen komplex werden. Ich bin gespannt auf Eure Kommentare.
Gruß Matthias
Andreas Leue Mario Noack
+10 weitere Kommentare
Letzter Kommentar:
Patrick Lindemann
Hallo Allerseits,
meine Anmerkungen:
Verweise auf die Namespaces lieber importieren. System.Windows.Forms und System.Drawing muss man im Code nich unbedingt sehen. Wirkt sauberer.
Parameter: ByRef gehört (fast immer) verboten ;)
In den "ermittle..."-Funktionen werden Integers ByRef übergeben. Das birgt die Gefahr, dass durch spätere Änderungen innerhalb der aufgerufenen Routinen der Wert verändert wird, ohne dass das der Aufrufer merkt. Und zudem ist eine Referenzübergabe im vorhandenen Code überhaupt nicht notwendig.
An 2 anderen Stellen werden Objekte ByRef übergeben. Da dies sowieso geschieht, würde ich hierrauf auch verzichten.
Zu den "ermittle..".-Funktionen:
Da diese sich so ähnlich sehen, würde ich sie sofort in eine Basisklasse verlagern. Das könnte dann ungefähr so aussehen:
...
    Imports System.Environment
    Private Const keineBeschreibungVorhandenFuerTooltip = "..."
    Protected MustOverride ReadOnly Property BeschreibungTitel As String
    Public Function ermittleBeschreibungFuerTreeTooltip(ByRef TestobjektID As Integer) As String
        Dim Result As String = BeschreibungTitel & NewLine & NewLine
        Dim drTestobjekt As datasetTestpaketStarten.TestobjekteRow = Me.FindByID(TestobjektID)
        If Not drTestobjekt.IsBeschreibungNull Then
            Result &= drTestobjekt.Beschreibung
        Else
            Result &= keineBeschreibungVorhandenFuerTooltip
        End If
        Return Result
    End Function
Die jeweilige Ableitung überschreibt dann nur noch den Beschreibungstitel und der Code muss nur an einer Stelle gepflegt werden. Dadurch ist auch sichergestellt, dass der Tooltip immer das gleiche Muster hat.

Moderatoren

Infos zu den Moderatoren

Über die Gruppe "Clean Code Developer"

  • Gegründet: 11.03.2009
  • Mitglieder: 5.081
  • Sichtbarkeit: offen
  • Beiträge: 497
  • Kommentare: 3.006