プログラミング心得

嫌いなプログラム 私のプログラム 理由
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に毎日行う ソース管理し易い