2011-12-28 4 views
17

Предположим, что приложение Java, принимающее целочисленный аргумент командной строки, говорит bubu.Java: использование системных параметров vs «regular» параметров командной строки

Предполагая, что один использует приличную командную строку анализатор (и я - http://pholser.github.com/jopt-simple/) плюс имея в виде переключателя -D Java, это некоторые из типичных способов передать этот параметр командной строки:

  1. --bubu 5 (или --bubu=5 или --bubu5)
  2. -Dbubu=5

Если первый из них является программа аргумент и должны быть обработаны приложением, используя некоторые из командной строки парсер, белый второй - аргумент VM и уже проанализирован java, что делает его доступным как Integer.getInteger("bubu")

Я немного озадачен. Что я должен использовать? Используя системное свойство объекта:

  • кажется, не стоит никакого отношения
  • не зависит от какой-либо из командной строки библиотеки парсера
  • обеспечивает удобный (хотя и неожиданным) API для получения значений

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

Пожалуйста, совет.

Спасибо.

EDIT

Другими плюсов для системных параметров - «они годные к употреблению, даже если приложение не является автономным приложением, начиная с основным, но и тогда, когда приложением является веб-приложение или устройство контрольная работа." - благодаря https://stackoverflow.com/users/571407/jb-nizet

edit2

Позвольте мне быть более сосредоточенным здесь. Есть ли серьезная причина (помимо эстетики) не использовать параметры системы, как всегда?

EDIT3

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

Поэтому я должен быть осмотрительным и неоднозначно использовать свои системные свойства заранее. Итак, не более bubu, это com.shunra.myapp.bubu сейчас. Это означает, что вместо того, чтобы просто

-Dbubu=5 

У меня есть

-Dcom.shunra.myapp.bubu=5 

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

Другая причина дается Mark Peters, что очень хорошо для меня.

+2

Ну, вы подвели итоги. Еще одно преимущество системных свойств заключается в том, что они пригодны для использования даже тогда, когда приложение не является автономным приложением, начиная с основного, но также, когда приложение является webapp или модульным тестом. Если приложение является утилитой командной строки, вы можете согласиться с соглашениями и предоставлять регулярные параметры (например, -help и т. Д.). В противном случае системные свойства более подробные, но более простые. –

+0

Итак, ваш совет всегда использует флаг -D? – mark

+2

Нет. Я отредактировал свой комментарий. Если это инструмент командной строки, где пользователь должен передавать параметры каждый раз, когда он вызывает программу, использование стандартных параметров более удобно. Если параметры - это только параметры конфигурации, которые необходимо установить один раз в пакетном файле, то свойства системы проще. –

ответ

10

Я бы утвердил, что преимущество Fortyrunner цитирует на самом деле самое значительное негативное для системных свойств - они доступны для всех, кто просит их.

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

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

Это говорит о том, что если вы просто пытаетесь сделать быструю и грязную программу CLI, а разделение проблем и связи не представляет для вас большой заботы, системные свойства дают вам простой способ, который, однако, ведет к (IMO) плохой пользовательский опыт. Некоторая библиотека getopt даст вам больше поддержки для создания хорошего пользовательского интерфейса CLI.

+1

Итак, вы говорите, что использование -D загромождает пространство системных свойств, разделяемое всеми веб-приложениями, размещенными в одном контейнере. Следовательно, это представляет потенциальную проблему столкновения имен, поэтому я должен был использовать что-то вроде 'com.shunra.myapp.bubu' вместо' bubu', так это? – mark

+0

Согласовано, все глобальные переменные должны рассматриваться с осторожностью. – Fortyrunner

+1

@mark: Это не просто пространство имен, но и сохранение вашего кода изолированным и развязанным. Вы должны попытаться инвертировать свои зависимости; низкоуровневый код должен быть * указан *, что его параметры, он не должен иметь * запрос * для своих параметров.Но с глобальной информацией для этого низкоуровневого кода легко просто запросить его параметры (через 'System.getProperty()'), который связывает его с его контекстом вызова (командной строки). Таким образом, становится сложнее провести единичный тест или повторно использовать его в другом контексте. Но проблема с именами является еще одной проблемой. –

2

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

Аргументы командной строки доступны только в основном методе (если вы не сохраняете их).

-1

Я чувствую, что есть много вещей, которые средний пользователь, как я, не должен знать. Свойства системы помогут разработчику системы предустановить ряд значений, которые позволят запустить систему. Например, когда я загружаю сервер приложений GlassFish, он всегда имеет множество предустановленных параметров, для которых у меня нет идей, для чего они нужны. Я не очень разбираюсь в настройке сервера. Если вы попросите меня запустить сервер GlassFish с 20 параметрами в командной строке, мне нужно будет узнать, для чего эти параметры и сколько я должен установить, и т. Д. Это слишком хлопотно.

Вкратце, когда система становится все больше и больше, она может иметь все больше и больше свойств. При заданных настройках системы пользователям может понадобиться только знать, что они есть, когда им действительно нужно. Например, мне нужно только знать о GlassFish's -XX:PermSize, когда мне нужно увеличить память.

+0

Ничто не говорит о том, что параметры командной строки не могут быть необязательными. Фактически, PermSize не является даже системным свойством; это параметр командной строки. –

+0

Конечно, многие опции могут быть необязательными. Но есть также много обязательных опций, которые пользователям, возможно, не нужно знать. Я не очень разбираюсь в этих вещах. Следовательно, мой пример PermSize не является хорошим. Однако я считаю, что вы можете думать о многих системных свойствах GlassFish, которые являются обязательными. –

Смежные вопросы