Objektorientierte Programmierung ist zur Zeit ein Allheilmittel - obwohl es diese Methodik seit viel mehr als zehn Jahren gibt. Im Kern geht es um wenig mehr als darum, endlich die Prinzipien guter Programmierung anzuwenden, die man seit mehr als 20 Jahren beherrscht. Es stellt sich aber heraus daß man mit ANSI C schlicht und einfach weiter kommt als mit C++. C wurde ursprünglich von Dennis Ritchie im Anhang von [K&R83] definiert. Der ANSI C Standard erschien ungefähr zehn Jahre später und führte bestimmte Änderungen und Erweiterungen ein. ANSI C legt fest, daß Namen fast beliebig lang sein können. Namen, die mit einem Unterstrich beginnen, sind für Bibliotheken vorgesehen, das heißt , sie sollten nicht im Benutzerprogrammen verwendete werden. Global vereinbarte Namen kann man mittels eines Befehls in einer Quelldatei verstecken.
ANSI C erlaubt verlangt aber nicht daß bei der Vereinbarung von Funktionen die Parameter direkt in der Parameterliste deklariert werden. Funktionsdeklarationen legen damit auch die Typen ihrer Parameter fest Optional und ohne Einfluß auf die Funktionsdefinition können auch die Parameternamen angegeben werden. Bei C und C++ reichen die portablen Möglichkeiten nicht aus. ANSI C wird benutzt um besonders objektorientiert zu programmieren Nur objektorientiertes Programmieren ermöglicht es Code von Projekt zu Projekt weiterzugeben.. Zu dieser Programmierung braucht man eine ganze Menge stilisierten Code. Die Namen können sich ändern aber die Struktur bleibt gleich. Durch einen eigenen Präprozessor werden wie bei C einige Arbeitsvorgänge durchgeführt. Dieser Präprozessor schreibt am Ende den gleichen ANSI Code wie er auch von Hand geschrieben werden könnte.
. Abstrakte Datentypen Für den abstrakten Datentyp verbirgt sich sämtlicher Aspekt seiner Implementierung, wir zum Beispiel die Repräsentierung der einzelnen Werte, vor dem Anwendungsprogramm. Eine Anwendung hat nur Zugriff auf eine Definitionsdatei, in der ein Zeiger den Datentyp repräsentiert, und in der Operationen für den Datentyp als Funktionen deklariert sind, die generische Zeiger akzeptieren und liefern.
. Dynamische Bindung, Generische Funktion Es werden hier auf eine einfache Weise Zeichenketten implementiert. Für diese Zeichenkette wird ein dynamischer Puffer angelegt, der dann den Text enthält. Wenn die Zeichenkette gelöscht wird, muß der dynamische Puffer freigegeben werden. Wenn ein Zeiger auf ein Objekt besteht, kann mit Hilfe der dynamischen Bindung typenspezifische Funktionen finden. Jedes Objekt beginnt mit einer Beschreibung, die Zeiger auf Funktionen enthält, die auf das Objekt angewendet werden.
. Arithmetische Ausdrücke Dynamische Bindung ist ganz allein eine sehr mächtige Programmiertechnik. An Stelle von wenigen Funktionen, die jeweils einen großen switch für viele Spezialfälle enthalten, können hier viel kleine Funktionen schrieben, die immer nur ein Fall bearbeiten müssen. Mit dynamischer Bindung sorgen man dafür, daß die korrekte Funktion aufgerufen wird. Diese Technik vereinfacht Routineaufgaben, und sie resultiert normalerweise in Code, der sich sehr leicht erweitern läßt. Dynamische Bindung kann sehr gut helfen, ein Problem in viele einfache Funktionen zu zerlegen. Ein daraus resultierendes Programm kann sehr leicht erweitert werden.
. Der ooc Präprozessor Es gibt eine Vielzahl von Konventionen, wie bestimmte Funktionen geschrieben werden müssen und welche zusätzlichen Funktionen nötig sind (Selektoren, Initialisierung). Der Präprozessor hilft, die verscheidenden Konventionen einzuhalten. Der ooc hat nicht die Aufgabe jetzt einen neue Programmiersprache einzuführen, nur die Ausgabe von diesem Präprozessor könnte ebenso von Hand geschrieben es ist ANSI-Code. Es werden hier nur langweilige Routinen durch ein geeignetes Werkzeug erledigt. Wenn Codierstandards dazu führen, daß Teile eines Programms mechanisch erzeigt werden können, dann sollte man das auch tun.
. Lecks in der Speicherverwaltung Moderne Arbeitsplatzrechner haben sehr viel Hauptspeicher. Wenn ein Programm hier und dort ein Byte verliert, macht das wahrscheinlich nicht viel aus. Lecks in der Speicherverwaltung sind aber normalerweise Anzeichen für Fehler in den Algorithmen entweder reagiert das Programm falsch auf unerwartete Eingaben, oder noch schlimmer, das Programm ist versehentlich so entworfen, daß es Verbindungen zu dynamisch beschafften Speicher abbricht.
. Fehlerbehandlung mit System Moderne Programmiersprachen Wie Eiffel oder C++ verfügen über eine besondere Syntax zur Fehlerbehandlung. Bevor eine riskante Aktion versucht wird, führt man eine Fehler Behandlungsroutine ein. Während der riskanten Aktion können Software oder Hardware einen Fehler auslösen und damit die Fehlerbehandlung zu Fall bringen. Theoretische gibt es danach drei Möglichkeiten
1. Terminieren und zwar beides. Die Fehlerbehandlung und sowohl auch die riskante Aktion.
Fehlerbehandlung mit Terminierung kann in ANSI C sehr leicht durchgeführt werden.
2. Fortsetzen der riskanten Aktion unmittelbar nach dem Punkt, wo der Fehler entstand und die Fehlerbehandlung ausgelöst wurde.
3. Wiederholen der riskanten Aktion, die den Fehler verursacht hat.
4 |