Czy lepiej jest wywołać zewnętrzną aplikację wiersza polecenia lub zinternalizować logikę tej aplikacji?

10

Mam proces „potokowy”, który zasadniczo łączy ze sobą kilka istniejących narzędzi do automatyzacji przepływu pracy. Dla jednego z kroków istnieje narzędzie wiersza polecenia, które już robi wszystko, co ten krok musi zrobić.

Zewnętrzne narzędzie CLI jest oparte na Javie, podobnie jak mój potok, więc byłoby możliwe zintegrowanie narzędzia bezpośrednio z etapem potoku, ale narzędzie jest bardzo złożone i jest obecnie ściśle powiązane z wprowadzaniem danych z wiersza poleceń (coś w rodzaju 37 opcji flagi konfiguracji).

Pytanie brzmi: czy lepiej jest po prostu wywołać i wywołać zewnętrzny proces, czy lepiej byłoby zintegrować zewnętrzny kod z moją aplikacją?

Jakie są zalety / wady integracji a wywołanie procesu zewnętrznego?

cdeszaq
źródło
Czy narzędzie wiersza polecenia jest czymś, co kontrolujesz, czy też zostało opracowane przez inną stronę?
whatsisname
Jest to open source (licencja Mozilla) dcm4che DICOM, więc został opracowany przez inną firmę, ale mogę z tym zrobić wszystko, co tylko zechcę.
cdeszaq

Odpowiedzi:

12

Czy lepiej jest po prostu wywołać i wywołać proces zewnętrzny, czy lepiej byłoby zintegrować kod zewnętrzny z moją aplikacją?

Jest dużo lepiej zintegrować te rzeczy.

Interfejs wiersza poleceń jest tylko interfejsem, a szczególnie okropnym. Jest to niezbędne, ale jest też pełne dziwactw i ograniczeń, które nie są rozsądne.

Każde z „istniejących narzędzi do automatyzacji przepływu pracy” powinno mieć uporządkowaną klasę, która wykonuje prawdziwą pracę po przeanalizowaniu opcji wiersza polecenia.

Idealnie, public static void mainfunkcja wykonuje dwie rzeczy w każdym z tych „istniejących narzędzi”.

  1. Wywołuje niektóre opcje wiersza poleceń / analizator składni argumentów.

  2. Przywołuje schludną klasę, która wykonuje prawdziwą pracę. Pomyśl o zadaniu Mrówka lub Mavenie, które wykonuje prawdziwą pracę po tym, jak Mrówka lub Maven wykonają wszystkie analizy i podejmowanie decyzji.

Kiedy idziesz do integracji tych rzeczy, chcesz uporządkowane klasy, które wykonują prawdziwą pracę.

Jeśli nie istnieją, będziesz musiał przepisać wszystkie te narzędzia, aby utworzyć uporządkowaną klasę, która wykona prawdziwą pracę, niezależnie od analizy składni wiersza poleceń.

Aby uzyskać wskazówki, jak te uporządkowane klasy powinny działać, przeczytaj Ant (lub Maven), aby zobaczyć, jak definiują różne zadania pracownicze. To dobry model mentalny do tego, jak wiele różnych elementów jest zintegrowanych bez powrotu do wiersza poleceń.

S.Lott
źródło
W moim przypadku klasa wykonująca pracę jest całym narzędziem i zawiera mainmetodę, metody analizy CLI itp. Jest to raczej paskudne :(
cdeszaq
@cdeszaq: W takim przypadku należy to naprawić. To nie jest strasznie trudne przepisywanie i trzeba to zrobić.
S.Lott,
3
Dodam, że w zależności od terminów można z czasem zintegrować z istniejącym interfejsem CL i przenieść do odpowiednio zintegrowanego rozwiązania. Ale jeśli masz teraz czas, aby to naprawić, zrób to :-)
Martijn Verburg
1
@MartijnVerburg: Good Point. Często istnieje wyraźny priorytet. Niektóre przepływy pracy są ściślej zintegrowane lub mogą potencjalnie mieć osobne zastosowanie jako „przepływy podrzędne”. Może to prowadzić do zaległości w przerabianiu od najbardziej wartościowych do najmniej wartościowych.
S.Lott,
U mojego ostatniego pracodawcy mieliśmy problem z uruchomieniem exe narzędzia (my, ale nie mój kod w ogóle). Pomagając „starszemu” deweloperowi zdiagnozować, dlaczego ten exe się nie uruchomił, zasugerowałem napisanie pliku nietoperza, aby go uruchomić. Zadziałało. Przestał szukać problemu i tak wyszedł za drzwi. Lekcja, której się nauczyłem, to 1. Nigdy nie proponuj złego pomysłu na rozwiązanie problemu komuś, kto podejmuje decyzje. 2. Używaj bibliotek lub internalizuj swoją własną logikę tak bardzo, jak to możliwe. Ta „naprawa” kosztowała wiele wsparcia technicznego na niektórych komputerach. Nie wierzył też w testowanie ani kontrolę źródła, więc nic dziwnego ...
Przypomnienie
8

