| 嫌いなプログラム | 私のプログラム | 理由 |
| goto文を使用している label: if( 判定 ) goto next; 処理 goto lable; next: |
goto文を使用しない while(True){ if( 判定 ) break; 処理 } |
大きな流れが上から下に統一され読み易い |
| 無駄ステップが多い if( 判定 ) { 処理 } else { 処理 } |
無駄な行を無くす if( 判定 ){//正常処理 正常処理 }else{//異常処理 異常処理 } |
1画面で多くのステップが読める |
| タブとスペースが混在している | タブに統一する 特にDelphiのエディタ環境設定をオートインデント無し、はタブ使用、タブ位置 4 8 に設定し直す |
エディタでのカーソル移動が早くなる |
| ファイル内のモジュールをプロファイル宣言している int function( int a ); void main( void ){ function( 3 ); } int function( int a ){ 処理 } |
下位モジュールをファイルの上方に置く static int function( int a ){ 処理 } void main( void ){ function( 3 ); } |
内部関数においてはプロファイル宣言不要になる |
| if文で複数行になる場合単ステップ時に{を使用していない if( 判定 ) 処理 |
if文で単ステップでも{を使用する if( 判定 ){ 処理 } 但し、ifの横に処理を書く場合を除く。 if( 判定 ) a = 0; |
読み間違いが無く メンテナンス時にミスしにくい |
| 論理判定している if( a ){ |
必ず2項を比較する if( a!=0 ){ |
比較対照がある為、読み易い |
| 関数で異常時の戻り値を正数で返している rc = function(&no); if( rc==0 ){ |
異常時はできるだけ-値を返すようにし、+値はバイト数等に使用する no = function(); if( no>=0 ){//正常 |
一石二鳥 |
| インクルードファイルをフルパスで指定 #include "c:\include\xxx.h" |
ファイル名だけ指定し、コンパイルパラメータでパス指定する #include "xxx.h" |
UNIXへの移植性がよくなる |
| デバック文のステップが多い | モジュールとして纏めて外部に置く debug_xxx(x,y); |
本体の処理が読み易い |
| 標準関数を使用していない for( n=0; n<sizeof(struct s); n++ ) a[n] = b[n]; |
できるだけ標準関数を使用する memcpy(a,b,sizeof(struct s)); |
一般的関数である為読み易い |
| 実数を使用している | できる限り整数で演算する事。 例えば、小数以下2桁の計算であれば、100を掛けて処理し、表示を行う時に100で割る |
if文で誤差に掛からなくなる |
| モジュール間共通変数をローカル変数と同様に宣言している |
structで纏める。又変数の頭に特別な文字を使用する。 struct COMMON{ int a; long b; }cmData; |
詠み易くなる 変数名に困らなくなる |
| 一行で複数の演算を行っている if( ( (c=func(a,b))==0 ){ |
単純なステップにする c=func(a,b); if( c==0 ){ |
読み易い |
| データをメモリー内で何回も移動している。 | できるだけデータ移動しなくて良いように、構造体をうまく利用する。たとえばファイルヘッダを初めから付けておく struct DATA{ struct HEAD h; struct FRAME f; }rd; rc = recv( &rd.f );//データ受信 rc = write(&rd);//ファイリング |
メモリーコピーミスが減る |
| 同じ処理が2個所以上にある | モジュール化し、一ヶ所に置く |
開発、メンテナンス工数が減少する |
| 1つのモジュール内で複数のreturnがある if( 判定 ) return -1; return 0; |
モジュールの最後のみにreturn文を置く rc = 0; if( 判定 ) rc =- 1; return rc; |
リターンコードをprintする時に1箇所で出来る |
| 配列要素開始が不統一 a:array[1..10]of integer; b:array[0..4]of integer; |
全ての配列要素開始は、0から使用する a:array[0..9]of integer; b:array[0..4]of integer; |
読み易い |
| ループカウンタをループ内で変化させている for( i=0; i<max; i++ ){ if( x[i]==0 ) i++; } |
左記のような場合は別にポインタ用変数を用意し、ループカウントとは別に上限チェックを行う p=0; for( i=0; i<max; i++ ){ if( x[p]==0 ) p++; if( p>=max ) break; } |
上限チェックミス防止 |
| メモリコピーのサイズに直接数値を使用している memcpy( &a,& b, 10 );; |
メモリコピー等には、sizeof()でコピーサイズを指定する memcpy( &a, &b, sizeof(a) ); |
構造体を修正しても自動的に対応出来る |
| 1つのI/Oに対し複数のスレッドがある | 1つのI/Oには1つのスレッドで処理させる | 競合ミスが無くなる |
| 必要時に毎回スレッド起動している | システム起動時にすべて起動し安定動作に勤める。エリア確保も同様 但し、TCP/IPサーバ機能は除く。 |
リソース問題を起こしにくくなる |
| ソースファイルを複数のPCに置いている | ファイルサーバを置き、一ヶ所にソースファイルを置き、ファイルバックアップを別PCに毎日行う | ソース管理し易い |