Visual Basic .NET: Konzepte der OOP
Zuerst möchte ich Sie beglückwünschen. Mit den ganzen Operatoren, Datentypen und Kontrollstrukturen verfügen Sie über genug Basiswissen, um sich in Visual Basic komplexeren Themen zuzuwenden, vor allem der objektorientierten Programmierung. Zum Glück setzt alles Folgende größtenteils auf den bereits bekannten Elementen wie Variablen und Funktionen auf. Gerade deshalb lohnt ein Blick zurück. Scheuen Sie sich also nicht, noch einmal in den vorherigen Kapiteln nachzublättern, wenn Sie etwas nicht gleich verstehen.
Eine Programmiersprache folgt immer bestimmten Grundprinzipien, sogenannten Programmierparadigmen. Visual Basic .NET orientiert sich im Wesentlichen an 6 Paradigmen, von denen wir 3 bereits unbewusst kennengelernt haben:
- Die imperative Programmierung sieht ein Programm als eine Abfolge von Befehlen an, bei der immer klar feststeht, welcher Befehl als nächstes ausgeführt wird. Imperative Programmierung stellt das Wie in den Vordergrund, das heißt, der Programmierer teilt dem Computer durch das Programm mit, wie ein bestimmtes Problem gelöst werden soll. Diese Idee ist der historisch älteste Ansatz, und wird heute von fast allen Programmiersprachen benutzt. Ihm gegenüber steht das relativ junge Paradigma der deklarativen Programmierung. Er stellt das Was in den Vordergrund, das heißt, der Programmierer teilt dem Computer nur mit, was für ein Problem gelöst werden soll. Der Computer sucht dann selbstständig (aber nach vorgegebenen Mustern) nach einer Antwort.
- Die strukturierte Programmierung führt Kontrollstrukturen wie Schleifen und Bedingungen ein, um den Programmablauf zu regeln. Früher wurden stattdessen sogenannte GOTO-Anweisungen verwendet, mit denen man an einen durch eine Marke markierten Punkt des Programmes springen konnte. Als andere Sprachen längst bewiesen hatten, dass GOTO unnötig ist, wenn man Kontrollstrukturen hat, hielt BASIC am GOTO fest, da dieses Konzept einfacher zu erlernen war. Auch heute ist in Visual Basic die GOTO-Anweisung noch vorhanden. Ihre Verwendung ist aber nicht nur unnötig, sondern auch allgemein verpönt, da der Code durch viele GOTOs (die in professionellen BASIC-Programmen immer in großer Zahl vorkamen) undurchsichtig und verworren wird.
- Die prozedurale Programmierung spaltet Programme in kleinere Teilaufgaben auf, namentlich Prozeduren und Funktionen. Die entstehenden Teilaufgaben sind wiederverwendbar, zum Beispiel können Sie die Funktionen zur Berechnung der Fakultät oder der Fibonaccifolge ohne Probleme in ein anderes Visual-Basic-.NET-Programm übernehmen.
Als Weiterentwicklung der prozeduralen Programmierung gilt die modulare Programmierung. Hier werden thematisch zueinander gehörende Prozeduren zu einem Modul zusammengefasst, dass wie die einzelne Prozedur ebenfalls wiederverwendbar ist. Mit der Modularität von Programmen will man vor allem der wachsenden Größe von Softwareprojekten Herr werden, die oft mehrere Millionen Codezeilen umfassen. Die Modularität findet man dabei sowohl auf Codeebene (Codemodule) als auch auf Dateiebene (Programmbibliotheken, unter Windows vor allem als DLL).
Zwei weitere Paradigmen werden wir noch kennenlernen, die objektorientierte und die generische Programmierung. In die Grundkonzepte der objektorientierten Programmierung werde ich Sie schon jetzt einführen, da dieses Thema eine wichtige Grundlage ist für das nächste große Thema auf dem Stundenplan: die Programmierung (oder vielmehr Erstellung, denn viel ist daran nicht mehr zu programmieren) von Windows-Oberflächen.
Objekte
[Bearbeiten]Bis jetzt habe ich immer nur von Objekten gesprochen, wenn es um objektorientierte Programmierung (OOP) geht. Das ist nicht ganz richtig. Man muss ein Objekt von einer Klasse unterscheiden (denken Sie an das Class-Schlüsselwort in der Codezeile Private Class Form1
). Objekte der OOP sind in einer Hinsicht wie normale Variablen, denn Sie können bestimmte Werte speichern. Anders als normale Variablen ist die Anzahl an möglichen gleichzeitig gespeicherten Werten theoretisch unbegrenzt. (Technisch werden einzelne Werte wieder durch je eine Variable realisiert.) In einer zweiten Hinsicht sind Objekte besser als Variablen: Sie können neben Werten auch Methoden beinhalten. Das sind Funktionen, die dem Objekt zugeordnet sind und bestimmte Aufgaben an oder mit diesem Objekt erfüllen. Methoden und Werte eines Objektes werden als Member (engl. member = Mitglied) bezeichnet. Alle Member sind im Objekt gekapselt und bilden so eine logische Einheit.
Ein Problem bleibt: Wie weiß man, was für Member ein Objekt hat? Dafür gibt es Klassen. Klassen sind gewissermaßen die Baupläne für Objekte. Ein hier gern gewähltes Beispiel ist das der Autofabrik. Es gibt einen Konstruktionsplan für das gewünschte Automodell, nach dem Tausende von gleichen Autos produziert werden können. Ein Programm kann auf Basis einer Klasse zur Laufzeit Tausende von gleichen Objekten erzeugen. Die Klassendefinition enthält die Deklarationen (und ggf. Startwerte) der Membervariablen und die Deklaration und Definition der Memberfunktionen (Methoden). Die Klasse ist also das, was der Programmierer schreibt.
Um Ihnen ein praktisches Beispiel zu geben: Ein Formular (also ein Fenster auf dem Windows-Desktop) ist in Visual Basic .NET als Klasse implementiert. Die Klasse gibt an, dass ein Formular z.B. eine Höhe, Breite (zwei Eigenschaften vom Typ Integer) und einen Titel hat (eine Eigenschaft vom Typ String) und über gewisse Funktionen (Methoden) verfügt, etwa zum Öffnen und Schließen.
Visual Basic .NET verfügt über viele nützliche Aufbauten auf dieses Konzept, die das Programmieren intuitiver, einfacher und logischer machen. Dazu zählen Eigenschaften (nach dem engl. Begriff auch Properties). Eigenschaften verhalten sich nach außen wie Variablen, d.h. man kann sie mit Werten belegen und die Werte abrufen. Wenn man das aber tut, wird nicht nur ein Wert gespeichert oder geladen, sondern eine spezielle Funktion ausgeführt. So verfügt ein Formular nicht über Funktionen wie Minimieren, Maximieren und Wiederherstellen, sondern über die Property WindowState (engl. Fensterstatus). Wenn der Wert von WindowState geändert wird (z.B. von minimiert auf maximiert), wird das Fenster automatisch entsprechend angeordnet.