É melhor chamar um aplicativo de linha de comando externo ou internalizar a lógica desse aplicativo?

10

Eu tenho um tipo de processo de "pipeline" que é basicamente vincular várias ferramentas existentes para automatizar um fluxo de trabalho. Para uma das etapas, existe uma ferramenta de linha de comando existente que já executa o que a etapa precisa fazer.

A ferramenta CLI externa é baseada em java, assim como o meu pipeline, portanto, seria possível integrar a ferramenta diretamente na etapa do pipeline, mas a ferramenta é muito complexa e atualmente está intimamente ligada à entrada na linha de comando (algo como 37 opções de sinalizador de configuração).

A pergunta é: é uma idéia melhor simplesmente chamar e chamar o processo externo, ou seria melhor integrar o código externo no meu aplicativo?

Quais são os prós / contras de integrar vs. chamar o processo externo?

cdeszaq
fonte
A ferramenta de linha de comando é algo que você controla ou é desenvolvida por outra parte?
Whatsisname
É o kit de ferramentas dcm4che DICOM de código aberto (licença da Mozilla), por isso foi desenvolvido por outra parte, mas posso fazer com ele praticamente o que eu quiser.
Cdeszaq

Respostas:

12

É uma idéia melhor simplesmente chamar e chamar o processo externo ou seria melhor integrar o código externo ao meu aplicativo?

É muito melhor integrar essas coisas.

A interface da linha de comandos é apenas uma interface, e especialmente horrível. É essencial, mas também é cheio de peculiaridades e limitações que não são sensatas.

Cada uma das "ferramentas existentes para automatizar um fluxo de trabalho" deve ter uma classe organizada que faça o trabalho real após a análise das opções da linha de comando.

Idealmente, a public static void mainfunção faz duas coisas em cada uma dessas "ferramentas existentes".

  1. Ele chama algum analisador de opção / argumento da linha de comando.

  2. Invoca a classe organizada que faz o trabalho real. Pense em uma tarefa do Ant ou uma tarefa do Maven que faça o trabalho real depois que o Ant ou o Maven tiver lidado com toda a análise e tomada de decisão.

Quando você vai integrar essas coisas, deseja as classes organizadas que fazem o trabalho real.

Se eles não existirem, será necessário reescrever todas essas ferramentas para criar a classe organizada que faz o trabalho real, separada de toda a análise de linha de comando.

Para obter orientação sobre como essas classes organizadas devem funcionar, leia Ant (ou Maven) para ver como elas definem as várias tarefas do trabalhador. É um bom modelo mental de como várias coisas diferentes são integradas sem voltar à linha de comando.

S.Lott
fonte
No meu caso, a classe que faz o trabalho é a ferramenta inteira e contém o mainmétodo, os métodos de análise de CLI etc. É bastante desagradável :(
cdeszaq
@cdeszaq: Nesse caso, ele precisa ser corrigido. Não é uma reescrita terrivelmente difícil, e deve ser feita.
S.Lott
3
Eu acrescentaria que, dependendo dos seus prazos, você pode integrar-se à interface CL existente e migrar para uma solução adequadamente integrada ao longo do tempo. Mas se você tem tempo para corrigir isso agora, então fazê-lo :-)
Martijn Verburg
11
@MartijnVerburg: Bom ponto. Muitas vezes, há uma clara prioridade. Parte do fluxo de trabalho está mais bem integrado ou pode ter um uso separado como "subfluxo de trabalho". Isso pode levar a um acúmulo de retrabalho, do mais valioso para o menos valioso.
S.Lott
No meu último empregador, tivemos um problema ao executar um exe de utilitário (nós, mas não meu código). Ajudando o desenvolvedor "sênior" a diagnosticar por que esse exe não seria executado, sugeri escrever um arquivo bat para iniciá-lo. Funcionou. Ele parou de procurar o problema e foi assim que saiu pela porta. A lição que aprendi é 1. Nunca proponha uma má idéia para solucionar um problema a alguém que tome decisões. 2. Use bibliotecas ou internalize sua própria lógica o máximo possível. Essa "correção" custa uma série de suporte técnico em algumas máquinas. Ele também não acredita em testes ou controle de origem para nenhuma surpresa ...
Rig
8

Eu diria que deixe em paz se funcionar.

Como programador, você agrega valor à sua organização resolvendo problemas com o software. Resolver mais problemas de qualidade e quantidade dentro de um determinado período de tempo está diretamente relacionado ao seu valor na organização. Passar esse tempo para criar código diminui o seu valor, pois isso o impede de resolver um problema mais importante.

No entanto, alguns fatores que podem reduzir o tempo gasto seriam escalabilidade e se houvesse alguma preocupação com a estabilidade dos programas externos.

bigtech
fonte
Concordo. Você pode se deparar com muitos problemas ao tentar integrar programas / códigos de terceiros ao seu aplicativo. Às vezes é necessário, mas, como diz o ditado, "se não está quebrado, não conserte"
jfrankcarr
5
Resolver problemas é ótimo. Resolver alguns problemas enquanto abre a porta para outros problemas não é tão bom.
Yfeldblum
5

Não é "melhor" ou "pior". Existem simplesmente custos e benefícios diferentes.

Geralmente, é mais caro escrever e manter um software, quanto maior o número de pontos de integração, maior a complexidade.

  • Uma função que você escreve tem muito pouco custo de integração.
  • Uma biblioteca de terceiros tem um custo de integração um pouco maior.
  • Um programa separado que você precisa executar terá um custo de integração ainda maior.

Observe que estes são os custos de integração que você deve considerar em relação ao custo total, que inclui, entre outras coisas, o custo para escrever e manter o software.

Pode ser que você seja um programador muito inexperiente, mas um usuário avançado de longa data.

  • Se você "desembolsar", seu custo total pode ser baixo, apesar do custo de integração mais alto, porque você pode atenuar o custo de integração com sua experiência e conhecimento.
  • Se você mesmo escrever a função, seu custo total poderá ser bastante alto, apesar do baixo custo de integração, devido à sua programação inexperiente.

A melhor maneira de descobrir:

É melhor chamar um aplicativo de linha de comando externo ou internalizar a lógica desse aplicativo?

É calcular os custos para si mesmo. O custo será diferente para diferentes ambientes, situações e pessoas. Na maioria das vezes, custa mais chamar a linha de comando, mas nem sempre e a única maneira de garantir que ela faça a análise.

dietbuddha
fonte
No meu caso, é essencialmente um aplicativo externo que acontece a ser open-source e escrito em Java, assim como a minha aplicação. Infelizmente, não existe simplesmente uma biblioteca que o aplicativo externo usa, pois essa biblioteca é agrupada firmemente na própria interface da CLI. Fora isso, todos os bons pontos.
Cdeszaq
1

Idealmente, você deseja integrá-lo. Especialmente se este for um aplicativo distribuído - reduzir o número de dependências e configurações facilitará isso. Mas é claro que é uma questão de custo / benefício para o seu caso específico.

Dito isto, uma coisa a considerar é a estabilidade. Encontrei algo semelhante há alguns anos e mantive o programa cli no lugar. Era muito instável, e eu não queria que sua falha derrubasse o aplicativo pai, que precisava ser executado 24/7. Agora, este não era um aplicativo java, mas, mesmo assim, se for um problema que possa ser aplicado, convém manter isso em consideração.

GrandmasterB
fonte