経緯
そもそもバッチの開発はあんまり携わったことがなかった。バッチ自体が可読性を高めるのは難しいという印象だった。
今回は、そんなバッチでも可読性の高いものを書いてみようと思った。
※注意※
可読性はあくまで個人的にそう感じるというだけで、絶対そうしなきゃいけないというわけではない。もちろん、pythonは改行しなきゃいけない(しかもスペース5つ分)など指定がある言語もある。
第一に、パラメータは冒頭にまとめる
REM パラメータ一覧
set FileName=file_name.txt
set LogFile=sample_batch_001.log
set flg=0
ファイル名はスネークケースを使って、変数はキャメルケースに統一をするというのも一つの可読性を高めるテクニックかもしれない。
第二に、コメントアウト
ロジックのフローをわかりやすくするのが肝心。
REM ファイルの存在確認
if exist %FileName% (
set flg=100
) else (
set flg=200
REM 処理中断
goto fin
)
上のように、Windowsの改行とタブスペースを使う。最低でも改行は一つ設けた方が読みやすいと思う。
個人的な趣向かもしれないが、フラグやカウントをとる処理はいちいちコメントに書く必要はないのかと思う。
第三に、インデント
ロジックの包含関係を意識してインデントする。
REM ファイルパス一覧の存在確認
for /f "delims== tokens=1" %%f in ('type %FileName% ') do (
REM 関数の呼び出し
call :func "%%f"
)
exit /b %flg%
REM 関数の開始
:func
set tgtPath=%~1
if exist %tgtPath% (
set flg=100
REM ファイルが存在した
echo EXISTS %tgtPath% >>%LogFile%
) else (
set flg=200
REM ファイルが存在しない
echo DOESNT EXIST %tgtPath% >>%LogFile%
)
REM 処理終了
:fin
echo %flg%>>%LogFile%
大見出しで機能の概要だけをコメントすると読みやすい。
さらに、改行2個に増やしてロジックの分け目が見やすくした。
おまけ
別視点になりますが、例3)で関数を使うことで遅延展開の回避をしている。実は、下の記事を参考にした。
https://qiita.com/yz2cm/items/4983be006116c369d08b
個人的にsetlocal enabledelayedexpansion
がいくつも入ってると読みにくいし、デバッグしづらいと感じる。なので、なるべく関数を使い読みやすくしている。
そういえば、よく「関数」にうるさい人がいたのを思い出した。たぶん、一日に平均4回は「関数を使ってください」と言わせていた。
もしかしたら、なるべく関数を使うのが第四の鉄則になるかもしれない。
厳しく指導してくれる人があんまりいないので、少し寂しい。