Sollte man Schleifen-Laufvariablen vorher deklarieren?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    VB.NET-Quellcode

    1. Dim i as Integer
    2. For i = 0 to 50
    3. Next i
    ist dann angebracht, wenn du das i nach der Schleife noch verwenden willst, um beispielsweise zu wissen, wie weit die Schleife lief.
    Wenn du es nur in der Schleife benötigst, kannst du auch

    VB.NET-Quellcode

    1. For i As Integer = 0 To 50
    verwenden.
    Oder, wenn Option Infer = On aktiviert ist, ganz ohne Deklaration:

    VB.NET-Quellcode

    1. For i = 0 To 50
    Dann zieht er den Datentyp aus den Schleifenbegrenzungen 0 und 50
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Es gibt ein generelles Programmier-Prinzip: Kapselung - gerne google das (oder noch besser: Wikipedia).
    Für Deklarationen bedeutet das: "immer so lokal wie möglich."
    In

    VB.NET-Quellcode

    1. Dim i as Integer
    2. For i = 0 to 50
    3. 1=1
    4. Next
    ist i ausserhalb der Schleife sichtbar.
    Wie petaod sagt, kann es sein, dass das erforderlich ist - in dem Falle entspricht obiges dem Pattern "so lokal wie möglich", weil noch lokaler ist ja nicht möglich, weil i wird ja noch weiterverwendet.

    Wird i im Nachgang nicht weiterverwendet (was meist der Fall ist), so wäre

    VB.NET-Quellcode

    1. For i = 0 to 50
    2. 1=1
    3. Next
    die korrekte Lösung, denn hier ist i ausserhalb der Schleife (wo es ja nicht gebraucht wird) auch nicht sichtbar.

    Das Kapselungs-Prinzip ist fundamental - befolge es in jeder Code-Zeile.
    Es gilt sogar im richtigen Leben: Wenn es nicht nötig ist, dass mein Chef sieht, wie ich meine Arbeit mache, dann soll er es auch garnet sehen können.
    (Wenn es aber doch nötig ist, dann ists eben nötig, also auch der zweite Halbsatz ist fundamental: "...wie möglich".

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @Haudruferzappeltnoch Und auf dem, was EDR sagt, basiert auch alles Weitere. Wenn du Klassen schreibst, sollten nicht alle Variablen Public sein – was interessiert es Form1.vb, wie genau die Klasse alles bewerkstelligt. Es muss nur die Function (Bspl.)MeineKlasse.Seitedrucken() aufrufbar sein. Auch hier kann es sein, dass nunmal etwas nötig ist. Aber so privat wie möglich.

    Natürlich gibt es auch gemischte Situationen statt nur private oder public. Zum Beispiel kann ein Hausmeister ein vom Vermieter gestelltes Budget selbst ausgeben, ohne für jede Kleinigkeit anrufen zu müssen. Für mittelschwere Reparaturen muss er jedoch den Vermieter oder den Sohn des Vermieters anrufen und drum bitten. Der Sohn weiß dann, was an Geld da ist. Ganz große Reparaturen kann nur der Vermieter selbst entscheiden (nicht der Sohn).
    Das mal schnell auf Quellcode übertragen:

    Form1.vb

    VB.NET-Quellcode

    1. Public NotInheritable Class FormMain
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim Hans As New ClassVermieter
    4. Dim Tom As New ClassVermietersSohn
    5. 'einfach abrufbar
    6. Dim NochGuthaben As UInt16 = Hans.Hausmeisters_Budget_fuer_Kleinreparaturen - 200US
    7. Dim bekommenesGeld1 As UInt16 = Hans.MittlereSachebeurteilen("Leider ist die Heizung kaputt")
    8. ' Sohn anrufen, weil Vater nicht erreicht. ER darf das aber auch entscheiden (protected).
    9. ' Ich muss dennoch einen von beiden um Erlaubnis bitten (protected).
    10. Dim bekommenesGeld2 As UInt16 = Tom.FuerVaterMittlereSachebeurteilen("Leider ist die Heizung kaputt")
    11. ' Sohn kann eine große Reparatur nicht entscheiden – nur der Vermieter.
    12. Dim bekommenesGeld3 As UInt16 = Tom.FuerVaterGrosseSachebeurteilen("Leider ist die Heizung kaputt!")
    13. Dim bekommenesGeld4 As UInt16 = Hans.GrosseSachenbeurteilen("Leider ist die Heizung kaputt!")
    14. End Sub
    15. End Class

    ClassVermieter.vb

    VB.NET-Quellcode

    1. Public Class ClassVermieter
    2. ''' <summary>
    3. ''' natürlich privat
    4. ''' </summary>
    5. Private Vermoegen As UInt32
    6. ''' <summary>
    7. ''' pro Monat
    8. ''' </summary>
    9. Public Property Hausmeisters_Budget_fuer_Kleinreparaturen As UInt16 = 500US
    10. '–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    11. Protected Property Erlaubnis_fuer_mittere_Reparaturen As UShort
    12. '–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    13. Private Erlaubnis_fuer_grosse_Reparaturen As UInt16
    14. 'Nimmt Anruf von Hausmeister entgegen
    15. Public Function MittlereSachebeurteilen(ByVal NachrichtVomHausmeister As String) As UInt16
    16. Erlaubnis_fuer_mittere_Reparaturen = 1000US
    17. Return Erlaubnis_fuer_mittere_Reparaturen
    18. End Function
    19. 'Nimmt Anruf von Hausmeister entgegen
    20. Public Function GrosseSachenbeurteilen(ByVal NachrichtVomHausmeister As String) As UInt16
    21. Erlaubnis_fuer_grosse_Reparaturen = 5000US
    22. Return Erlaubnis_fuer_grosse_Reparaturen
    23. End Function
    24. End Class

    ClassVermietersSohn.vb (erbt von Vater ClassVermieter)

    VB.NET-Quellcode

    1. Public Class ClassVermietersSohn : Inherits ClassVermieter
    2. ''' <summary>
    3. ''' natürlich privat
    4. ''' </summary>
    5. Private SohnsVermoegen As UInt32
    6. Private ReadOnly garnichts As UInt16 = 0US
    7. 'Nimmt Anruf von Hausmeister entgegen
    8. Public Function FuerVaterMittlereSachebeurteilen(ByVal Nachricht_vom_Hausmeister As String) As UInt16
    9. Erlaubnis_fuer_mittere_Reparaturen = 1000US
    10. Return Erlaubnis_fuer_mittere_Reparaturen
    11. End Function
    12. 'Nimmt Anruf von Hausmeister entgegen
    13. Public Function FuerVaterGrosseSachebeurteilen(ByVal Nachricht_vom_Hausmeister As String) As UInt16
    14. Return garnichts 'Tja, war nix, denn der Sohn kann die großen Beträge nicht rausgeben (nicht sehen)!
    15. End Function
    16. End Class


    Was man noch verbessern müsste: Ich kann in Form1.vb noch schreiben
    Tom.GrosseSachenbeurteilen("") was ja nicht gehen darf. Hmm, müsste man mal schauen. Aber du verstehst das Prinzip, denke ich :)

    Ich habe das Projekt bereinigt und gezippt hochgeladen. Kannst ja mal durchsteppen. :)
    Dateien
    Komm ich hau auch noch einen raus… :thumbup:

    de.m.wikipedia.org/wiki/Prinzi…_Designs#SOLID-Prinzipien
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen