Devo usar opções mutuamente exclusivas na minha ferramenta de linha de comando?

3

Escrevendo uma ferramenta CLI, estou enfrentando um enigma.

A ferramenta deve detectar os rostos nas imagens e borrá-los automaticamente. No entanto, às vezes, apenas uma dessas ações deve ser feita para permitir a marcação manual de faces adicionais com uma ferramenta externa. Então, há três comportamentos que eu quero apoiar:

  1. Detecte rostos e desfoque-os de uma só vez
  2. Detecte apenas rostos
  3. Apenas desfocagem de faces

Minha ideia de resolver isso foram duas opções mutuamente exclusivas, algo como --only-detect e --only-blur .

No entanto, um colega de trabalho sugeriu que poderia fazer mais sentido ter --detect e --blur , de modo que o uso de ambas as opções levaria ao mesmo comportamento de nenhuma, mas acho isso menos intuitivo.

Minha pergunta agora é: Há alguma convenção que eu possa seguir para tomar essa decisão? Eu encontrei o POSIX Convenções Utilitárias , e elas mencionam grupos mutuamente exclusivos, mas nada que seja útil aqui.

    
por iFreilicht 14.11.2017 / 18:29

2 respostas

5

POSIX apenas diz (sobre opções de linha de comando mutuamente exclusivas em utilitários POSIX):

The use of conflicting mutually-exclusive arguments produces undefined results, unless a utility description specifies otherwise.

Algumas ferramentas de linha de comando possuem opções de linha de comando conflitantes (como as opções --silent e --verbose ). No caso de ambas as opções serem usadas ao invocar a ferramenta, se permitido, a última opção analisada (a última na linha) geralmente ganha.

O último de --blur e --detect seria usado. A documentação especificaria quais opções eram exclusivas.

Compare ls -l -1 com ls -1 -l , por exemplo.

Outras ferramentas simplesmente não permitem opções de linha de comando conflitantes, dando ao usuário uma mensagem de diagnóstico no fluxo de erro padrão e saindo com um código de saída diferente de zero quando tal situação ocorre.

Seu código seria um erro se --blur e --detect fossem usados.

Isso é feito em, e. cut que tem bandeiras conflitantes -b , -c e -f .

Algumas ferramentas podem fornecer um efeito diferente, dependendo do nome pelo qual é invocado. Assim, você poderia ter dois nomes (hard links) para sua ferramenta, um chamado detectface e outro chamado blurface . Estes seriam exatamente o mesmo binário, mas o programa determinaria qual nome foi invocado para descobrir qual operação executar.

Isso é comum no sistema em que algum shell se mascara como /bin/sh (um shell POSIX) e como ele mesmo (por exemplo, bash no Linux ou ksh no OpenBSD) e que alterna para o modo POSIX sh "quando chamado como sh , ou você pode ter um compilador que compila o código C e C ++ e o modo de comutadores, dependendo se ele é invocado como cc ou c++ , etc. (ambos gcc e clang isso).

    
por 14.11.2017 / 18:42
3

Eu me pergunto o que o usuário deseja que o programa faça na maioria dos casos e faça exatamente isso como o comportamento padrão. Esse comportamento padrão deve ser acionado automaticamente quando nenhuma opção for especificada. Por outro lado se houver uma opção especificada, nada deverá ser feito pelo comando, a menos que seja especificado com uma opção.

Aqui está um contra-exemplo do que eu considero dolorosamente pobre programação:

avconv -i file.avi

exibe algumas informações sobre o seu arquivo de vídeo, -i define o arquivo de entrada e, como não há saída especificada avconv , você só precisa da informação.

avconv file.avi

substitui seu precioso vídeo sem qualquer aviso ou fazendo um backup, porque avconv intencionalmente aceita o argumento como o arquivo de saída e grava nele não importa o que , mesmo que não haja nada para escrever. / p>

Eu acho que você entendeu.

Aqui está o que eu chamaria de intuitivo. Se o comportamento padrão for

  • detectam e desfocagem:
    • command e command --detect --blur detectam e desfazem o brilho
    • command --detect detecta apenas
    • command --blur faz apenas desfoque
  • apenas um, por ex. para detectar:
    • command e command --detect detectam apenas
    • command --blur faz apenas desfoque
    • command --detect --blur detecta e desfoca, se você acha que isso é útil, também command --detectblur como um atalho para este

Também defino as opções curtas -d e -b para que os usuários possam chamar command -bd para definir as duas opções, independentemente do comportamento padrão.

    
por 15.11.2017 / 09:57