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