Чи краще ідея викликати зовнішню програму командного рядка або інтерналізувати логіку цього додатка?


10

У мене є "трубопровідний" процес, який по суті є просто з'єднанням безлічі існуючих інструментів для автоматизації робочого процесу. Для одного з кроків існує існуючий інструмент командного рядка, який вже виконує те, що потрібно зробити для цього кроку.

Зовнішній інструмент CLI базується на Java, як і в моєму конвеєрі, тому можна було б інтегрувати інструмент безпосередньо в етап конвеєра, але інструмент дуже складний і в даний час тісно пов'язаний з введенням командного рядка (щось подібне 37 параметрів прапорця конфігурації).

Питання: чи краще ідея просто зателефонувати та викликати зовнішній процес, чи краще було б інтегрувати зовнішній код у свою програму?

Які плюси та мінуси інтеграції проти виклику зовнішнього процесу?


Інструмент командного рядка чимось ви керуєте, чи це розроблено іншою стороною?
whatsisname

Це інструмент dIC4che DICOM з відкритим кодом (ліцензія Mozilla), тому він був розроблений іншою стороною, але я можу з ним робити майже все, що завгодно.
cdeszaq

Відповіді:


12

Чи є кращою ідеєю просто зателефонувати та викликати зовнішній процес, чи було б краще інтегрувати зовнішній код у свою програму?

Це набагато краще , щоб інтегрувати ці речі.

Інтерфейс командного рядка - це просто інтерфейс і особливо жахливий. Це важливо, але воно також заповнене химерностями та обмеженнями, які не є розумними.

Кожен з "існуючих інструментів для автоматизації робочого процесу" повинен мати охайний клас, який виконує справжню роботу після розбору параметрів командного рядка.

В ідеалі public static void mainфункція виконує дві речі в кожному з "існуючих інструментів".

  1. Він викликає деякий параметр / аналізатор аргументу командного рядка.

  2. Він викликає охайний клас, який робить справжню роботу. Подумайте про завдання мурашки або завдання Мейвена, яке виконує справжню роботу після того, як Мураха або Мейвен обробили весь аналіз і прийняття рішень.

Коли ви збираєтесь інтегрувати ці речі, ви хочете, щоб акуратні класи, які виконують справжню роботу.

Якщо їх не існує, вам доведеться переписати всі ці інструменти, щоб створити охайний клас, який виконує справжню роботу, окремо від усіх розборів командного рядка.

Для вказівки щодо того, як повинні працювати ці охайні класи, прочитайте Ant (або Maven), щоб побачити, як вони визначають різні робочі завдання. Це гарна ментальна модель того, як інтегруються багато, різні речі, не повертаючись до командного рядка.


У моєму випадку клас, який виконує роботу, є цілим інструментом і містить mainметод, методи CLI-розбору тощо. Це досить противно :(
cdeszaq

@cdeszaq: У такому випадку це потрібно виправити. Це не страшно складно переписати, і це треба зробити.
S.Lott

3
Додам, що залежно від термінів ви можете інтегруватися з існуючим інтерфейсом CL та переходити на належне інтегроване рішення з часом. Але якщо у вас є час виправити це, то зробіть це так :-)
Martijn Verburg

1
@MartijnVerburg: Добрий момент. Часто є чіткий пріоритет. Деякі робочі процеси є більш тісно інтегрованими або потенційно можуть мати окреме використання як "під-робочий процес". Це може призвести до відставання переробки від найціннішого до найменш цінного.
S.Lott

У мого останнього роботодавця у нас виникла проблема з виконанням утиліти exe (ми, але зовсім не мій код). Допомагаючи "старшому" розробнику діагностувати, чому цей exe не буде виконуватись, я запропонував написати файл bat, щоб розпочати його. Це спрацювало. Він перестав шукати проблему і ось як вона вийшла за двері. Урок, який я засвоїв, це 1. Ніколи не пропонуйте погану ідею вирішити проблему тому, хто приймає рішення. 2. Використовуйте бібліотеки або максимально інтерналізуйте власну логіку. Це "виправлення" коштувало безлічі технічної підтримки на деяких машинах. Він також не вірив тестуванню чи контролю джерел, тому не дивуйся ...
Rig

8

Я б сказав, залиште це в спокої, якщо це спрацює.

Як програміст ви приносите користь своїй організації, вирішуючи проблеми з програмним забезпеченням. Вирішення більшої кількості проблем як у якості, так і в кількості за певний проміжок часу безпосередньо пов'язане з вашою цінністю в організації. Витрата цього часу на створення коду зменшує вашу цінність, оскільки відводить вас від вирішення більш важливої ​​проблеми.

Однак, декілька факторів, які можуть пом'якшити витрачання часу, - це масштабованість і якби були занепокоєння щодо стабільності зовнішніх програм.


Я згоден. Ви можете відкрити собі багато проблем, намагаючись інтегрувати сторонні програми / код у свій додаток. Іноді це потрібно, але, як висловлюється, "Якщо це не
зламається

5
Вирішення проблем - це чудово. Вирішення одних проблем під час відкриття дверей для інших проблем не так вже й велике.
yfeldblum

5

Це не "краще" чи "гірше". Просто існують різні витрати та вигоди.

Часто дорожче писати та підтримувати частину програмного забезпечення, чим більша кількість точок інтеграції робиться для додаткової складності.

  • Функція, яку ви пишете, має дуже малі витрати на інтеграцію.
  • Бібліотека третьої сторони має трохи більшу вартість інтеграції.
  • Окрема програма, яку ви маєте виконати, матиме ще більшу вартість інтеграції.

Зауважте, що це витрати на інтеграцію, які вам доведеться зважити на загальну вартість, що включає, серед іншого, вартість написання та обслуговування програмного забезпечення.

Можливо, ви є дуже недосвідченим програмістом, але давно користуєтеся енергією.

  • Якщо ви повинні "розкласти", ваша загальна вартість може бути низькою, незважаючи на більш високу вартість інтеграції, оскільки ви можете пом'якшити вартість інтеграції своїм досвідом та знаннями.
  • Якщо ви повинні писати функцію самостійно, ваша загальна вартість може бути досить високою, незважаючи на низьку вартість інтеграції через ваше недосвідчене програмування.

Найкращий спосіб з'ясувати:

Чи краще ідея викликати зовнішню програму командного рядка або інтерналізувати логіку цього додатка?

Це розрахувати витрати на себе. Вартість буде різною для різних середовищ, ситуацій та людей. Більшу частину часу обійдеться більше, щоб викликати командний рядок, але не завжди і єдиний спосіб переконатися, що це зробити аналіз.


У моєму випадку це, по суті, зовнішня програма, яка буває з відкритим кодом та написана на Java, як і моя програма. На жаль, не існує просто бібліотека, яку використовує зовнішня програма, оскільки ця бібліотека вбудована в інтерфейс CLI. Крім цього, всі хороші моменти.
cdeszaq

1

В ідеалі ви хочете інтегрувати його. Особливо, якщо це додаток, який розповсюджується - зменшення кількості залежностей та конфігурацій полегшить це. Але це, звичайно, питання витрат / вигод для вашого конкретного випадку.

Однак, важливо враховувати стабільність. Я зіткнувся з чимось подібним пару років тому і втримав програму cli на місці. Це було занадто нестабільно, і я не хотів, щоб його збій зняв батьківську програму, яку потрібно запустити 24/7. Тепер це було не додатком Java, але тим не менше, якщо це проблема, яка може бути застосована, можливо, ви захочете мати це на увазі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.