hkoba blog

プログラマーです。プログラミング言語ミーハーです。ツッコミ歓迎です。よろしくどうぞ(能代口調)

"--name <SPC> value" style options considered harmful for end-user scripting.

追記20170914朝JST: 以下の議論では簡単のため --name value に話を絞り -o VALUE 形式への言及を省略したが、後者においても辞書が必要となる点は変わらない。自明とは思うが念の為… 20170914昼JST: タイトルtypo 修正 ><

ストーリー

  • 以前あなたはプログラム A を書いた。それは職場で同僚たちが日々使用している。今のバージョンにはオプションが 5 個ほどある。オプションは今後も増え続けるだろう。
  • 同僚たちも、あなた程ではないが、省力化のための簡単なスクリプト程度は好んで書く人たちである。
  • あなたの書いた A は、同僚の書いたスクリプト B(それは例えば日々の仕事を定期実行するためのバッチや、よく渡すオプションを予めまとめたラッパースクリプトである)から呼び出されるようになった。
    • 同僚のスクリプト B を起動する時に、そこからあなたの A へ、いつもと違うオプションを渡したくなる時がある。だから B は殆どのオプションをあなたの A に素通しで渡したい。
    • ただし、 B 独自のオプションも持ちたい。
  • 同僚たちは (B だけでなく) 元々 A のユーザーでもあるので、あなたの A のマニュアルを読んでいる。そこにオプションが --name value (name と value の間のスペースに注意。 --name=value ではない)の形式で書かれている場合、ユーザーのメンタルモデルにはオプションが --name value 形式で刻まれる。だから B も、その仕様に従うだろう。
    • 何より、職場の Wiki に日々書かれるコピペ用のコード例が --name value スタイルで書かれるだろう。

“–name value” オプションの切り出し処理は辞書を要求する

  • あなたの A が、オプションを --name value 形式で受け取る場合、 --name に続く次の引数が、オプションの value か、あるいは無関係な別の引数であるかは、 name 次第となる。つまり任意の引数列からオプション列を切り出すには、 オプションの名前を網羅した 辞書 を用意する必要が有る。
  • つまり同僚のスクリプト B にも、あなたのプログラム A の全オプションに関する辞書が必要になってしまう。

辞書で対応付けを作った箇所には、変更のバケツリレーも付いてくる

  • 同僚のスクリプト B に対して、誰かが更に別のラッパースクリプト C を書く時もある。 C にも A のオプション辞書が必要になる。 D, E, F… 止まらない保証はない。
  • あなたが元のプログラム A を改良してオプションを追加したら? スクリプト BC のオプション辞書にも改良が必要になる。オプションが増減する度に、この改良(?改良なのか?)の連鎖が起こる。これバケツリレーだ、 WWII の空襲記録で見たこと有るやつだ…

誰かが、この無限の連鎖を止めなければならない…誰かが…

一案としては、 A にオプションの辞書一覧を機械可読な形式で出力する機能を用意する。 B を書く人には、それを読み込んで処理する機能を書いてもらう。これなら処理を書くのは一度きりで済む。 ただし…ちょっとスクリプトを書けるようになり始めた位の人に、これを要求するのは、 ハードルが高すぎる。職場全体で少しでもスクリプトを書く人数が増えて欲しい時には、 ハードルを少しでも下げたい。

もっと簡単に書けて、処理も軽く、漏れがなく、一度書けば済む…そんな、貧者のアプローチがないか?

どうすればよい?

既に書かれた 他人のプログラムは、諦める とする。自分たちがこれから書く、職場限定のプログラムに限り、 オプションの与え方に一律の制限を課す(標準化する)。例えば:

  • --name=value
  • --name (value なし)
  • -c (一文字オプション。value なし)
  • オプション列の終わりは -- で与える

このように制限をすれば、辞書抜きで機械的にオプション列を切り出すプログラムを書けるようになる。辞書と異なり、この処理は一度書けばずっと使える。プログラム A にオプションが増えても、 B のオプション切り出し部分に変更は必要ない。 (もちろん、 B 自身のオプション名と被った場合は問題だが、少なくとも切り出しプログラムの問題ではなくなる)

規格化・標準化は自動化・省力化の友

諸君、私は自動化が好きだ。愛していると言ってもいい。 自動化出来るか否かに比べれば、使い方が流行のプログラムに似ているかなど、どうでも良い。 オプションを --name value のように書きたいばかりにあなたを辞書変更の無限地獄へ巻き込もうとする者たちからは、出来るだけ離れていよう。 多分、連中は雇用対策でそうしているのだろう。我々の人生はもっと有益なことに使うべきだ。

オチ

ラッパーから2個以上のコマンドを呼ぶ時、困るよね…段々辞書が欲しくなるよね… -- を書いてもらう?う〜ん…