Ist es besser, eine externe Befehlszeilenanwendung aufzurufen oder die Logik dieser Anwendung zu verinnerlichen?

10

Ich habe eine Art "Pipeline" -Prozess, der im Wesentlichen nur eine Reihe vorhandener Tools miteinander verbindet, um einen Workflow zu automatisieren. Für einen der Schritte gibt es ein vorhandenes Befehlszeilentool, das bereits das erledigt, was dieser Schritt tun muss.

Das externe CLI-Tool basiert auf Java, ebenso wie meine Pipeline. Es wäre also möglich, das Tool direkt in den Pipeline-Schritt zu integrieren. Das Tool ist jedoch sehr komplex und derzeit eng mit der Eingabe über die Befehlszeile verbunden (so etwas wie) 37 Konfigurationsflag-Optionen).

Die Frage ist: Ist es eine bessere Idee, einfach den externen Prozess aufzurufen und aufzurufen, oder wäre es besser, den externen Code in meine Anwendung zu integrieren?

Was sind die Vor- und Nachteile der Integration gegenüber dem Aufruf des externen Prozesses?

cdeszaq
quelle
Ist das Befehlszeilentool etwas, das Sie steuern, oder wird es von einer anderen Partei entwickelt?
Whatsisname
Es ist das Open Source (Mozilla Lizenz) dcm4che DICOM Toolkit, also wurde es von einer anderen Partei entwickelt, aber ich kann damit so ziemlich alles machen, was ich will.
Cdeszaq

Antworten:

12

Ist es eine bessere Idee, einfach den externen Prozess aufzurufen und aufzurufen, oder wäre es besser, den externen Code in meine Anwendung zu integrieren?

Es ist viel besser, diese Dinge zu integrieren.

Die Befehlszeilenschnittstelle ist nur eine Schnittstelle, und eine besonders schreckliche. Es ist wichtig, aber es ist auch voller Macken und Einschränkungen, die nicht sinnvoll sind.

Jedes der "vorhandenen Tools zur Automatisierung eines Workflows" sollte eine ordentliche Klasse haben, die die eigentliche Arbeit erledigt, nachdem die Befehlszeilenoptionen analysiert wurden.

Im Idealfall führt die public static void mainFunktion in jedem dieser "vorhandenen Tools" zwei Dinge aus.

  1. Es ruft einen Befehlszeilenoptions- / Argumentparser auf.

  2. Es ruft die ordentliche Klasse auf, die die eigentliche Arbeit erledigt. Stellen Sie sich eine Ant-Aufgabe oder eine Maven-Aufgabe vor, die die eigentliche Arbeit erledigt, nachdem Ant oder Maven die gesamte Analyse und Entscheidungsfindung durchgeführt haben.

Wenn Sie diese Dinge integrieren möchten, möchten Sie die ordentlichen Klassen, die die eigentliche Arbeit erledigen.

Wenn sie nicht vorhanden sind, müssen Sie alle diese Tools neu schreiben, um die ordentliche Klasse zu erstellen, die die eigentliche Arbeit erledigt, getrennt von allen Befehlszeilenanalysen.

Lesen Sie Ant (oder Maven), um zu erfahren, wie diese verschiedenen Klassen funktionieren. Es ist ein gutes mentales Modell dafür, wie mehrere unterschiedliche Dinge integriert werden, ohne zur Befehlszeile zurückzukehren.

S.Lott
quelle
In meinem Fall ist die Klasse, die die Arbeit main
erledigt,
@cdeszaq: In diesem Fall muss es behoben werden. Es ist kein besonders schwieriges Umschreiben, und es muss getan werden.
S.Lott
3
Ich möchte hinzufügen, dass Sie abhängig von Ihren Fristen im Laufe der Zeit in die vorhandene CL-Schnittstelle integrieren und auf eine ordnungsgemäß integrierte Lösung portieren können. Aber wenn Sie jetzt Zeit haben, dies zu beheben, dann tun Sie dies :-)
Martijn Verburg
1
@ MartinijnVerburg: Guter Punkt. Oft gibt es eine klare Priorität. Ein Teil des Workflows ist enger integriert oder könnte möglicherweise separat als "Unterworkflow" verwendet werden. Dies kann zu einem Nacharbeitsstau von am wertvollsten zum am wenigsten wertvollen führen.
S.Lott
Bei meinem letzten Arbeitgeber hatten wir ein Problem beim Ausführen einer Utility-Exe (wir, aber überhaupt nicht meinen Code). Um dem "älteren" Entwickler bei der Diagnose zu helfen, warum diese Exe nicht ausgeführt wird, schlug ich vor, eine Bat-Datei zu schreiben, um sie zu starten. Es funktionierte. Er hörte auf, nach dem Problem zu suchen, und so ging es aus der Tür. Die Lektion, die ich gelernt habe, ist 1. Schlagen Sie niemals jemandem, der Entscheidungen trifft, eine schlechte Idee vor, um ein Problem zu beheben. 2. Verwenden Sie Bibliotheken oder verinnerlichen Sie Ihre eigene Logik so weit wie möglich. Diese "Lösung" kostete auf einigen Maschinen eine Menge technischen Support. Er glaubte auch nicht an Tests oder Quellcodeverwaltung, also keine Überraschung ...
Rig
8

