私はあなたの考えを知っています。タイトルに書かれていることはオーバーロードのように聞こえます。私はそれがCのものではないことを知っています。そして、私はそれをとにかく行っていません。私はこれらの2つの機能を持っています - 絶対に同じものですが、引数は2つの異なる構造体です。基本的にはバイナリ検索ツリー構造体と赤色の黒いツリー構造体です。構造体には1つの違いしかありません - 赤い黒いツリーの構造体にはもう1つのフィールドがあり、それはカラーの構造体です。関数search、min、max、predecessor、successor ..これらは完全に同じボディを持ちますが、残念なことに2つの異なるタイプの構造体を取ります。もちろん、挿入と削除の方法は異なります。このような状況で自分を繰り返さない方法は?同じだが異なる引数を持つC関数
私はプログラミングでナンバーワンのルールを破って自分自身を繰り返さないようにするにはどうすればいいか考えていましたか?私は多くのソリューションについて考えていましたが、実装する方法を見つけようとするとうまくいきません。私は両方のために1つの関数を使用することについて考えましたが、構造体が異なるので、それを行うことはできません。私はマクロを使用することを考えましたが、正直なところ、これらの作業をどのように行うかわからず、2つの異なる構造体を持つ問題を回避できるかどうかもわかりません。私は1つの汎用構造体を作ることを考え、rb構造体にそれと色の変数が含まれていることを考えましたが、これはコードをいくつかの文字で変更しています。コードを複製する。
問題がどのように見えるかの単なる例:私はJavaでコーディングされた場合、私はおそらく抽象スーパークラスを使用してこの問題を解決するだろうが、Cはそのような派手なものを持っていない
bst_search(bstTree t, char *k)
{
// Searching in tree
}
rb_search(rbTree t, char *k)
{
// SAME code for searching in tree
}
。
いくつかの追加情報:どちらの実装も独自のヘッダーファイルとクラスファイルを持っていますので、そのまま使用したいと思います。今、私はそれらの2つのクラス全体で重複したコードを持っていますが、関数と構造体の名前(挿入と削除の機能を除く)は異なります。
申し訳ありませんこれは明白な解決策がある場合、私はちょうど私のコードを複製せずにこれの方法を見つけることはありません。
汎用構造体を使用して残りのコードをすべて変更したくない場合は、2つの呼び出し関数(それぞれの型ごとに1つずつ)でそれぞれ行います。関連するメンバーを共通の構造体にコピーし、検索機能を呼び出します。 –
ナンバーワンのルールは確かにDRYではありません。私はKISSを最初に置くだろう。しかし、もちろん、最初のルールはあなたが求めるすべてのプログラマーのためのものでなければならない別の答えを得る... – cmaster