Реагируйте на консольные вводы (команды) - как обрабатывать несколько вариантов наиболее эффективно? - PullRequest
0 голосов
/ 04 марта 2019

Некоторая информация (не хочу путать вас с большим количеством дерьмового кода):

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

Консольная программа имеет много команды пользователь может вводить и для каждой команды вызываются различные методы / создаются / обрабатываются объекты и т. Д.

Мои ключевые слова , которые сохраняются в командах ArrayList<String> и my , имеют такой тип: [keyword] [...n more Strings]

ПРОБЛЕМА ПРОЕКТИРОВАНИЯ 1:

У меня есть метод cmdProcessor(String[] arguments), который обрабатывает ввод (команду) пользователя, и [keyword] всегда является первым аргументом arguments[0].Это означает, что у меня есть большое количество операторов if этого типа: if(arguments[0].equalsIgnoreCase("keyword") callMethod(argmts);, где в String[] argmts оставшиеся аргументы [1] ... [n] .

  • Это хороший способ справиться с этим или я должен пойти с коммутатором?
  • Или что-то еще (что?)?Лучше ли сохранять ключевые слова в HashMap<String, Method>?

ПРОБЛЕМА ПРОЕКТИРОВАНИЯ 2:

Методы (см. Выше callMethod(argmts)), которые запускаются введенным ключевое слово выглядит еще более хаотично.Поскольку один и тот же метод может иметь разные числа и формы аргументов, сохраненные в String[] argmts, метод полон if(argmts.length == ...) для проверки длины, и каждый из этих if-блоков имеет множество опций переключения, которые также имеют многоесли и так далее. последний и регистр по умолчанию в коммутаторе , который я всегда использую для обработки ошибок (выдает коды ошибок и объясняет, почему шаблон не совпадает и т. Д.).

  • Это хорошо или есть лучшие способы?
  • Я думал об использовании большого количества подметодов, которые также взорвали бы мою программу и стоили бы много времени, но, возможно, улучшат читабельность /Обзор.Это нормально, или каков наилучший вариант в таких случаях (много ifs и switch-case)?

Поскольку я хочу все больше и больше строить вокруг этой программы, возможно, мне следует начать сейчас, чтобы исправить плохой дизайн, пока не стало слишком поздно.:)

1 Ответ

0 голосов
/ 04 марта 2019

О проектной задаче 1:

Я бы хотел зарегистрировать множество обработчиков, которые можно основывать на общем интерфейсе, а затем реализовать конкретное поведение по отдельности.Это хорошо, потому что центральный метод обработки вашего ввода невелик, и вам нужно всего лишь зарегистрировать много синглетов один раз, при инициализации.Недостаток: если вы забудете один, он не будет работать.Так что, может быть, вы можете зарегистрировать их автоматически (отражение или что-то подобное).

Помимо этого, карта в этом случае лучше, чем List, потому что (я полагаю) вам не нужна сортировка.Вам нужно сопоставить ключ с поведением, чтобы карта выглядела лучше (хотя даже очень большой набор ключевых слов, вероятно, не будет очень неэффективным, если вы придерживаетесь списка).

О проблеме проектирования2:

Если бы я был тобой, я бы использовал реальные шаблоны регулярных выражений.Взгляните на класс java.util.regex.Pattern.Вы можете изолировать группы и проверить полученные значения.Хотя он не избавляет вас от обработки исключений / ошибок, он очень помогает в сегментации и интерпретации.

...