Sauberer Code

  • Allgemein

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von link_275.

    Sauberer Code

    Hallo Communty,
    Ich habe oft gesagt bekommen das meine Codes unsauber weren.
    Nun würde ich mal wissen wie so ein Code aussieht wenn er sauber geschrieben ist.

    Nunja unsauberer Code wäre z.B. sowas

    VB.NET-Quellcode

    1. Dim ofd As New OpenFileDialog
    2. If ofd.ShowDialog() = DialogResults.OK Then
    3. ' irgendwas
    4. End If


    Da er nicht Disposed wird

    richtig:

    VB.NET-Quellcode

    1. Using ofd As New OpenFileDialog
    2. If ofd.ShowDialog() = DialogResults.OK Then
    3. ' irgendwas
    4. End If
    5. End Using


    Ebenfalls unsauber is unsinniges Variablen rumhantieren

    VB.NET-Quellcode

    1. Using sr As New StreamReader("datei.txt")
    2. Dim text As String
    3. text = sr.ReadToEnd()
    4. Textbox1.Text = text
    5. End Using


    da man Variablen direkt bei der Deklaration zuweisen kann und ebenfalls ReadToEnd() direkt an die Text-Eigenschaft zuweisen.
    Es gibt viele Anzeichen von unsauberem Code, so pauschal kann man jetzt nicht die unsauberen Dinge auflisten.
    Du müsstest uns schon ein wenig Code zeigen, von dem du von anderen Leuten hörtest, dass er unsauber sei.
    Dieser Code zum Beispiel wurde mich als Unsauber bezeichnet:

    VB.NET-Quellcode

    1. Private Sub cmdOpenFileDialog_Click(...) Handles ...
    2. Dim ofd As New OpenFileDialog
    3. ofd.Filter = "Tabellen (*.xls)|*.xls|" &
    4.         " Texte (*.txt; *doc)|*.txt;*.doc|" &
    5.         " Alle Dateien (*.*)|*.*"
    6.     ofd.Title = "Datei zum Öffnen auswählen"
    7.     If ofd.ShowDialog() = DialogResult.OK Then
    8.         MessageBox.Show("Öffnen: " & ofd.FileName)
    9.     Else
    10.         MessageBox.Show("Abbruch")
    11.     End If
    12. End Sub


    Was soll daran unsauber sein ??
    Soviel ich hier gelesen und verstanden habe soll ich nicht Dim sondern Using nutzen.

    Patrick1993 schrieb:

    Was soll daran unsauber sein ??
    Soviel ich hier gelesen und verstanden habe soll ich nicht Dim sondern Using nutzen.


    Naja, gut das bisserl Code zu einzustufen ist natürlich schwierig, aber folgende Kritikpunkte könnte ich mir vorstellen (soll nicht heissen das es meine wären):

    1. Using anstatt Dim

    2. Direkte String-Zuweisung ... also string = "Mein Inhalt" ... viele schwören darauf solche konstanten Zuweisungen als Class-Constante zu deklarieren

    3. Doppelte identisch Anweisung (MessageBox.Show) , besser Variable strMsg mit Text zu befüllen und dann nach dem If-Construct die Anweisung MessageBox.Show(strMsg) auszuführen ... aber da die Anweisung ja eh nur zum testen drinnen ist, ist es an sich eh egal

    4. Einige empfinden es bereits als unsauberen Code, die Funktion direkt in den Event-Handler des Controls rein zu schreiben. Oftmals wird als guter Stil angesehen dieses in eine separate Funktion zu kapseln und aus dem Event-Handler dann nur die Funktion aufzurufen, bzw. solche Standard-Hilfsvorgänge die man immer wieder mal an verschiedenen Stellen im Code brauchen kann gleich in eine eigene Klasse auszulagern.

    5. Fehlende Kommentare ... kurz ein wieso und warum dazu wird von Vielen als zwingend für einen sauberen Code angesehen

    Da es sich dabei aber offensichtlich um eine reine Testfunktion handelt, kann ich die Kritik eh nicht so ganz nachvollziehen und als einziger Punkt würde tatsächlich nur Using statt Dim bleiben. Allerdings einem Anfänger das dann als unsauberen Code vorzuhalten finde ich nicht wirklich nachvollziehbar ... kleiner Hinweis "Guck mit Using fährst Du aus dem und dem Grund besser" und gut ist.

    Gruß

    Rainer
    Also du meinst es quasi wie folgt:
    1. Using anstatt Dim

    =

    VB.NET-Quellcode

    1. Using xyz As xyt



    2. Direkte String-Zuweisung ... also string = "Mein Inhalt" ... viele schwören darauf solche konstanten Zuweisungen als Class-Constante zu deklarieren

    =

    VB.NET-Quellcode

    1. Using xyz As String="Textinhalt"



    3. Doppelte identisch Anweisung (MessageBox.Show) , besser Variable strMsg mit Text zu befüllen und dann nach dem If-Construct die Anweisung MessageBox.Show(strMsg) auszuführen ... aber da die Anweisung ja eh nur zum testen drinnen ist, ist es an sich eh egal

    =

    VB.NET-Quellcode

    1. strMsg("Text")



    4. Einige empfinden es bereits als unsauberen Code, die Funktion direkt in den Event-Handler des Controls rein zu schreiben. Oftmals wird als guter Stil angesehen dieses in eine separate Funktion zu kapseln und aus dem Event-Handler dann nur die Funktion aufzurufen, bzw. solche Standard-Hilfsvorgänge die man immer wieder mal an verschiedenen Stellen im Code brauchen kann gleich in eine eigene Klasse auszulagern.

    Dies habe ich nicht zu 100% verstanden


    5. Fehlende Kommentare ... kurz ein wieso und warum dazu wird von Vielen als zwingend für einen sauberen Code angesehen

    =

    VB.NET-Quellcode

    1. 'also immer Kommentare setzen bevor Code'


    --
    Dies wurde gemacht um sicher zu gehen das ich es auch verstanden habe bevor ich anfange Programme zu basteln und Fehler einbaue.
    Das mit dem Dim war in den Tutorials eingebaut somit wusste ich nicht das es als "unsauber" gezählt wird.

    Das mit dem Using macht bei deinem Beispiel Sinn, weil der OpenFileDialog ein Control ist, das in den Speicher geladen wird und nach Benutzung durch End Using halt wieder freigegeben wird.

    Mit Dim ofd As New OpenFileDialog bleibt es halt noch, was aber unnötig ist, da es vermutlich net ständig gebraucht wird.
    Deswegen macht eine Anweistung wie Using Meintext as string = "Blubb" vermutlich weniger Sinn, weil du wahrscheinlich mit diesem String noch woanders arbeiten willst. Und nach End Using existiert der halt net mehr.

    Ich hoffe mal die Erklärung macht Sinn. Sonst berichtige mich wer.^^

    //Edit

    VB.NET-Quellcode

    1. Using ofd As New OpenFileDialog
    2. If ofd.ShowDialog = DialogResult.OK Then
    3. Dim Pfad As String = ofd.FileName
    4. End If
    5. End Using
    6. Label1.Text = Pfad '<- Funzt net

    Wenn ich innerhalb des Using Blocks eine Variable deklariere, kann ich auf diese nach End Using net mehr zugreifen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Unwesen“ ()

    Öhem ... Using macht nur bei Objekten die auch eine Dispose-Methode haben Sinn (und sind auch nur bei denen ohne Compiler-Mecker möglich^^). Normale Variablen deklarierst Du natürlich nach wie vor mit Dim.

    Dispose-Methode ist die Methode einer Klasse/eines Objektes das belegte Ressourcen explizit wieder frei gibt und durch das Konstrukt Using-End Using wird die Methode Dispose explizit durch End Using ausgelöst.

    Mit der String-Übergabe hast Du auch falsch verstanden. ;)

    Du befüllst den String direkt im Code mit einem Text von Dir. Hier schwören viele drauf eine Private Const die klassenweit gültig ist zu deklarieren und ihr den String zu zu weisen. Später im Code direkt wird dann nur noch die Constante zugewiesen und kein handgeschriebener Text mehr.

    Falls Du den Part nicht verstehst, dann gaaaanz drigend Grundlage erarbeiten ... Gültigkeitsbereich, Sichtbarkeit, Lebensdauer von Variablen und die unterschiedliche Variablentypen wie Static, Const etc.. In dem Sinne gleich auch mitlernen was der Unterschied zwischen einer Wert- und einer Verweisvariable ist. Je schneller Du das intus hast desto besser für Dich. ;)

    Patrick1993 schrieb:

    Dies habe ich nicht zu 100% verstanden


    Du hast Deinen Code direkt in das Click-Event reingeschrieben. Das was ich gemeint habe, ist das Du eine eigene Private Prozedure für den Aufruf des Open-File-Dialogs anlegst (z.B. mit Namen GetFileFromDialog) und dann steht im Click-Event dann nur noch Call GetFileFromDialog.

    Patrick1993 schrieb:

    'also immer Kommentare setzen bevor Code'


    Quasi richtig. Ich habe früher tatsächlich zuerst die Kommentare zum Code-Ablauf und was wo und wieso passiert geschrieben und dann erst den Code passend zu den Kommentaren. ^^

    Aber das war noch zu Zeiten wo es nicht üblich war Code-Abläufe/-Verzweigungen in Flow-Charts vorzuzeichnen und man auch prozedural und nicht objektorientiert programmiert hat. ^^

    Patrick1993 schrieb:

    --
    Dies wurde gemacht um sicher zu gehen das ich es auch verstanden habe bevor ich anfange Programme zu basteln und Fehler einbaue.
    Das mit dem Dim war in den Tutorials eingebaut somit wusste ich nicht das es als "unsauber" gezählt wird.


    Das ist natürlich sehr sinnvoll. In dem sinne empfehle ich Dir auch Dich mal mit Notation/Präfixen auseinander zu setzen ... oder salopp: Saubere Benamsung. Mir persönlich liegt ungarisch und Kamelschreibweise am ehesten. ^^

    Edit: Ach ja ... gewöhn Dir am besten gleich an NUR mit Option Strict On zu arbeiten.

    Denke aber da werden auch noch andere Tipps für Dich haben. ;)

    Edit:

    @ Unwesen

    Using setzt immer vorraus das das damit angesprochene Objekt auch über eine Dispose-Methode verfügt. Probiere mal eine Klasse mit Using zu nutzen in der Du nicht die IDisposable Schnittstelle eingebaut hast ... das geht schief. ;)

    Gruß

    Rainer
    Danke für die vielen Antworten.
    Haben mir sehr geholfen den sinn zu verstehen der in "Sauber Programmieren" sitzt.

    Da ich noch fleißig am lernen bin und noch ein halbes Buch zu lesen habe werde ich vorerst mal so weiter Programmieren und dann wenn ich bei dem Kapitel angekommen bin anfangen mit Sauberen Codes zu arbeiten.