CLIツールを書いているとき、私は難問に直面しています。
このツールは、画像内の顔を検出し、それらを自動的にぼかすようになっています。ただし、外部ツールを使用して追加の面を手動でマークできるようにするには、これらの1つだけを実行する必要がある場合があります。したがって、私がサポートしたい3つの動作があります。
これを解決するという私の考えは、--only-detect
と--only-blur
のような2つの相互に排他的なオプションでした。
ただし、同僚は、--detect
と--blur
を使用する方が理にかなっている可能性があることを提案しました。これにより、両方のオプションを使用すると、noneを使用した場合と同じ動作になりますが、これは直感的ではありません。
私の質問は次のとおりです:この決定を行うために従うことができる規則はありますか?私は POSIXユーティリティ規則 を見つけました、そしてそれらは相互に排他的なグループについて言及していますが、ここで役立つことは何もありません。
POSIXは次のように述べています(POSIXユーティリティの相互に排他的なコマンドラインオプションに関して):
ユーティリティの説明で特に指定されていない限り、競合する相互に排他的な引数を使用すると、未定義の結果が生成されます。
一部のコマンドラインツールには、競合するコマンドラインオプションがあります(--silent
オプションと--verbose
オプションの両方など)。ツールを呼び出すときに両方のオプションが使用される場合、許可されていれば、通常、最後に解析されたオプション(行の最後のオプション)が優先されます。
--blur
と--detect
の最後のものが使用されます。ドキュメントには、どのオプションが排他的であるかが指定されています。
たとえば、ls -l -C
とls -C -l
を比較します。
他のツールは、競合するコマンドラインオプションを単に許可せず、ユーザーに標準エラーストリームの診断メッセージを提供し、そのような状況が発生したときにゼロ以外の終了コードで終了します。
--blur
と--detect
の両方が使用された場合、コードはエラーになります。
これは、例えばで行われます。フラグ-b
、-c
、および-f
が競合するcut
。
一部のツールは、呼び出される名前に応じて異なる効果を提供する場合があります。したがって、ツールに2つの名前(ハードリンク)を付けることができます。1つはdetectface
と呼ばれ、もう1つはblurface
と呼ばれます。これらはまったく同じバイナリですが、プログラムは、実行する操作を把握するために呼び出された名前を決定します。
これは、一部のシェルが/bin/sh
(POSIXシェル)とそれ自体(たとえば、Linuxではbash
、OpenBSDではksh
)の両方になりすまし、sh
またはとして呼び出されると「POSIXsh
モード」に切り替わるシステムで一般的です。 cc
またはc++
などとして呼び出されるかどうかに応じて、CコードとC++コードの両方をコンパイルし、モードを切り替えるコンパイラーがある場合があります(gcc
とclang
の両方がこれを行います)。
ほとんどの場合、ユーザーがプログラムに何をしてほしいかを自問し、それをデフォルトの動作にします。このデフォルトの動作は、オプションが指定されていない場合に自動的にトリガーされます。一方、ifオプションが指定されている場合、nothingオプションで指定されていない限り、コマンドによって実行されます。
これが私が考えるものの反例です痛々しいほど貧しいプログラミング:
avconv -i file.avi
ビデオファイルに関する情報を出力します。-i
は入力ファイルを設定します。出力が指定されていないため、avconv
は情報が必要なだけです。
avconv file.avi
avconv
は意図的に引数を出力ファイルとして受け取り、何があっても書き込みを行うため、何も書くことがなくても。
私はあなたがポイントを得ると思います。
これが私が直感的に呼ぶものです。デフォルトの動作が
command
およびcommand --detect --blur
は検出してぼかしますcommand --detect
は検出のみを行いますcommand --blur
はぼやけるだけですcommand
およびcommand --detect
は検出するだけですcommand --blur
はぼやけるだけですcommand --detect --blur
は検出してぼかします。これが便利だと思われる場合は、これの省略形としてcommand --detectblur
もあります。また、短いオプション-d
と-b
を定義して、ユーザーがcommand -bd
を呼び出して、デフォルトの動作に関係なく両方のオプションを設定できるようにします。