- ベストアンサー
Cでアルゴリズムの差し替えができるようにするには?
C++ならstrategyパターンを実装した経験はあるのですが、Cで同じような事ってできるのでしょうか?開発中のアルゴリズムなので、差し替えや変更に強い設計にしたいのですが、どうすればいいのかわかりません。どなたかお知恵をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関数へのポインタを差し替えればいいだけでは? 例えば、 int (*algorithm)(void); // 関数へのポインタ int algorithmA(void){ 適当に } int algorithmB(void){ これまた適当に } int algorithmC(void){ また別の方法で } に対して、 if( ほげほげ ) alogrithm = algorithmA; else if( ふがふが ) algorithm = algorithmB; else algorithm = algorithmC; として、条件に応じてアルゴリズムを切り替えて、 algorithm(); これで実行。 引数をとりたい時は、構造体へのポインタにしておきたいですね。 引数を構造体へのポインタにしておけば、引数を増やしたい時構造体をいじるだけで済みますから。
その他の回答 (2)
- tsuduki123
- ベストアンサー率32% (21/65)
ストラテジーパターンの用途が違いますね。 #2でも指摘されていますが、動的に変更する必要がないのならば 関数のモジュール強度をあげるように設計していけばすむ話です。 なぜなら、「差し替えや変更」ができないのは、 モジュール結合度が強くなってしまってモジュール強度が弱くなっているためだからです。 んでストラテジーパターンは、 その場の状況に合わせて処理の組み合わせを構築していくことにありますから 「開発中のアルゴリズムなので、差し替えや変更に強い」なんていうのとは 真逆で、確定した仕様(設計)が必要になります。 # どの場面で何をする必要があるのかというシナリオが必要 というわけで、実現方法についてですが 可能な限り変数を宣言しないようにして、 コーディングしていけばモジュール強度を上げることが出来ます。 # もちろんスコープは最小限に目的なので # グローバル変数や変数の変な使い回しはだめですよ? あとは、関数のポインタを利用するケースですが 構造体で擬似的なクラスを作成して、生成用のファクトリ関数と呼び出しようのdefineマクロがあれば ストラテジーっぽいことが可能じゃないかと思います。 # 関数のポインタ型は tyepdef しておくと使いやすいです。
お礼
ご回答ありがとうございました。 質問が説明不足で申し訳ありませんでした。「開発中」というのは、全体処理がまだまだ変わる(改善される)可能性があるという意味で、仕様は現段階で決まっております。今は確定しているAだけ実装するけれど、将来的にある条件下ではBにした方がいい性能が出る、というようになる可能性はあります。関数ポインタの勉強をします。
- jacta
- ベストアンサー率26% (845/3158)
動的に差し替えたいわけではなさそうですので、単純に呼び出す関数を変えるだけでよいのでは?
お礼
ご回答ありがとうございました。 質問があいまいで、申し訳ありませんでした。おっしゃる通り、動的に選択する必要がなければ置き換えるだけでいいですね。
お礼
ご回答ありがとうございました。 関数ポインタですか。あまりやったことがないですが、勉強します。参考になりました。