Лучше ли вызвать внешнее приложение командной строки или усвоить логику этого приложения?

10

У меня есть «конвейерный» процесс, который по сути просто связывает воедино кучу существующих инструментов для автоматизации рабочего процесса. Для одного из шагов существует существующий инструмент командной строки, который уже делает суть того, что должен сделать этот шаг.

Внешний инструмент CLI основан на Java, как и мой конвейер, поэтому можно было бы интегрировать инструмент непосредственно в шаг конвейера, но инструмент очень сложен и в настоящее время тесно связан с вводом данных из командной строки (что-то вроде 37 опций флага конфигурации).

Вопрос заключается в следующем: лучше ли просто вызывать и вызывать внешний процесс или лучше интегрировать внешний код в мое приложение?

Каковы плюсы / минусы интеграции против вызова внешнего процесса?

cdeszaq
источник
Средство командной строки - это то, чем вы управляете, или оно разработано другой стороной?
whatsisname
Это набор инструментов DICOM dcm4che с открытым исходным кодом (лицензия Mozilla), так что он был разработан другой стороной, но я могу делать с ним практически все, что захочу.
cdeszaq

Ответы:

12

Лучше просто вызывать и вызывать внешний процесс, или лучше интегрировать внешний код в мое приложение?

Это гораздо лучше , чтобы интегрировать эти вещи.

Интерфейс командной строки - это просто интерфейс, и особенно ужасный. Это важно, но оно также заполнено причудами и ограничениями, которые не имеют смысла.

Каждый из «существующих инструментов для автоматизации рабочего процесса» должен иметь аккуратный класс, который выполняет реальную работу после анализа параметров командной строки.

В идеале, public static void mainфункция делает две вещи в каждом из этих «существующих инструментов».

  1. Он вызывает некоторую опцию командной строки / анализатор аргументов.

  2. Он вызывает аккуратный класс, который выполняет настоящую работу. Подумайте о задаче Ant или задаче Maven, которая выполняет реальную работу после того, как Ant или Maven обработали весь анализ и принятие решения.

Когда вы собираетесь интегрировать эти вещи, вы хотите, чтобы аккуратные классы выполняли реальную работу.

Если они не существуют, вам придется переписать все эти инструменты, чтобы создать класс tidy, который выполняет реальную работу, отдельно от всего анализа командной строки.

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

С. Лотт
источник
В моем случае класс, выполняющий работу, - это весь инструмент, содержащий mainметод, методы CLI-parse и т. Д. Это довольно неприятно :(
cdeszaq
@cdeszaq: в этом случае это нужно исправить. Это не очень сложно переписать, и это должно быть сделано.
S.Lott
3
Я бы добавил, что в зависимости от ваших сроков вы можете со временем интегрироваться с существующим интерфейсом CL и портировать на должным образом интегрированное решение. Но если у вас есть время, чтобы исправить это сейчас, сделайте это :-)
Martijn Verburg
1
@MartijnVerburg: Хороший вопрос. Часто есть четкий приоритет. Некоторые из рабочих процессов более тесно интегрированы или могут иметь отдельное использование в качестве «вспомогательного рабочего процесса». Это может привести к отставанию в переработке от самого ценного к наименее ценному.
S.Lott
У моего последнего работодателя была проблема с выполнением утилиты exe (мы, но не мой код вообще). Помогая «старшему» разработчику диагностировать, почему этот exe-файл не запускается, я предложил написать bat-файл, чтобы его запустить. Это сработало. Он перестал искать проблему, и вот как она вышла за дверь. Урок, который я усвоил: 1. Никогда не предлагайте плохую идею для устранения проблемы кому-то, кто принимает решения. 2. Используйте библиотеки или максимально усвойте свою собственную логику. Это «исправление» стоило множество техподдержки на некоторых машинах. Он также не верил в тестирование или контроль версий, поэтому не удивительно ...
Rig
8

Я бы сказал, оставь это в покое, если это работает.

Как программист, вы приносите пользу своей организации, решая проблемы с программным обеспечением. Решение большего количества проблем как по качеству, так и по количеству за определенный промежуток времени напрямую связано с вашей ценностью в организации. Трата этого времени на создание кода снижает вашу ценность, так как отнимает у вас решение более важной проблемы.

Однако парой факторов, которые могут снизить затраты времени, будет масштабируемость и наличие каких-либо проблем со стабильностью внешних программ.

bigtech
источник
Согласен. Вы можете столкнуться с большими трудностями, пытаясь интегрировать сторонние программы / код в свое приложение. Иногда это необходимо, но, как говорится, «если это не сломано, не
чините
5
Решение проблем - это замечательно. Решение некоторых проблем при открытии двери другим проблемам не так уж и велико.
yfeldblum
5

Это не «лучше» или «хуже». Есть просто разные затраты и выгоды.

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

  • Функция, которую вы пишете, имеет очень небольшую стоимость интеграции.
  • Сторонняя библиотека имеет немного большую стоимость интеграции.
  • Отдельная программа, которую вы должны выполнить, будет иметь еще большую стоимость интеграции.

Обратите внимание, что это затраты на интеграцию, которые вы должны сопоставить с общей стоимостью, которая включает, помимо прочего, стоимость написания и обслуживания программного обеспечения.

Может случиться так, что вы очень неопытный программист, но длительный опытный пользователь.

  • Если вы хотите «раскошелиться», ваши общие затраты могут быть низкими, несмотря на более высокие затраты на интеграцию, потому что вы можете снизить стоимость интеграции с помощью своего опыта и знаний.
  • Если бы вы сами написали эту функцию, ваша общая стоимость могла бы быть довольно высокой, несмотря на низкую стоимость интеграции из-за вашей неопытности в программировании.

Лучший способ выяснить:

Лучше ли вызвать внешнее приложение командной строки или усвоить логику этого приложения?

Стоит рассчитать затраты для себя. Стоимость будет отличаться для разных сред, ситуаций и людей. Большую часть времени вызов в командную строку будет стоить дороже, но не всегда и единственный способ убедиться, что он выполняет анализ.

dietbuddha
источник
В моем случае, это по существу внешнее приложение , которое случается быть открытым исходным кодом, написан на Java, так же , как мое приложение. К сожалению, это не просто библиотека, которую использует внешнее приложение, поскольку эта библиотека тесно связана с самим интерфейсом CLI. Кроме этого, все хорошие моменты.
cdeszaq
1

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

Тем не менее, одна вещь, чтобы рассмотреть это стабильность. Я столкнулся с чем-то похожим пару лет назад и сохранил программу Cli. Это было слишком нестабильно, и я не хотел, чтобы его сбой приводил к отключению родительского приложения, которое нужно было запускать 24/7. Теперь это не Java-приложение, но, тем не менее, если это проблема, которая может возникнуть, вы можете принять это во внимание.

GrandmasterB
источник