「上手なプログラミング」:準備

能書き

「上手なプログラム」と言っても色々な基準があります。 もちろん技術も重要ですが、それ以外に
 他人が見てもわかりやすい
というのが1つ、大きなポイントになります。
 do j=1,m
    do i=1,n-1, 2
       H(i  ,j) =    p   *V(i,j) + (one-p)*V(i+1,j)
       H(i+1,j) = (one-p)*V(i,j) +    p   *V(i+1,j)
    end do 
 end do
    do O0=1,OO
   do n=1,-1+i,2
 ll(n,O0)=-l1(n+1,O0)*(j-1.d0)+j*l1(n,O0)
     ll(n+1,O0)=(1.d0-j)*l1(n,O0)+l1(n+1,O0)*j
                                    end do

   end do
上の2つは全く同じものですが、下のは読む気にもなれませんね。
ここでは、わかりやすいプログラムを書くコツを学びます。
1. 見やすいプログラムを目指す

指針

原則1.縦方向をそろえると見やすい
if文の中身は、スペース3つ分インデント(字下げ)する
do文の中身は、スペース3つ分インデント(字下げ)する
特に、この2つがされていないプログラムは読めたものではない。
文・式に適切にスペースを入れる
命令・変数名をぶった切らなければ、どこにいくつ入れても構わない。
原則2.役割ごとにブロック分けすると流れがわかりやすい
適切に改行を入れる・詰める
丁寧にコメントをつける
副プログラム・モジュール化(上級編)
原則3.長すぎる式は見にくい
長い式は『&』を使って適当なところで区切る
続く行末と、 &
& 続きの行頭の両方につける。
複雑な式は、途中で一度変数に代入する
たとえば「積のルートの和の商」を「積のルート」と「その和の商」に分割する。

インデントの例

『if』から『end if』、『do』から『end do』の間は、行頭に3つスペースを入れます。多重構造になっている場合は、中身全体にさらに3つスペースを入れます。
 if( p/=zero ) then
    do j=1,m
       do i=1,n-1, 2
          H(i  ,j) =    p   *V(i,j) + (one-p)*V(i+1,j)
          H(i+1,j) = (one-p)*V(i,j) +    p   *V(i+1,j)
       end do 
    end do
 else
    do j=1,m
       do i=1,n-1, 2
          H(i  ,j) = V(i+1,j)
          H(i+1,j) = V(i,j)
       end do 
    end do
 end if
対応するdo(if)とendの頭の位置を揃えることで、プログラムの構造が明確になります。
2. 変数名のつけかた

命名の指針

原則1.テキトーな名前をつけない
 結果を表す変数が『a』と『energy』では視認性に雲泥の差がある。
 アルファベットは26文字しかない。変数名の重複・混乱を避けるためにも、いい加減に名前を付けないこと。

原則2.「慣習」を知る
 FORTRANの「慣習」
 i,j,k,l,m,nで始まる変数は整数型
 zで始まる変数は複素数型
 それ以外(a-h,o-y)は実数型
 他にも、
 特に意味のないループは『do i=1,n』『do j=1,m』とするのが一般的。
意味もなく『do n=1,i』『do m=1,j』などとすると、それだけで嫌がらせになる。
指針1.「型」重視
整数型変数は『i』,倍精度実数型は『d』,倍精度複素数型は『z』を変数名の頭につける
古き良きFORTRANはこれ。精神は良いが、最近はあまり流行らない。

指針2.「意味」重視
意味を明示する
単語の切れ目は『number_of_lattice_site』『numberOfLatticeSite』など。
わかりやすいが、書くのが大変。長すぎると読みづらい。

推奨方針と具体例

意味がある変数は、適度な長さで意味が分かるように。
  「エネルギー」は『e』だと短すぎるので『energy』に。
  『number_of_lattice_site』は長すぎる。『nSite』と書けば「サイト数」っぽいことは十分わかる。
  「サンプル数」は『nSamples』でも良いが、『nSmpl』のように母音を抜いて縮める流儀も覚えておくと便利。

混乱しそうな時は「型」接頭辞をつける。
  『energy』は普通に考えて実数。もし整数で使うなら、integerの"i"を付けて『iEnergy』とする。

意味のない変数は、意味のある変数と紛らわしくならないように。
  『temp』『iTemp』や『work』などが代表的。

ループ変数は、特に意味がなければ i,j,k にする
多重ループの変数は、特に見分けやすい名前にする
  x座標のインデックスなら『ix=1,nx』、サンプルなら『iSmpl=1,nSmpl』、ただの回数でも『iStep=1,nStep』など工夫する。
実数をループ変数にしないこと。(昔の人は許されたけど、現代人は禁止)

行列名は行列っぽく、ベクトルはベクトルっぽく見える名前にする
  『a』『b』『c』では違いがわからないが、『Amat』(行列)、『bVec』(ベクトル)『c』(スカラー)とすれば想像がつきやすい。
  または常に、次元のわかる『A(:,:)』『b(:)』という書き方をするのもおすすめ。

とりあえず細かくコメントを入れておく
  何をしている部分かを細かく記入しておく。ただし、やりすぎないこと。面倒臭い。
3. 変数をローカルに

変数定義の指針

原則1.グローバル変数は避ける
 いつ、どこからいじられるか分からないような変数は可能な限り使わない(common文は禁忌)。
 モジュールの変数は、グローバル変数として使いたい物以外は必ずprivate属性を付ける。
 「グローバル定数」(parameter属性)ならば安全なので使っても良い。

原則2.見える変数の数を減らす
 外から参照する必要のない変数は、subroutineやmoduleのプライベート変数にして、外から見えないようにする(隠蔽する)。