Ich würde sagen, lass es in Ruhe, wenn es funktioniert.

Als Programmierer bringen Sie Wert in Ihr Unternehmen, indem Sie Probleme mit Software lösen. Die Lösung weiterer Qualitäts- und Quantitätsprobleme innerhalb eines bestimmten Zeitraums hängt direkt mit Ihrem Wert in der Organisation zusammen. Wenn Sie diese Zeit für die Erstellung von Code verwenden, verringert sich Ihr Wert, da Sie kein wichtigeres Problem lösen müssen.

Einige Faktoren, die den Zeitaufwand verringern könnten, wären jedoch die Skalierbarkeit und Bedenken hinsichtlich der Stabilität externer Programme.

Bigtech
quelle
Genau. Sie können sich vielen Problemen stellen, wenn Sie versuchen, Programme / Code von Drittanbietern in Ihre App zu integrieren. Manchmal ist es notwendig, aber wie das Sprichwort sagt: "Wenn es nicht kaputt ist, reparieren Sie es nicht"
jfrankcarr
5
Probleme zu lösen ist großartig. Einige Probleme zu lösen, während die Tür für andere Probleme geöffnet wird, ist nicht so toll.
Yfeldblum
5

Es ist nicht "besser" oder "schlechter". Es gibt einfach unterschiedliche Kosten und Nutzen.

Das Schreiben und Warten einer Software ist oft teurer, je mehr Integrationspunkte für die zusätzliche Komplexität erforderlich sind.

  • Eine von Ihnen geschriebene Funktion hat nur sehr geringe Integrationskosten.
  • Eine Drittanbieter-Bibliothek hat etwas höhere Integrationskosten.
  • Ein separates Programm, das Sie ausführen müssen, hat noch höhere Integrationskosten.

Beachten Sie, dass dies Integrationskosten sind, die Sie gegen die Gesamtkosten abwägen müssen, zu denen unter anderem die Kosten für das Schreiben und Warten von Software gehören.

Es kann sein, dass Sie ein sehr unerfahrener Programmierer sind, aber ein langjähriger Power-User.

  • Wenn Sie "berappen" würden, könnten Ihre Gesamtkosten trotz der höheren Integrationskosten niedrig sein, da Sie die Integrationskosten mit Ihrer Erfahrung und Ihrem Wissen verringern können.
  • Wenn Sie die Funktion selbst schreiben, können Ihre Gesamtkosten trotz der geringen Integrationskosten aufgrund Ihrer unerfahrenen Programmierung recht hoch sein.

Der beste Weg, um herauszufinden:

Ist es besser, eine externe Befehlszeilenanwendung aufzurufen oder die Logik dieser Anwendung zu verinnerlichen?

Ist es, die Kosten selbst zu berechnen. Die Kosten sind für verschiedene Umgebungen, Situationen und Personen unterschiedlich. Meistens kostet es mehr, die Befehlszeile aufzurufen, aber nicht immer und der einzige Weg, um sicherzugehen, dass die Analyse durchgeführt wird.

Dietbuddha
quelle
In meinem Fall ist es im Wesentlichen eine externe Anwendung, die geschieht , genauso wie in Java Open-Source und geschrieben wird meine Anwendung. Leider gibt es nicht nur eine Bibliothek, die von der externen Anwendung verwendet wird, da diese Bibliothek eng in der CLI-Schnittstelle selbst gebündelt ist. Ansonsten alles gute Punkte.
Cdeszaq
1

Idealerweise möchten Sie es integrieren. Besonders wenn es sich um eine App handelt, die verteilt wird - die Reduzierung der Anzahl von Abhängigkeiten und Konfigurationen erleichtert dies. Aber es ist natürlich ein Kosten-Nutzen-Problem für Ihren speziellen Fall.

Eine Sache, die berücksichtigt werden muss, ist die Stabilität. Ich bin vor ein paar Jahren auf etwas Ähnliches gestoßen und habe das Cli-Programm beibehalten. Es war zu instabil, und ich wollte nicht seine Krachen die übergeordnete Anwendung herunterzunehmen, die 24/7 laufen benötigt. Dies war keine Java-App, aber dennoch, wenn es sich um ein Problem handelt, das möglicherweise zutrifft, sollten Sie dies berücksichtigen.

GroßmeisterB
quelle