ほとんど同じことの繰り返しになっている部分が多々見受けられます。きっと、エディタでコピー して、ちょこちょこっと直して作ったのでしょう。本人はきっと早くできて、満足でもしているの でしょうね。フローチャートがそうなんだから、プログラムにそういうのがあるのは当然なのでしょ う。 でも、これは諸悪の根源みたいなものです。同じようなことを繰り返して書くのなら、何らかの 工夫をすると、一度書けば済むように共通化できるはずです。 さらに悪いことは、同様の部分をコピーで作ったプログラムは、保守性が著しく低下してしまう ことです。コピーして、4個所がほとんど同様で、その中を変更する必要が起きた場合には、4ヶ 所に対して同様の変更しなければいけません。1個所でも忘れてはいけません。でも、人間は忘れっ ぽいもので、忘れて、バグに悩むものです。だからこそ、似たような部分は1つにまとめてしまう べきなのです。 人間は失敗する(バグる)ものです。だから、できるだけ失敗の可能性が減るようなプログラミ ングを心がけましょう。 ■同じ構造体■struct RECA と struct RECB の内容は全く同じです。こういう場合は、少なくともstruct REC { char FLG[1]; char FNAME[15]; char TIME[5]; } reca[1000], recb[1000];とすべきです。元の書き方では、配列reca, recb はそれぞれ別の名前の構造体になっていて、別 の型になってしまいます。このプログラムでは直接これが影響していませんが、多くの場合問題に なるはずです。それに、このように書いた方が楽でしょう。楽をするとバグは減るものです。 配列のサイズはマクロ定義したいものです。できれば、この構造体を、typedefで新しい型とし て宣言し、 typedef struct { char checked; char name[15]; char time[5]; } file_spec; file_spec rec_from[FILE_MAX_COUNT]; file_spec rec_to[FILE_MAX_COUNT];のように書いたらいかがでしょうか。配列名も意味を表すものに変更しました。 ■ほとんど同じ部分■106行からのswitch文の中が4つに分かれていて、それぞれ極めて似た処理をしています。これを 関数にしてしまえば、1つで済むはずです。変更プログラムの方は、この部分は大幅変更しました。結果からいうと、mainの後半(103行以降) を別の関数backup_checkにし、2つのドライブタイプ(HD/FD)をパラメータにしたので、自然に同じ ことを書く必要もなくなりました。 なお、この変更部分のFCNTの使用法(意図)が全く分かりませんので、とりあえずいい加減に直 しています。大域変数のFCNTを、バックアップ元とバックアップ先のファイル数に共用していて、 さすがそれでは処理に困るとみえて、局所変数としてcnt1, cnt2 も使って、よく分からないこと をしています。
|
ナンプレ問題 |