调用外部命令行应用程序或内部化该应用程序的逻辑是更好的主意吗?


10

我有一个“管道”式的过程,该过程实质上只是将一堆现有工具链接在一起以使工作流自动化。对于其中一个步骤,有一个现有的命令行工具已经可以完成该步骤需要执行的操作。

外部CLI工具是基于Java的,我的管道也是基于管道的,因此可以将工具直接集成到管道步骤中,但是该工具非常复杂,目前与具有命令行输入密切相关(例如37个配置标志选项)。

问题是:简单地调用并调用外部过程是一个更好的主意,还是将外部代码集成到我的应用程序中会更好?

集成与调用外部过程的利弊是什么?


命令行工具是您控制的东西,还是由另一方开发的工具?
whatsisname 2012年

它是开放源代码(Mozilla许可)的dcm4che DICOM工具包,所以它是由另一方开发的,但是我可以随心所欲地使用它。
cdeszaq

Answers:


12

简单地调用并调用外部过程是一个更好的主意,还是将外部代码集成到我的应用程序中会更好?

这是很多更好的整合这些东西。

命令行界面只是一个界面,而且是一个非常糟糕的界面。这是必不可少的,但同时也充满了不明智的怪癖和局限性。

每个“使工作流程自动化的现有工具” 都应该有一个整洁的类,该类在解析了命令行选项之后才能完成实际工作。

理想情况下,public static void main函数在每个“现有工具”中都做两件事。

  1. 它调用一些命令行选项/参数解析器。

  2. 它调用完成实际工作的整洁类。考虑一下在Ant或Maven处理完所有解析和决策之后执行实际工作的Ant任务或Maven任务。

当您整合这些东西时,您需要做真正工作的整洁的类。

如果它们不存在,那么您将不得不重写所有这些工具,以创建能够完成实际工作的整洁类,而与所有命令行解析分开。

有关如何使这些整洁的类工作的指南,请阅读Ant(或Maven)以了解它们如何定义各种辅助任务。这是一个很好的思维模型,用于说明如何将多种不同的事物集成在一起而无需返回命令行。


就我而言,完成工作的类是整个工具,并且包含main方法,CLI分析方法等。这很讨厌:(
cdeszaq 2012年

@cdeszaq:在这种情况下,需要对其进行修复。这不是一个非常困难的重写,必须完成。
S.Lott

3
我要补充一点,根据您的截止日期,您可以与现有的CL接口集成,并随着时间的推移移植到适当集成的解决方案中。但是,如果您现在有时间解决此问题,请这样做:-)
Martijn Verburg'2

1
@MartijnVerburg:好点。通常,有一个明确的优先事项。一些工作流程被更紧密地集成在一起,或者有可能单独用作“子工作流程”。这可能导致返工积压,从最有价值的到最不有价值的。
S.Lott

在我的上一个雇主处,我们在执行实用程序exe时遇到了问题(我们但根本没有代码)。帮助“高级”开发人员诊断该exe文件为什么不执行,我建议编写一个bat文件来启动它。有效。他停止寻找问题,这就是问题的出路。我吸取的教训是1.永远不要提出一个坏主意,以解决问题给做出决定的人。2.使用库或尽可能内部化自己的逻辑。该“修复”花费了一些机器上的大量技术支持。他也不相信测试或源代码控制,所以不要感到惊讶……
Rig

8

我想说,如果可行的话,别管它。

作为程序员,您可以通过解决软件问题为组织带来价值。在给定的时间内解决质量和数量上更多的问题与您在组织中的价值直接相关。花时间创建代码会减少您的价值,因为它使您无法解决更重要的问题。

但是,可能会减少花费时间的几个因素是可伸缩性,以及是否需要考虑外部程序的稳定性。


我同意。尝试将第三方程序/代码集成到您的应用中时,您可能会遇到很多麻烦。有时有必要,但俗话说:“如果还没有破裂,就不要修复”
jfrankcarr 2012年

5
解决问题很棒。在为其他问题打开大门的同时解决一些问题并不是那么好。
yfeldblum 2012年

5

它不是“更好”或“更糟”。成本和收益是完全不同的。

集成点的数量越多,编写和维护软件的成本就越高,从而增加了复杂性。

  • 您编写的函数具有很少的集成成本。
  • 第三方库的集成成本略高。
  • 您必须执行的单独程序将具有甚至更高的集成成本。

请注意,这些是集成成本,您必须权衡总成本,其中总成本包括编写和维护软件的成本。

您可能是一个非常缺乏经验的程序员,但却是长期的高级用户。

  • 如果您要“掏腰包”,尽管集成成本较高,但总成本可能较低,因为您可以凭经验和知识来减轻集成成本。
  • 如果您自己编写函数,则由于编程经验不足,尽管集成成本较低,但总成本可能会很高。

找出的最佳方法:

调用外部命令行应用程序或内部化该应用程序的逻辑是更好的主意吗?

是为您自己计算费用。对于不同的环境,情况和人员,成本将有所不同。在大多数情况下,调出命令行会花费更多,但并非总是如此,这是确保执行分析的唯一方法。


在我而言,它本质上是一个外部应用程序恰好是开源和Java编写的,就像我的应用程序。不幸的是,外部应用程序并没有简单地使用一个库,因为该库被紧密地捆绑到CLI界面本身中。除此之外,所有优点。
cdeszaq

1

理想情况下,您希望将其集成。尤其是如果这是一个分发的应用程序-减少依赖关系和配置的数量将使事情变得更容易。但这当然是针对您的特定情况的成本/收益问题。

也就是说,要考虑的一件事是稳定性。几年前,我遇到了类似的情况,并将cli程序保留在原位。它太不稳定了,我不希望崩溃而导致需要运行24/7的父应用程序崩溃。现在这不是一个Java应用程序,但仍然如此,如果它可能会引起问题,您可能需要考虑这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.