科学計算で使用される多くのアルゴリズムは、ソフトウェア工学のあまり数学集約型ではないと一般的に考えられているアルゴリズムとは異なる固有の構造を持っています。特に、個々の数学アルゴリズムは非常に複雑になる傾向があり、多くの場合、数百行または数千行のコードが含まれますが、状態は含まれません(つまり、複雑なデータ構造に作用しません)。インターフェイス-配列(または2つ)に作用する単一の関数へ。
このことは、クラスではなく、関数が科学計算で遭遇するほとんどのアルゴリズムへの自然なインターフェースであることを示唆しています。しかし、この議論は、複雑なマルチパートアルゴリズムの実装がどのように処理されるべきかについてほとんど洞察を提供しません。
従来のアプローチは、他の多くの関数を呼び出す1つの関数を使用して、関連する引数を途中で渡すだけでしたが、OOPはアルゴリズムをクラスとしてカプセル化できる別のアプローチを提供します。明確にするために、アルゴリズムをクラスにカプセル化するということは、アルゴリズム入力がクラスコンストラクターに入力され、パブリックメソッドが呼び出されて実際にアルゴリズムを呼び出すクラスを作成することを意味します。このようなC ++ psuedocodeでのマルチグリッドの実装は次のようになります。
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.]
}
私の質問は次のとおりです。クラスを使用しない従来のアプローチと比較して、この種のプラクティスの利点と欠点は何ですか?拡張性や保守性の問題はありますか?明確にするために、私は意見を求めるつもりはありませんが、そのようなコーディング手法を採用することのダウンストリーム効果(つまり、コードベースが非常に大きくなるまで生じない効果)をよりよく理解するつもりです。