Powiedziałbym, zostaw to w spokoju, jeśli to działa.

Jako programista wnosisz wartość do swojej organizacji, rozwiązując problemy z oprogramowaniem. Rozwiązanie większej ilości problemów zarówno pod względem jakości, jak i ilości w określonym czasie jest bezpośrednio związane z twoją wartością w organizacji. Spędzanie tego czasu na tworzeniu kodu zmniejsza twoją wartość, ponieważ odciąga cię od rozwiązania ważniejszego problemu.

Jednak kilkoma czynnikami, które mogłyby złagodzić spędzanie czasu, byłyby skalowalność i gdyby były jakiekolwiek obawy dotyczące stabilności programów zewnętrznych.

bigtech
źródło
Zgadzam się. Możesz otworzyć się na wiele problemów związanych z integracją programów / kodu innych firm w swojej aplikacji. Czasami jest to konieczne, ale jak mówi przysłowie: „Jeśli się nie zepsuło, nie naprawiaj tego”
jfrankcarr
5
Rozwiązywanie problemów jest świetne. Rozwiązywanie niektórych problemów podczas otwierania drzwi do innych problemów nie jest tak świetne.
yfeldblum
5

To nie jest „lepsze” ani „gorsze”. Istnieją po prostu różne koszty i korzyści.

Często droższe jest pisanie i utrzymywanie oprogramowania, im większa liczba punktów integracji powoduje dodatkową złożoność.

  • Pisana funkcja ma bardzo niski koszt integracji.
  • Biblioteka innej firmy ma nieco większy koszt integracji.
  • Osobny program, który musisz wykonać, będzie miał jeszcze większy koszt integracji.

Uwaga: są to koszty integracji, które należy porównać z całkowitymi kosztami, które obejmują między innymi koszt pisania i utrzymania oprogramowania.

Może być tak, że jesteś bardzo niedoświadczonym programistą, ale od dawna zaawansowanym użytkownikiem.

  • Jeśli chcesz „wydostać się”, całkowity koszt może być niski pomimo wyższych kosztów integracji, ponieważ możesz zmniejszyć koszty integracji dzięki swojemu doświadczeniu i wiedzy.
  • Jeśli sam napiszesz tę funkcję, całkowity koszt może być dość wysoki, pomimo niskich kosztów integracji z powodu braku doświadczenia w programowaniu.

Najlepszy sposób, aby dowiedzieć się:

Czy lepiej jest wywołać zewnętrzną aplikację wiersza polecenia lub zinternalizować logikę tej aplikacji?

Czy obliczyć koszty dla siebie. Koszt będzie różny dla różnych środowisk, sytuacji i ludzi. W większości przypadków koszt połączenia z linią poleceń jest wyższy, ale nie zawsze i jest to jedyny sposób, aby mieć pewność, że przeprowadzi analizę.

dietbuddha
źródło
W moim przypadku, to jest w istocie zewnętrzna aplikacja, która dzieje się open-source i napisany w Javie, podobnie jak mojej aplikacji. Niestety, nie jest to biblioteka, z której korzysta aplikacja zewnętrzna, ponieważ biblioteka ta jest ściśle związana z samym interfejsem CLI. Poza tym wszystkie dobre punkty.
cdeszaq
1

Najlepiej byłoby to zintegrować. Zwłaszcza jeśli jest to aplikacja, która jest dystrybuowana - zmniejszenie liczby zależności i konfiguracji ułatwi to. Ale jest to oczywiście kwestia kosztów / korzyści dla konkretnego przypadku.

To powiedziawszy, jedną rzeczą do rozważenia jest stabilność. Kilka lat temu spotkałem coś podobnego i utrzymałem program cli na swoim miejscu. Był zbyt niestabilny i nie chciałem, aby jego awaria spowodowała usunięcie aplikacji nadrzędnej, która musiała działać 24/7. Teraz nie była to aplikacja Java, ale mimo to, jeśli może to dotyczyć problemu, warto wziąć to pod uwagę.

Grandmaster B.
źródło