Angepinnt Beispiele für guten und schlechten Code (Stil)

  • VB.NET

Es gibt 269 Antworten in diesem Thema. Der letzte Beitrag () ist von Hinti.

    roddy schrieb:

    @milaim:

    Wenn schon Beispiele bringen, dann syntaktisch richtige (beidesmal fehlt das "Then").

    Tja, das kann passieren, wenn eine Entwicklungsumgebung solche Sachen automatisch macht, wenn man Enter drückt.. Kann man leicht vergessen, das selber einzutippen.

    Ich wollte aber nicht das If - Then - Else - End If erklären das ist dir schon klar oder? Meine Hauptaussage ist angekommen..

    ein "Hey hast das 'Then' vergessen" hätte mir auch gereicht.. tzz
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    Sorry, milaim. :(

    Du hast Recht. Ich hätte das auch freundlicher sagen können. Ich hoffe, du kannst mir nochmal verzeihen.

    Dass es Umgebungen gibt, bei denen das "Then" automatisch gesetzt wird, wusste ich nicht. Bei mir (VBA) kommt ohne "Then" die Meldung, dass Then oder GoTo erwartet wird.
    Mit welcher Begründung? Ist viel klarer wenn man über den Code guckt finde ich.

    VB.NET-Quellcode

    1. If move Then

    finde ich nicht so klar wie

    VB.NET-Quellcode

    1. If move=True Then

    man schreibt ja auch

    VB.NET-Quellcode

    1. If move=False

    Also warum nicht True?
    Weil du das ja 2x abfragst. Wenn du Auto fährst und an eine rote Ampel kommst denkst du dir ja auch nur "Aha, rot, also anhalten" und nicht "Ist die rote Ampel rot? Ja? dann anhalten" Eine rote Ampel mit einer roten Ampel zu vergleichen macht einfach keinen Sinn.
    Also ich mach das auch immer ohne "= True" oder "= False".

    Statt

    VB.NET-Quellcode

    1. If move = False Then


    schreibe ich

    VB.NET-Quellcode

    1. If Not move Then


    Mir geht es da wie dusti. Wozu eine Boolean-Variable mit einem Boolean-Wert vergleichen, wenn man auch direkt die Boolean-Variable verwenden kann. Und wie dusti angerissen hat, werden bei "move = True" zwei Vorgänge ausgelöst (Laden des Werts von move und Vergleich mit True), während bei "move" nur der erste Vorgang ausgelöst wird, sodass die Ausführung ohne "= True" prinzipiell schneller geht. Inwieweit das dann tatsächlich spürbar ist und sich auf die Performance auswirkt, weiß ich jedoch nicht.
    Nein, dass nicht, aber an bestimmten Stellen schon. Ich schreibe manchmal auch folgendes:

    Statt:

    VB.NET-Quellcode

    1. If TextBox1.Text="" Then
    2. Exit Sub
    3. End If
    4. ' EIGENTLICHER CODE

    das hier:

    VB.NET-Quellcode

    1. If TextBox1.Text=""= False Then
    2. ' EIGENTLICHER CODe
    3. End If


    ... macht doch Sinn, oder?
    Dafür wäre

    VB.NET-Quellcode

    1. If TextBox1.Text <> "" Then
    2. ' EIGENTLICHER CODe
    3. End If
    wesentlich besser geeignet..

    ~ Chris
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Nein, macht es nicht.

    VB.NET-Quellcode

    1. If TextBox1.Text=""= False Then

    Das ist ja so mit das grausigste was ich hier gesehen habe. Wenn du Klammern einfügen würdest, würde es wieder Sinn machen aber so... Ein zweifacher Vergleich ohne Klammern wird doch von links nach rechts ausgewertet, oder? Wenn du aber auf sowas bauen musst, ist das schlechter Stil.
    Anstatt

    VB.NET-Quellcode

    1. If TextBox1.Text="" Then
    2. Exit Sub
    3. End If
    4. ' EIGENTLICHER CODE

    Schreibt man

    VB.NET-Quellcode

    1. If TextBox1.Text <> "" Then
    2. ' EIGENTLICHER CODE
    3. End If

    oder eventuell noch etwas mit Not, aber doch nicht so einen komplizierten und unschönen Zweifachvergleich :P
    Dafür schreibe ich öfters etwas in diesem Schema:

    VB.NET-Quellcode

    1. select case move
    2. case true
    3. case else
    4. end select


    Ich finde halt cases viel übersichtlicher, da auch Zeilen nicht so lang dabei werden.
    Dies soll ein ein Beispiel verdeutlichen:

    VB.NET-Quellcode

    1. dim sehrLangerVariablenNameAufgebläht1 as int32 = 5
    2. dim sehrLangerVariablenNameAufgebläht2 as int32 = 4
    3. if sehrLangerVariablenNameAufgebläht1 = sehrLangerVariablenNameAufgebläht2 then
    4. end if
    5. select case sehrLangerVariablenNameAufgebläht1
    6. case sehrLangerVariablenNameAufgebläht2
    7. end select


    Mag aber auch alles Ansichtssache sein, ich persönlich finde es jedenfalls überschaubarer.

    Noch netter finde ich übrigens folgende kaum bekannte Möglichkeit:

    VB.NET-Quellcode

    1. select case true
    2. case i = 5
    3. case s = "hans"
    4. case obj is nothing
    5. case else
    6. end select


    Das bastelt einmal mit if, einfach nur schrecklich ...

    vanitas-mundi schrieb:

    VB.NET-Quellcode

    1. select case true
    2. case i = 5
    3. case s = "hans"
    4. case obj is nothing
    5. case else
    6. end select


    Das bastelt einmal mit if, einfach nur schrecklich ...
    Das ist allerdings alles schlechter Stil. Auch wenn es "einfacher" ist.
    In C# gibt es dafür jedoch eine Möglichkeit, die es in VB nicht gibt. Man kann dort Kurzformen benutzen.

    PHP-Quellcode

    1. if (true)
    2. MessageBox.Show("Wahr");

    Und schon hat man einen Einzeiler, der folgendem Konstrukt entspräche (in VB):

    VB.NET-Quellcode

    1. If True Then
    2. MessageBox.Show("Wahr")
    3. End If

    Oder es gibt die Möglichkeit, folgendes zu tun:

    PHP-Quellcode

    1. true ? MessageBox.Show("Wahr") : MessageBox.Show("Falsch");

    (Sollte funktionieren, ungetestet :D)
    das entspräche:

    VB.NET-Quellcode

    1. If True Then
    2. MessageBox.Show("Wahr")
    3. Else
    4. MessageBox.Show("Falsch")
    5. End If

    Die Schlussfolgerung aus diesem Ganzen: VB macht es nicht gerade einfach, mit gutem Stil zu programmieren.
    In VB geht übrigens auch das:

    VB.NET-Quellcode

    1. If True Then MessageBox.Show("Wahr")


    und das:

    VB.NET-Quellcode

    1. If True Then MessageBox.Show("Wahr") Else MessageBox.Show("Falsch")


    Das sind auch jeweils Einzeiler.

    Ich persönlich benutze die mehrzeilige Variante nur, wenn ich mehrere Then- oder Else-Befehle habe oder wenn die Zeile extrem lang werden würde.

    Noch was zu Select Case:

    Bei folgenden beiden Code-Beispielen passiert im Prinzip das gleiche:

    VB.NET-Quellcode

    1. Select Case True
    2. Case i = 5
    3. 'irgendwas
    4. Case s = "hans"
    5. 'irgendwas
    6. Case obj Is Nothing
    7. 'irgendwas
    8. Case Else
    9. 'irgendwas
    10. End Select


    VB.NET-Quellcode

    1. If i = 5 Then
    2. 'irgendwas
    3. ElseIf s = "hans" Then
    4. 'irgendwas
    5. ElseIf obj Is Nothing Then
    6. 'irgendwas
    7. Else
    8. 'irgendwas
    9. End If


    jedoch mit dem Unterschied, dass bei "Select Case" die Boolean-Werte mit True verglichen werden. Damit wären wir wieder beim Thema "If move = True Then".

    Wenn man den Vorgang von "Select Case" mit If-Anweisungen genau nachbauen will, müsste man schreiben:

    VB.NET-Quellcode

    1. If (i = 5) = True Then
    2. 'irgendwas
    3. ElseIf (s = "hans") = True Then
    4. 'irgendwas
    5. ElseIf (obj Is Nothing) = True Then
    6. 'irgendwas
    7. Else
    8. 'irgendwas
    9. End If


    Demnach ist auch meiner Meinung nach die "Select Case True"-Methode schlechter Stil.

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