Visual Basic/De structuur van een programma
De structuur van een programma
Inleiding programmastructuur
Een programma als één groot geheel is onoverzichtelijk. Daarom worden programma's verdeeld in logische blokken die een bepaalde functie uitvoeren. Zo'n blok noemen we een procedure. Procedures worden veel gebruikt bij objecten. Neem de volgende instructie:
Form1.Show()
Als deze instructie wordt uitgevoerd, wordt de procedure Show van het component Form1 aangeroepen.
Maar je kunt ook zelf procedures schrijven om een bepaalde taak uit te voeren, bijvoorbeeld het uitvoeren van een ingewikkelde berekening of het openen van een bestand. Zo'n procedure schrijf je apart van je hoofdprogramma. Waar nodig roep je in het hoofdprogramma die procedure aan.
Procedures zijn er in drie soorten:
- Subroutines
- Functies
- Property-procedures
Subroutines
Een subroutine is een procedure die geen waarde teruggeeft. Een voorbeeld:
Console.Writeline("Dit is een test")
WriteLine is een subroutine en is een onderdeel van de klasse Console.
Achter de naam van de subroutine kun je argumenten ofwel parameters opgeven: gegevens die aan de subroutine worden doorgegeven om te verwerken. Zo'n argument kan bestaan uit onder andere getallen, teksten of variabelen. Het type van elk argument moet overeenkomen met het type in de definitie van de Sub-instructie.
Nu een voorbeeld van een subroutine die je in je programma kunt gebruiken. Stel, je wilt tijdens het uitvoeren van je programma tekst naar een logbestand schrijven, zodat je later kunt zien wat er allemaal gebeurt is. Het schrijven naar het logbestand kun je gemakkelijk doen met onderstaande subroutine:
Sub LogOpslaan(tekst as String, bestandsnaam As String) Dim StreamWriter As System.IO.StreamWriter streamWriter = New System.IO.StreamWriter(bestandsnaam, append) streamWriter.Write(tekst) streamWriter.Close() End Sub
Het is nu abracadabra, maar het werken met bestanden, zoals hier gebeurt, wordt later in het handboek uitgebreid behandeld.
De eerste twee regels van de subroutine maken een variabele StreamWriter aan die verwijst naar het opgegeven bestand. De append in de tweede regel geeft aan dat de tekst moet toegevoegd worden aan het bestand. Als dit wordt weggelaten, wordt het bestand steeds overschreven en dat is hier niet de bedoeling.
De twee volgende regels voegen de tekst de aan het bestand en sluiten het bestand.
De subroutine wordt als volgt aangeroepen:
LogOpslaan("De verwerking van xxx wordt nu gestart", "D:\mijnlog.txt")
Steeds als je deze subroutine aanroept, wordt de opgegeven tekst toegevoegd aan het opgegeven bestand. Als het bestand nog niet bestaat, wordt een leeg bestand aangemaakt met de opgegeven naam.
Het is ook mogelijk om de naam van het bestand op te nemen in de subroutine, waardoor je bij de aanroep maar één parameter nodig hebt (de tekst), wat in principe eenvoudiger is. Maar door de bestandsnaam op te geven, kun je meerdere bestanden gebruiken. Zo kun je bijvoorbeeld een logbestand hebben met de voortgang en een tweede logbestand met de foutmeldingen, bijvoorbeeld:
LogOpslaan("De verwerking is gestart", "D:\mijnlog.txt") ... LogOpslaan("Er is geprobeerd te delen door 0 in subroutine xxx", "D:\mijnlogfout.txt")
Functies
Een functie is een procedure die een waarde teruggeeft. Omdat een functie een waarde van een bepaald type teruggeeft, moet je ook het type van de functie aangeven.
Net als bij subroutines kun je ook bij functies argumenten meegeven tussen de haakjes van de aanroep.
Stel, je moet op diverse plaatsen in je programma een voornaam, eventueel tussenvoegsel en achternaam samenvoegen tot één geheel. Dit kun je doen met onderstaande functie:
Function VolledigeNaam(voornaam As String, tussenvoegsel as String, achternaam As String) As String Dim samengesteld As String = "" samengesteld = voornaam If tussenvoegsel.Length > 0 samengesteld = samengesteld & " " & tussenvoegsel End If samengesteld = samengesteld & " " & achternaam Return samengesteld End Function
In de declaratie van de functie worden de parameters vermeld tussen haakjes. Achter de haakjes staat As String. Dit geeft aan dat het type van de functie een string is.
Vervolgend wordt de variabele samengesteld aangemaakt en gevuld met de voornaam.
In de If-opdracht wordt gekeken of de lengte van het tussenvoegsel groter dan 0 is. In dat geval wordt het tussenvoegsel toegevoegd aan samengesteld.
Vervolgens wordt in de regel Return samengesteld de samengestelde naam teruggegeven en de functie beëindigd.
De functie wordt als volgt gebruikt:
naam1 = VolledigeNaam("Jan", "", "Janssen") ' levert op: "Jan Janssen" naam2 = VolledigeNaam("Piet", "van", "Veen") ' levert op: "Piet van Veen"
Natuurlijk kun je als parameters variabelen gebruiken in plaats van strings (dat is ook normaal in een programma), bijvoorbeeld:
naam = VolledigeNaam(naam, tussenvoegsel, achternaam)
Property-procedures
Een property-procedure is de procedure die wordt uitgevoerd wanneer een property (eigenschap) van een klasse wordt gelezen of gewijzigd. Omdat dit een onderdeel is van objecten, wordt het daar in het handboek behandeld.
Exit sub, Exit Function en Exit Property
Je kunt een procedure verlaten voordat je het einde bereikt met de Exit-instructie. Afhankelijk van het soort procedure gebruik je hiervoor Exit Sub, Exit Function of Exit Property. Het programma gaat dan verder met de volgende instructie na het aanroepen van de betreffende procedure. Een voorbeeld:
Sub SluitProgramma() ' Kijk eerst of gegevens opgeslagen moeten worden If dataGewijzigd = False Then Exit Sub End If ' Hier komt de code om de gegevens op te slaan ' voordat het programma gesloten wordt ... End Sub
Meestal is het mogelijk om de code zo aan te passen dat de Exit-instructie niet nodig is. Dat is ook meestal een duidelijker manier van programmeren.