Programmierparadigmen
Prozedurale Programmierung
Bei der prozeduralen Programmierung wird der Code in Funktionen und Prozeduren aufgeteilt. Dies erlaubt es, Code wiederzuverwenden und die Struktur des Programms zu verbessern. Es ist nicht notwendig, bestimmte Programmteile zu kopieren und zu wiederholen.
Oft genutzte Funktionen werden in Bibliotheken zusammengefasst und können per Import eingebunden werden.
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}Diese Methode der Programmierung dient dazu, die Struktur des Programms zu verbessern und die Lesbarkeit zu erhöhen.
Ohne Funktionen
if((d1.jahr > d2.jahr) || (d1.jahr == d2.jahr && d1.monat > d2.monat) || (d1.jahr == d2.jahr && d1.monat == d2.monat && d1.tag > d2.tag)) {
return 1;
}
return 0;Probleme: Globale Variablen
Programme sind einfacher zu verstehen, wenn Sie kurz, in sich geschlossen und aus unabhängigen Teilen bestehen.
Bei globalen Variablen kann es zu folgenden Problemen kommen:
- Voneinander abhängige Funktionen
- Unklarer Informationsfluss
- Änderungen an einer Funktion können Auswirkungen auf andere Funktionen haben
- Keine Zugriffskontrolle
In C und C++ gibt es dafür unterschiedliche Lösungen:
- C: Module, incomplete data types
- C++: Klassen, Schutztypen (private, protected), Namespaces
Modulare Programmierung
Die modulare Programmierung ist eine Erweiterung der prozeduralen Programmierung. Einzelne Module können geplant, programmiert und getestet werden. Universelle Module müssen nur einmal geschrieben werden und können dann immer wieder verwendet werden.
Beispiel:
Eine Liste besitzt die folgenden Attribute: next, size, values, error
Die modularen Funktionen dieser Liste sind: append(), getValueAt(), erase(), getError(), toScreen()
struct List {
int next;
int size;
int values[];
int error;
};
void append(List *list, int value) {
if (list->size >= MAX_SIZE) {
list->error = 1;
return;
}
list->values[list->size] = value;
list->size++;
}
int getValueAt(List *list, int index) {
if (index < 0 || index >= list->size) {
list->error = 2;
return 0;
}
return list->values[index];
}
void erase(List *list, int index) {
if (index < 0 || index >= list->size) {
list->error = 3;
return;
}
for (int i = index; i < list->size - 1; i++) {
list->values[i] = list->values[i + 1];
}
list->size--;
}
int getError(List *list) {
return list->error;
}
void toScreen(List *list) {
for (int i = 0; i < list->size; i++) {
std::cout << list->values[i] << std::endl;
}
}