De nombreux algorithmes utilisés dans le calcul scientifique ont une structure inhérente différente de celle des algorithmes couramment considérés dans les formes de génie logiciel moins gourmandes en mathématiques. En particulier, les algorithmes mathématiques individuels ont tendance à être très complexes, impliquant souvent des centaines ou des milliers de lignes de code, mais n'impliquent néanmoins aucun état (c'est-à-dire qu'ils n'agissent pas sur une structure de données complexe) et peuvent souvent être résumés - en termes de programmation interface - à une seule fonction agissant sur un tableau (ou deux).
Cela suggère qu'une fonction, et non une classe, est l'interface naturelle de la plupart des algorithmes rencontrés dans le calcul scientifique. Pourtant, cet argument offre peu de renseignements sur la façon dont la mise en œuvre d'algorithmes complexes en plusieurs parties doit être gérée.
Alors que l'approche traditionnelle consistait à avoir simplement une fonction qui appelle un certain nombre d'autres fonctions, en passant les arguments pertinents en cours de route, la POO propose une approche différente, dans laquelle les algorithmes peuvent être encapsulés en tant que classes. Pour plus de clarté, en encapsulant un algorithme dans une classe, je veux dire créer une classe dans laquelle les entrées de l'algorithme sont entrées dans le constructeur de classe, puis une méthode publique est appelée pour réellement invoquer l'algorithme. Une telle implémentation de multigrid en psuedocode C ++ pourrait ressembler à:
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.]
}
Ma question est alors la suivante: quels sont les avantages et les inconvénients de ce type de pratique par rapport à une approche plus traditionnelle sans cours? Y a-t-il des problèmes d'extensibilité ou de maintenabilité? Pour être clair, je n'ai pas l'intention de solliciter l'opinion, mais plutôt de mieux comprendre les effets en aval (c'est-à-dire ceux qui pourraient ne pas se produire jusqu'à ce qu'une base de code devienne assez grande) d'adopter une telle pratique de codage.