Wiele algorytmów wykorzystywanych w obliczeniach naukowych ma inną wewnętrzną strukturę niż algorytmy powszechnie uważane za mniej wymagające matematyki formy inżynierii oprogramowania. W szczególności poszczególne algorytmy matematyczne są zwykle bardzo złożone, często obejmują setki lub tysiące wierszy kodu, ale mimo to nie obejmują żadnego stanu (tj. Nie działają na złożoną strukturę danych) i często można je sprowadzić - pod względem programowym interfejs - do pojedynczej funkcji działającej na tablicę (lub dwie).
Sugeruje to, że funkcja, a nie klasa, jest naturalnym interfejsem dla większości algorytmów spotykanych w obliczeniach naukowych. Jednak ten argument nie daje wglądu w sposób, w jaki należy obsługiwać implementację złożonych, wieloczęściowych algorytmów.
Podczas gdy tradycyjnym podejściem było po prostu posiadanie jednej funkcji, która wywołuje wiele innych funkcji, przekazując odpowiednie argumenty po drodze, OOP oferuje inne podejście, w którym algorytmy mogą być enkapsulowane jako klasy. Dla jasności, enkapsulując algorytm w klasie, mam na myśli stworzenie klasy, w której dane wejściowe algorytmu są wprowadzane do konstruktora klasy, a następnie wywoływana jest metoda publiczna w celu faktycznego wywołania algorytmu. Taka implementacja multigrid w psuedocode C ++ może wyglądać następująco:
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.]
}
Moje pytanie brzmi zatem: jakie są zalety i wady tego rodzaju praktyki w porównaniu z bardziej tradycyjnym podejściem bez zajęć? Czy istnieją problemy związane z rozszerzalnością lub konserwacją? Żeby było jasne, nie zamierzam zabiegać o opinię, ale raczej lepiej rozumieć dalsze skutki (tj. Te, które mogą się nie pojawić, dopóki baza kodów nie stanie się dość duża) przyjęcia takiej praktyki kodowania.