コマンドラインツールを作るときに考えているちょっとした設計方針
個人的にPerlでもGoでもRubyでもコマンドラインツールを作るときに考えることの一つに以下がある。
その実装言語からライブラリとして直接呼べるインターフェースを作り、コマンドもそれを呼び出すようにする。
どういうことかというと、最近書いたgo-timeoutの場合、
% go-timeout --kill-after 5 --signal=HUP 10 perl -E "say 'Hello'"
は、内部的に以下を呼び出している。
tio := &timeout.Timeout{
Cmd: exec.Command("perl", "-E", "say 'Hello'"),
Duration: 10 * time.Second,
KillAfter: 5 * time.Second,
Signal: syscall.SIGHUP,
}
exitStatus := tio.RunSimple()
このようにすることによって、その言語のライブラリとしての再利用も可能になる。テストも書きやすくなるメリットもある。
スクリプトにベタ書きしてしまうとそういうことができなくて悲しい思いをすることが往々にしてある。Webアプリケーションでモデル側にちゃんと処理を書きましょうみたいなのと同じような話で、引数のパースをするのがコントローラーでそれをモデル側に受け渡すと考えるとWebアプリケーションと同じ話だった!
もちろんこの設計方針にするかどうかは場合によりけりです。