私は、本質的に非常に柔軟である必要があるコードに取り組んでいます。つまり、後で他の人が拡張するのも非常に簡単です。しかし、私は今、適切に対処する方法を原則として知らない問題に直面しています:
私はかなり複雑な を持っていAlgorithm
ますが、これはある時点で収束するはずです。しかし、その複雑さのために、収束をチェックするためのいくつかの異なる基準があり、状況 (または入力) に応じて、異なる収束基準を有効にしたいと考えています。また、アルゴリズム自体に手を加えることなく、新しい収束基準を簡単に作成できるはずです。したがって、理想的には、ConvergenceChecker
継承できる抽象クラスを持ち、アルゴリズムにそれらのベクトルを持たせたいと思います。たとえば、次のようになります。
//Algorithm.h (with include guards of course)
class Algorithm {
//...
vector<ConvergenceChecker*> _convChecker;
}
//Algorithm.cpp
void runAlgorithm() {
bool converged=false;
while(true){
//Algorithm performs a cycle
for (unsigned i=0; i<_convChecker.size(); i++) {
// Check for convergence with each criterion
converged=_convChecker[i]->isConverged();
// If this criterion is not satisfied, forget about the following ones
if (!converged) { break; }
}
// If all are converged, break out of the while loop
if (converged) { break; }
}
}
これに関する問題は、それぞれConvergenceChecker
が現在実行中の について何かを知る必要があることですAlgorithm
が、それぞれがアルゴリズムとはまったく異なることを知る必要があるかもしれません。各サイクルで と を変更するとしますが、可能なものAlgorithm
は_foo
_bar
、もう 1 つは、を知るだけでよく、いつの日か必要なものが実装される可能性があります。これを解決するために私がすでに試みたいくつかの方法を次に示します。_fooBar
ConvergenceChecker
_foo
_foo
_bar
ConvergenceChecker
_fooBar
isConverged()
関数に大きな引数リスト (_foo
、_bar
、およびを含む) を与え_fooBar
ます。短所: 引数として使用される変数のほとんどはほとんどの場合使用されず、Algorithm
別の変数によって拡張される (または同様のアルゴリズムが変数から継承していくつかの変数を追加する) 場合、かなりのコードを変更する必要があります。-> 可能だが醜い- 関数自体 (または関数へのポインター) を引数として指定します
isConverged()
。Algorithm
問題: 循環依存。 isConverged()
フレンド関数として宣言します。問題 (とりわけ): 異なるConvergenceChecker
のメンバー関数として定義できません。- 関数ポインターの配列を使用します。問題をまったく解決しません。また、それらをどこで定義しますか?
- (この質問を書いているときにこれを思いつきました)データを保持する別のクラスを使用し、たとえばフレンドクラスとして
AlgorithmData
持ってから、関数の引数として提供します。2. と同様ですが、循環依存の問題を回避することもできます。(これはまだテストしていません。)Algorithm
AlgorithmData
これに関する解決策 (および 5. で発生する問題) を教えていただければ幸いです。
その他の注意事項:
- 質問のタイトル: 「強く依存するクラス」が、おそらくコードの設計で非常に間違ったことをしている可能性が高いとすでに言っていることは承知していますが、それでも多くの人がその問題を抱えてしまう可能性があり、その可能性を聞きたいと思っています。それは避けるので、その醜い表現を維持したいと思います。
- 簡単すぎる?: 実は、ここで提示した問題は完全ではありませんでした。
Algorithm
相互に継承するコードには多くの異なる がありConvergenceChecker
、新しい が登場した場合でも、 はもちろん、それ以上の変更を加えることなく、適切なケースで理想的に機能するはずですAlgorithm
。これについても気軽にコメントしてください。 - 質問スタイル: 質問が抽象的すぎず、特殊すぎず、長くなりすぎず、理解できるものであることを願っています。ですから、私がこの質問をする方法についてコメントすることを躊躇しないでください。