#はじめに
fortranはパンチカードでプログラミングしていた時代からある言語なので、しばしばそのころの名残が仕様に残っていることがある。数万行にも及ぶ大規模コードも扱う現代では、可読性や保守性を落とす古いコーディングスタイルは一掃しなければならない。
しかしfortranは科学技術計算に用いられるという特性から、「大学の大先生の古いスタイルが、初めてコードに触れる学生に引き継がれる」という悪夢のような悪循環が起こっている。その一つが、「行番号による制御」だ。
#例1:do文をcontinue文で閉じる
大先生レベルの年齢の人が書くコード。
do 10 i=1,10
do 20 j=1,10
write(6,*) i+j
20 continue
10 continue
問題点
- continueを閉じる10,20を逆につけるバグが非常に多い(上が10,20と並んでいるから同じ並びにしたくなる)
- 特にループの中が長くなるとどのcontinue文がどのdo文を閉じているのかわからなくなる
- エディタの自動整形機能が働かないことがある
改善点
do文は必ずend doで閉じましょう。
do i=1,10
do j=1,10
write(6,*) i+j
end do
end do
#例2:goto文でループを抜ける
実際に指導をする割と若い先生でもやりがちなコード。
do i=1,10
if(f(i) > 0) goto 30
end do
30 continue
問題点
- コードが長くなるとどこに飛ぶかわからなくなる
- continueがループの中か外かで指す意味が変わるので、可読性が落ちる
改善点
ループを抜けるときはexitを使いましょう。
do i=1,10
if(f(i) > 0) exit
end do
#行番号を使わざるを得ない所
ここまで行番号を使ってはいけないと述べてきたが、残念なことにfortranにはいまだに行番号を使わなければならない機能が残っている。
##1.format文
書式を指定するformat文は行番号で指定する必要がある。
100 format(f10.4)
!...
write(6,100) x
!...
write(10,100) y
書式を使いまわすケースはあまりないので、write文の中に直接書いておくのがよいだろう。
#2.read文のEOF検知
ファイルの入力に使うread文ではendオプションでEOFを検知することができる。しかしEOF検知後に行う処理を行番号で飛ばす必要がある。
read(10,*,end=1000) x
1000 continue
マジックナンバーは可読性を落とすので、何か変数に入れてしまいたいところだが、残念なことに変数をendに渡すことはできない。
可読性を極力保つには、上記のようにread文の直下を指定するのがよい。あまり遠くを指定するとどういう処理をしているのかわけがわからなくなる。