Звучит так, как будто вы создаете интерфейс, который выполняет одну из нескольких отдельных операций с каждым вызовом. Я не уверен, имеете ли вы в виду приложение «командной строки» (которое выполняет одно действие, затем завершает работу) или приложение CLI (которое отображает приглашение и многократно отвечает на ввод пользователя). В общем случае первое будет гораздо проще построить, чем второе; Я думаю, что имеет смысл использовать CLI только в том случае, если вашему приложению требуется постоянное состояние, которое развивается через несколько команд. Если вы занимаетесь чем-то вроде этого, то alphazero верен - вам, вероятно, следует узнать о REPL и скопировать хороший.
В любом случае выполненная операция будет зависеть от аргументов, переданных в командной строке, поэтому я расскажу об этой части мозгового штурма ...
Разумно представлять приложение как набор отдельных объектов «Command», по одному для каждого типа операции. Таким образом, точка входа в приложение должна быть своего рода объектом CommandLineDispatcher, который отправляет запросы в соответствующий объект Command.
Чтобы быть модульным, диспетчер должен быть настроен с абстрактным отображением (например, Hashtable), чтобы связать каждый токен команды (обычно первое слово строки командной строки) с объектом Command, который его обрабатывает. Диспетчер также может обрабатывать типичные парсинги, возможно, используя некоторую готовую библиотеку «getopts» для выполнения тяжелой работы.
Для простоты каждый объект Command может реализовывать согласованный интерфейс для выполнения своей работы; может быть что-то вроде этого:
public void execute(List<String> args)
Таким образом, диспетчер точки входа просто находит запрашиваемую Команду и executes
ее.
Относительно обработки ошибок: метод execute()
может просто генерировать исключение для сообщения об ошибках ... Исключение может быть перехвачено и обработано диспетчером или просто зарегистрировано на экране. В качестве альтернативы, сбой Команды может вызвать некоторую общую функцию usage
для объединения сообщения об ошибке с общими инструкциями. Я не думаю, что «точка входа» обязательно должна быть осведомлена о проблемах, как вы предлагаете; если вам нужна надежная обработка ошибок (например, для ведения журнала или оповещения), похоже, что он принадлежит отдельному компоненту, который может быть предоставлен объекту Command.
В общем, приложение командной строки ничем не отличается от любого другого приложения, которое реагирует на ввод пользователя - вам понадобится диспетчер для анализа и маршрутизации ввода, а также обработчики (или «контроллеры») для выполнения поддерживаемых операции. Если вам нужны другие службы (ведение журналов, оповещение, подключение к базе данных и т. Д.), Вам следует создать отдельные компоненты, чтобы изолировать эту логику и предоставить ее с чистыми интерфейсами.