Modularisierung von Programmen Der Quelltext des Betriebssystems Windows 2000® umfasst ca. 29.000.000 Quelltextzeilen... Modernere Betriebssysteme (zumindest für PCs) sind sicher nicht simpler! Komplexere Programme werden in einzelne Programmteile (Module) gegliedert. Diese Modularisierung bietet eine Reihe von Vorteilen: • • • • • • Die Programme werden übersichtlicher (Voraussetzung: Die Programmteile sind nicht willkürlich festgelegt, sondern jedes Modul realisiert einen bestimmten (relativ abgeschlossenen) Teil des Programmes.) Programme können effektiv von Teams entwickelt werden (Voraussetzung: Die Teammitglieder haben sich u.a. abgestimmt, welches Modul welche Funktionen realisiert und wie die Schnittstellen zwischen den Programmteilen funktionieren.) Die Wartung von Programmen wird einfacher (Ein Programm durchläuft einen sogenannten Software-Lebenszyklus, d.h. es ist im allgemeinen nach seiner „Fertigstellung“ nicht völlig fehlerfrei (man denke an ein bekanntes Betriebssystem ;-) und kann oft nicht längere Zeit ohne Veränderungen/ Erweiterungen benutzt werden. Nachträgliche Veränderungen an einem Programm werden als Wartung bezeichnet. Eine gute Modularisierung erleichtert diese erheblich.) Bestimmte Programmteile können mehrfach verwendet werden (Gemeint ist hier die Verwendung von vordefinierten Programmbibliotheken (Units, Header-Dateien) und von selbst definierten Funktionen bzw. Prozeduren.) Mit modularen Programmen ist eine effektivere Nutzung des Arbeitsspeichers möglich (z.Bsp. dynamic link libraries – DLL's) Unabdingbare Vorrausetzung für objektorientierte Programmierung Die einfachsten Arten von Unterprogrammen (Modulen) in Pascal sind die Prozeduren (procedure) und Funktionen (function). Prozeduren besitzen in der Regel Eingabewerte (EingabeParameter) und Rückgabewerte (Rückgabe-Parameter). Funktionen besitzen eine spezielle Methode der Rücgabe für genau einen Rückgabewert. Eine Prozedur/ Funktion kann mehrfach (mit verschiedenen Eingabewerten) aufgerufen werden. Syntax einer Prozedur in Pascal: procedure Prozedurname ([para1:Typ1,][para2:Typ2,...,][paraN:TypN]); [var: Deklaration lokaler Variablen] begin Anweisungen... end; Aufruf: Prozedurname ([para1,][para2,...,][paraN:]); Syntax einer Funktion in Pascal: function Funktionsname ([para1:Typ1,][para2:Typ2,...,][paraN:TypN]): Funktionstyp; [var: Deklaration lokaler Variablen] begin Anweisungen... end; Aufruf: Ergebnisvariable := Funktionsname ([para1,][para2,...,][paraN:]); Bemerkungen: • Bei allgemeinen Syntaxbeschreibungen stehen fett geschriebene Wörter für Schlüsselwörter, kursiv geschriebene Wörter sind „frei wählbare“ Bezeichner und in eckigen Klammern stehende Ausdrücke können weggelassen werden (Wenn diese Ausdrücke verwendet werden, dann ohne die eckigen Klammern!). • para1, para2,..., paraN sind so genannte formale Parameter und stellen die Eingabewerte der Prozedur/ Funktion dar. • Rückgabeparameter müssen so genannte Variablenparameter (call by referenz – mit var vor der Deklarationsanweisung) sein. • Ereignisprozeduren (von Lazarus automatisch erzeugte „Prozedurrahmen“ wie Button1.Click) besitzen eine spezielle vordefinierte Parameterangabe (Sender: TObject). Diese darf nicht verändert werden. Bsp.: Prozedurdeklaration Rückgabeparameter ... procedure summe (a,b:Integer; var c:Integer); begin c := a + b; end; Übergabe der aktuellen Parameterwerte an die Prozeduraufruf formalen Parameter * (i.a. in einer summe(s1,s2,s); Ereignisprozedur) ... Prozeduraufruf * Die hier verwendete Art der Übergabe der Werte der Variablen s1 und s2 (aktuelle Parameterwerte) an die formalen Parameter der Prozedur/ Funktion bezeichnet man auch als Wertparameterübergabe (call by value). Die Namen der aktuellen und der formalen Parameter müssen nicht übereinstimmen – die Übergabe erfolgt in der Reihenfolge der Aufzählung. Die Anzahl der aktuellen und der formalen Parameter stimmt überein. Eine Wertparameterübergabe ist auch mit Konstanten oder Ausdrücken möglich, z.Bsp.: summe(2,y*z,s);