外部のコマンドラインアプリケーションを呼び出すか、そのアプリケーションのロジックを内部化する方が良いでしょうか?


10

ワークフローを自動化するために、基本的に既存のツールの束をリンクするだけの「パイプライン」タイプのプロセスがあります。ステップの1つとして、既存のコマンドラインツールがあり、そのステップで実行する必要のある処理をすでに実行しています。

外部CLIツールはJavaベースであり、パイプラインも同様であるため、ツールをパイプラインステップに直接統合することは可能ですが、ツールは非常に複雑で、現在、コマンドライン入力(次のようなもの)と密接に関連しています37の構成フラグオプション)。

問題は、単に外部プロセスを呼び出して呼び出す方が良いのでしょうか、それともアプリケーション内に外部コードを統合する方が良いのでしょうか。

外部プロセスの統合と呼び出しのメリットとデメリットは何ですか?


コマンドラインツールはあなたが制御するものですか、それとも他の開発者が開発したものですか?
whatsisname

これはオープンソース(Mozillaライセンス)のdcm4che DICOMツールキットであるため、別のパーティーによって開発されましたが、私が望むことはほとんど何でもできます。
cdeszaq

回答:


12

単に外部プロセスを呼び出して呼び出す方が良いでしょうか、それともアプリケーション内に外部コードを統合する方が良いでしょうか?

これらのものを統合する方がはるかに優れています。

コマンドラインインターフェースは単なるインターフェースであり、特にひどいものです。それは不可欠ですが、無意味な癖や制限でいっぱいです。

「ワークフローを自動化するため、既存のツール」はそれぞれ、必要がある実際の作業を行い整頓クラスを持っていた後、コマンドラインオプションが解析されています。

理想的には、public static void main関数はこれらの「既存のツール」のそれぞれで2つのことを実行します。

  1. コマンドラインオプション/引数パーサーを呼び出します。

  2. 実際の作業を行う整頓されたクラスを呼び出します。AntまたはMavenがすべての構文解析と意思決定を処理した後で実際の作業を行うAntタスクまたはMavenタスクを考えてみてください。

これらを統合する場合、実際の作業を行う整頓されたクラスが必要です。

それらが存在しない場合は、すべてのコマンドライン解析とは別に、実際の作業を行う整頓されたクラスを作成するために、これらのツールをすべて書き直す必要があります。

これらの整頓されたクラスがどのように機能するかについてのガイダンスについては、Ant(またはMaven)を読んで、さまざまなワーカータスクの定義方法を確認してください。これは、コマンドラインに戻らずに、複数の異種のものがどのように統合されるかについての良いメンタルモデルです。


私の場合、作業を行うクラスはツール全体であり、mainメソッド、CLI解析メソッドなどが含まれています。かなり厄介です:(
cdeszaq

@cdeszaq:その場合、修正する必要があります。それはひどく書き直すのは難しいことではありません、そしてそれ行われなければなりません。
S.Lott、2012

3
締め切りに応じて、既存のCLインターフェイスと統合して、適切に統合されたソリューションに徐々に移植することもできます。しかし、これを今修正する時間があれば、修正してください:-)
Martijn Verburg

1
@MartijnVerburg:良い点。多くの場合、明確な優先順位があります。一部のワークフローは、より緊密に統合されているか、「サブワークフロー」として個別に使用できる可能性があります。これにより、最も価値の高いものから最も価値の低いものへのやり直しのバックログにつながる可能性があります。
S.Lott

私の最後の雇用主では、ユーティリティexeの実行に問題がありました(私たちのコードではなく)。「上級」開発者がこのexeを実行できない理由を診断できるように支援するため、batファイルを作成して開始することを提案しました。出来た。彼は問題を探すのをやめ、それがそれがドアから出た方法でした。私が学んだ教訓は1.決定を下す人に問題をトラブルシューティングするための悪い考えを決して提案しないことです。2.できるだけライブラリを使用するか、独自のロジックを内部化します。その「修正」には、一部のマシンで多数の技術サポートが必要です。彼はまた、テストやソース管理を信じていなかったので、驚きはありません...
Rig

8

それが機能する場合、私はそれを放っておくと言います。

プログラマーは、ソフトウェアの問題を解決することで組織に価値をもたらします。一定の時間内に質と量の両方でより多くの問題を解決することは、組織におけるあなたの価値に直接関係しています。この時間を費やしてコードを作成すると、より重要な問題の解決から離れるため、価値が減少します。

ただし、時間の浪費を軽減する可能性があるいくつかの要因は、スケーラビリティと、外部プログラムの安定性に懸念がある場合です。


同意する。サードパーティのプログラム/コードをアプリに統合しようとすると、多くの問題が発生する可能性があります。時には必要なこともありますが、「壊れていない場合は修正しないでください」という言葉が言うように
jfrankcarr

5
問題を解決することは素晴らしいことです。他の問題への扉を開いている間にいくつかの問題を解決することはそれほど素晴らしいことではありません。
yfeldblum

5

それは「良い」または「悪い」ではありません。単に異なるコストとメリットがあります。

多くの場合、統合ポイントの数が増えて複雑さが増すほど、ソフトウェアを作成して保守するのにコストがかかります。

  • 作成する関数の統合コストはほとんどありません。
  • サードパーティのライブラリは、わずかに大きい統合コストを持っています。
  • 実行する必要がある別のプログラムには、さらに大きな統合コストがかかります。

これらは統合コストであり、ソフトウェアの作成と保守にかかるコストを含む総コストと比較検討する必要があることに注意してください。

あなたは非常に経験の浅いプログラマーですが、長い間パワーユーザーである場合があります。

  • 経験と知識で統合コストを軽減できるため、統合コストが高くても、「シェルアウト」する場合、総コストは低くなる可能性があります。
  • 関数を自分で書く場合、プログラミングの経験が浅いため、統合コストが低いにもかかわらず、総コストはかなり高くなる可能性があります。

理解する最良の方法:

外部のコマンドラインアプリケーションを呼び出すか、そのアプリケーションのロジックを内部化する方が良いでしょうか?

自分で費用を計算することです。コストは、環境、状況、人によって異なります。ほとんどの場合、コマンドラインを呼び出すにはより多くのコストがかかりますが、常にそれが確実に分析を行う唯一の方法ではありません。


私の場合、それは本質的に、私のアプリケーションと同じようにたまたまオープンソースでJavaで書かれた外部アプリケーションです。残念ながら、外部ライブラリがCLIインターフェース自体に緊密にバンドルされているため、外部アプリケーションが使用するライブラリはありません。それ以外、すべての良い点。
cdeszaq

1

理想的には、それを統合する必要があります。特に、これが配布されるアプリである場合-依存関係と構成の数を減らすと、それが簡単になります。しかし、もちろん、それはあなたの特定のケースのコスト/利益の問題です。

とはいえ、考慮すべきことの1つは安定性です。私は数年前に似たようなものに遭遇し、cliプログラムを実施しました。不安定すぎて、24/7で実行する必要のある親アプリケーションをクラッシュさせクラッシュさせたくありませんでした。現在、これはJavaアプリではありませんでしたが、それでもなお、当てはまる可能性のある問題が発生した場合は、それを考慮に入れておきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.