3つの異なる排他的条件の処理を行う必要がある適度に大きなCファイルに取り組んでいます。(条件1が存在する場合はこれを実行し、2が存在する場合は他のことを実行します)。したがって、そのファイルの多くの場所で、if/elseチェックを実行する必要があります-これは汚れているように見えます。これらのチェックを行っている場所は約50か所あります。
コードをよりきれいに見せるためのより良い方法はありますか?
3つの異なる排他的条件の処理を行う必要がある適度に大きなCファイルに取り組んでいます。(条件1が存在する場合はこれを実行し、2が存在する場合は他のことを実行します)。したがって、そのファイルの多くの場所で、if/elseチェックを実行する必要があります-これは汚れているように見えます。これらのチェックを行っている場所は約50か所あります。
コードをよりきれいに見せるためのより良い方法はありますか?
条件が本当に排他的である場合は、プロセスごとに1つずつ、3つの別々の関数から始めます。一般的なコードを、3つのプロセス関数から呼び出すことができる独自の関数に分割します。唯一の条件付き左は、3つのプロセス関数のどれを呼び出すかを決定する場所です。
2つの主なオプションがあり、それらはコードが解決する問題に依存します
1.)条件がcコードファイル全体で同じである場合、つまり条件は変更されませんが、コードはいくつかの場所で異なる動作をする必要があります。
すなわち
/* prepare */
if(cond == 1){
/*prepare 1 */
}elseif(cond == 2){
/*prepare 2 */
}
/* run */
if(cond == 1){
/*run 1 */
}elseif(cond == 2){
/* run 2 */
}
この場合、単一の条件になるようにリファクタリングする必要があります。すなわち
/* process and run */
if(cond == 1){
/* process 1 */
/* run 1 */
}elseif(cond == 2){
/* process 2 */
/* run 2 */
}
コード全体で条件が変化する場合。すなわち
cond = DEFAULT_COND /* = 1 */;
/* prepare */
if(cond == 1){
cond = prepare_1();
}elseif(cond == 2){
cond = prepare_2();
}
/* run */
if(cond == 1){
/* run 1 */
}elseif(cond == 2){
/* run 2 */
}
この場合、「実行」コードが評価されるときのcond変数が「プロセス」コードによって変更された可能性があるため、コードが複雑すぎて単純にリファクタリングできません。ただし、このような場合のみです。コードを単一の条件にリファクタリングすることはできません。
私が正しいことを理解しているなら-あなたは同じ条件を何度もチェックしますか?
もしそうなら、私はこのチェックを一度だけ行うでしょう、そしてこれがコードを複製する必要があるなら-このコードを関数に入れてください。
考慮すべきいくつかの方法:
これらのswitch
条件が同じ変数を参照している(または参照するようにできる)場合、ステートメントはコードを読みやすくするのに役立つ場合があります。
#define
制御されたステートメントが単純な場合(割り当てなど)、構成用のマクロを作成できる場合がありますif ... else if ... else ...
。
ケース間の共通部分が比較的小さい場合は、3つの異なる関数を定義するのが最適です。ただし、これにより、適度な量のコード重複が発生する可能性があります。
共通部分が大きい場合は、それらを関数に移動し、部分ごとに個別の関数を定義します。「part」関数が複雑になりすぎる場合は、代わりにマクロを使用できますが、生成されるオブジェクトコードのサイズは大きくなります。次に、これらの「パーツ」関数またはマクロを使用して、3つのケースごとに個別の関数を作成します。
最後の2つの方法では、コードの重複を最小限に抑えるか、まったく行わずに、条件付きチェックを1つに減らします。
PS:「共通部分」とは、3つのケースのどれが実際にアクティブであるかに関係なく、実行されるコードの部分を意味します。