Hallo,
ich werde in diesem Beitrag versuchen eine Idee von gutem Code (Stil) zu vermitteln.
Dafür werde ich das ganze - immer wenn es einen Anlass dazu gibt - erweitern.
Das ganze ist natürlich, wie die meisten Dinge subjektiv.
Dennoch glaube ich, einigen von euch einen Anstoss geben zu können.
Da ich aktuelle Codes aus dem Forum verwenden werde, bitte ich euch - falls Ihr einen eurer Codes findet - das nicht persönlich zu nehmen.
1. Verwende möglichst keine festen Zahlen, wenn es dafür eine Konstante gibt:
In vielen Fällen gibt es im Framework Konstanten (Enums) deren Text mehr aussagt als die nackte Zahl, die sich dahinter verbirgt.
Beispiel:
|
Visual Basic Quellcode
|
1
2
3
|
If GetAsyncKeyState(13) Then
....
End If
|
Der informierte weiss sicherlich, dass die 13 hier ein Enter Symbolisiert.
Schöner, weil besser lesbar ist aber folgendes
|
Visual Basic Quellcode
|
1
2
3
|
If GetAsyncKeyState(Keys.Return) Then
....
End If
|
2. Suche von Zeichenfolgen in einem String:
Oft verwenden die Leute Schleifen, wenn ein Teilstring in einem String gesucht werden soll.
Beispiel:
|
Visual Basic Quellcode
|
1
2
3
4
5
|
For x= 1 To Len(txt)
If Mid(String,"suchlänge")="suchbegriff" Then
'auszuführennde befehe
End If
Next x
|
Hier ist eigentlich alles Furchtbar.
1. Der Code stammt mit ziemlicher Sicherheit aus VB6
2. Es wurde eine Schleife zur Suche von "suchbegriff" verwendet.
So ist es übersichtlicher und kürzer.
|
Visual Basic Quellcode
|
1
2
3
|
If txt.Contains("was auch immer") = True Then
'ausführende befehle
End If
|
Vielleicht noch eine kleine Ergänzung.
Wer die Position eines Teilstrings sucht, macht das am besten so.
|
Visual Basic Quellcode
|
1
|
Dim pos As Integer = txt.IndexOf("was auch immer")
|
3. Beachte immer Deine Datentypen und vermische sie nicht:
Auch wenn es mit den Standardeinstellungen keinen Fehler verursacht, sollten Datentypen nicht wild gemischt werden.
Wenn mal eine Umwandlung von einem in den anderen Datentyp nötig ist, gibt es dafür eigene Funktionen.
Beispiel:
|
Visual Basic Quellcode
|
1
2
3
4
5
|
Dim pos As Integer = Me.ListBox1.IndexFromPoint(e.Location)
If pos = "-1" Then
...
End If
|
Die Variable pos ist hier ganz eindeutig und klar als Integer definiert worden - was auch richtig ist.
Verglichen wird pos aber mit einem String.
Dies verursacht zwar keinen Fehler, sollte jedoch vermieden werden.
So sollte der Beispielcode aussehen.
|
Visual Basic Quellcode
|
1
2
3
4
5
|
Dim pos As Integer = Me.ListBox1.IndexFromPoint(e.Location)
If pos = -1 Then
...
End If
|
4. Verwende Try...Catch Blöcke nur dort, wo unerwartete Fehler auftreten können:
Try ... Catch Blöcke wurden erfunden um unerwartet auftretende Fehler abfangen zu können.
Es macht wenig Sinn Code in Try ... Catch Blöcke zu packen, bei denen nichts unerwartetes Auftreten kann.
Beipiel:
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
|
Try
If move = True Then
ListBox1.Items.Remove(eintrag)
ListBox1.Items.Insert(pos, eintrag)
move = False
ListBox1.SelectedIndex = pos
End If
Catch
End Try
|
Mit diesem Codeschnippsel sollte demonstriert werden wie Einträge einer Listbox mit der Maus verschoben werden können.
Die Listbox ist in diesem Fall in sich geschlossen und unerwartete Situationen sind nicht zu erwarten.
Unerwartet wäre z.B. eine evtl. Zugriffsverletzung in Verbindung mit Dateien.
Der obige Code kann also genausogut ohne den Try ... Catch Block geschrieben werden.
|
Visual Basic Quellcode
|
1
2
3
4
5
6
|
If move = True Then
ListBox1.Items.Remove(eintrag)
ListBox1.Items.Insert(pos, eintrag)
move = False
ListBox1.SelectedIndex = pos
End If
|
5. Verweden von Select Case Blöcken anstatt vieler If Anweisungen:
Oft ist es Sinnvoll Select Case Blöcke anstatt eine ganze Reihe von If Anweisungen zu verwenden.
Dies hat den Vorteil, das es ohne großen aufwand und ohne die Übersichtlichkeit des Codes zu gefährden erweitert werden kann.
Klar ist natürlich auch, dass nicht immer ein Select Case Block verwendet werden kann.
Im folgenden Beispiel jedoch schon.
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
If SFD.FilterIndex = 0 Then
SsHot.Save(SFD.FileName, System.Drawing.Imaging.ImageFormat.Png)
Exit Sub
End If
If SFD.FilterIndex = 1 Then
SsHot.Save(SFD.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
Exit Sub
End If
If SFD.FilterIndex = 2 Then
SsHot.Save(SFD.FileName, System.Drawing.Imaging.ImageFormat.Gif)
Exit Sub
End If
|
Dadurch, dass Filterindex immer nur einen Wert annehmen kann - drängt sich hier Select Case einfach auf.
Die mögliche Erweiterbarkeit - z.B. wenn es einen neuen Wert abzufragen gibt - spricht auch dafür.
So würde es als Select Case Block aussehen.
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
|
Select Case SFD.FilterIndex
Case 0
SsHot.Save(SFD.FileName, System.Drawing.Imaging.ImageFormat.Png)
Case 1
SsHot.Save(SFD.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
Case 2
SsHot.Save(SFD.FileName, System.Drawing.Imaging.ImageFormat.Gif)
Case Else
'Case Else sollte immer Programmiert werden, um auf ungewünschte
'bzw. unerwartete Ereignisse aufmekrsam gemacht werden zu können
End Select
|
6. Das Using Statement verwenden:
Werden verwendete Klassen nicht mehr gebraucht, sollten diese mit Dispose wieder freigegeben werden,
dies gilt vor allem für nicht verwaltete Resourcen. (z.B COM Objekten oder SQL Verbindungen)
(Damit später der Garbage Collector seine Arbeit tun kann.)
Durch Verwenden des Using Statements braucht man sich um solche Dinge nicht mehr zu kümmern.
Der Kompiler erledigt alle nötigen Aufrufe.
Beipsiel:
|
Visual Basic Quellcode
|
1
2
3
4
5
|
Dim SFD As New SaveFileDialog
SFD.Filter = "PNG-Bilder(*.PNG)|*.png|BMP-Bilder(*.bmp)|*.BMP|GIF-Bilder(*.GIF)|*.gif"
If SFD.ShowDialog = Windows.Forms.DialogResult.OK Then
...
End If
|
Bei verwaltetem Code wie z.b. dem SaveFileDialog hat Using den Vorteil, eine gewisse Übersicht in den Quellcode zu bringen.
Übersichtlicher Code ist besser lesbar, was natürlich sehr wichtig ist.
Deshalb ist es Ratsam auch hier den Using Block zu verwenden.
|
Visual Basic Quellcode
|
1
2
3
4
5
6
|
Using SFD As New SaveFileDialog
SFD.Filter = "PNG-Bilder(*.PNG)|*.png|BMP-Bilder(*.bmp)|*.BMP|GIF-Bilder(*.GIF)|*.gif"
If SFD.ShowDialog = Windows.Forms.DialogResult.OK Then
...
End If
End Using
|
7. Verwende nie bekannte Eigenschaftsnamen als Variablenname:
Visual Basic erlaubt es bekannte Eigenschaftsnamen auch als Variable zu verwenden.
Dies macht den Code äußerst schlecht lesbar.
Jeder verbindet mit Eigenschaften wie z.b. "Text" eine Eigenschaft und keine Variable
Beispiel:
|
Visual Basic Quellcode
|
1
2
3
4
5
6
|
Dim Text As System.Text.StringBuilder = New System.Text.StringBuilder(TextBox1.Text)
For i = 0 To XXX 'For-Schleife
TextBox1.Text = Text.Remove(0, 3).ToString 'Löscht die ersten 3 Zeichen
Next
|
was spräche dagegen - hier einen anderen Variablennamen zu verwenden.
Einfach der Übersicht halber.
|
Visual Basic Quellcode
|
1
2
3
4
5
6
|
Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder(TextBox1.Text)
For i = 0 To XXX 'For-Schleife
TextBox1.Text = sb.Remove(0, 3).ToString 'Löscht die ersten 3 Zeichen
Next
|
sieht doch schon viel klarer aus - oder ?
Gruss
mikeb69