Viele Algorithmen, die beim wissenschaftlichen Rechnen verwendet werden, haben eine andere inhärente Struktur als Algorithmen, die üblicherweise in weniger mathematisch intensiven Formen des Software-Engineerings berücksichtigt werden. Insbesondere einzelne mathematische Algorithmen sind in der Regel hochkomplex und umfassen häufig Hunderte oder Tausende von Codezeilen, enthalten jedoch keinen Zustand (dh sie wirken nicht auf eine komplexe Datenstruktur ein) und können oftmals programmgesteuert zusammengefasst werden Schnittstelle - zu einer einzelnen Funktion, die auf ein Array (oder zwei) wirkt.
Dies legt nahe, dass eine Funktion und keine Klasse die natürliche Schnittstelle zu den meisten Algorithmen ist, die im wissenschaftlichen Rechnen anzutreffen sind. Dieses Argument gibt jedoch wenig Aufschluss darüber, wie die Implementierung komplexer mehrteiliger Algorithmen zu handhaben ist.
Während der traditionelle Ansatz darin bestand, nur eine Funktion zu haben, die eine Reihe anderer Funktionen aufruft und dabei die relevanten Argumente weitergibt, bietet OOP einen anderen Ansatz, bei dem Algorithmen als Klassen eingekapselt werden können. Der Klarheit halber meine ich durch Einkapseln eines Algorithmus in eine Klasse das Erstellen einer Klasse, in der die Algorithmeneingaben in den Klassenkonstruktor eingegeben werden, und dann wird eine öffentliche Methode aufgerufen, um den Algorithmus tatsächlich aufzurufen. Eine solche Implementierung von Multigrid in C ++ - Pseudocode könnte folgendermaßen aussehen:
class multigrid {
private:
x_, b_
[grid structure]
restrict(...)
interpolate(...)
relax(...)
public:
multigrid(x,b) : x_(x), b_(b) { }
run()
}
multigrid::run() {
[call restrict, interpolate, relax, etc.]
}
Meine Frage lautet dann wie folgt: Was sind die Vor- und Nachteile dieser Art von Praxis im Vergleich zu einem traditionelleren Ansatz ohne Unterricht? Gibt es Probleme mit der Erweiterbarkeit oder Wartbarkeit? Zweifellos möchte ich keine Meinung einholen, sondern die nachgelagerten Auswirkungen (dh diejenigen, die möglicherweise erst auftreten, wenn eine Codebasis ziemlich groß wird) einer solchen Codierungspraxis besser verstehen.