Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Это плохо или нормуль ? / 11 сообщений из 11, страница 1 из 1
18.09.2017, 12:27
    #39522674
grok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
Как-то раз у меня была нужда написать командный интерпретатор.
При том, что я совершенно не представлял себе как это делать.
Почесал репу и придумал такой вариант:

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

Вышло с одной стороны просто и быстро, с другой стороны сомнительно.

Как думаете, так норм или стоило поискать других вариантов ?
...
Рейтинг: 0 / 0
18.09.2017, 12:45
    #39522685
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
Я-бы сделал чуть иначе.

Один объект класса 1, который представляет собой командную строку и её разбор (разделение на команду и параметры). Плюс поиск обработчика.
В нем регистрируются объекты потомки абстрактного класса 2 - команды. В них есть идентификаторы команд и метод обработки параметров с возвращаемым результатом.

Когда будет нужна новая команда, то создается потомок класса 2 и регистрируется в объекте класса 1.
...
Рейтинг: 0 / 0
18.09.2017, 13:38
    #39522720
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
А я бы не парился и задействовал Bison.
...
Рейтинг: 0 / 0
18.09.2017, 17:29
    #39522875
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
grok,

Специально для этого существуют учебники. В первую очередь: " Драконья книга "
...
Рейтинг: 0 / 0
18.09.2017, 20:14
    #39522945
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
Dimitry SibiryakovА я бы не парился и задействовал Bison.
сначала flex
...
Рейтинг: 0 / 0
19.09.2017, 09:09
    #39523037
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
- читаем входную строку
- разбиваем её на две (по первому пробелу): команда и аргументы
- команду ищем в ассоциативном массиве (мапе) cmdName -> Command, где Command - интерфейс с одним методом Result run(String arguments)
- вызываем реализацию нужной команды, реализация сама парсит свои аргументы, делает полезную работу и возвращает результат для вывода на экран.
...
Рейтинг: 0 / 0
19.09.2017, 10:05
    #39523086
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
grok Вышло с одной стороны просто и быстро, с другой стороны сомнительно.

Как думаете, так норм или стоило поискать других вариантов ?
так смотря сколько команд, насколько сложных и вариативных, будет ли это все развиваться и разрастаться со временем, на каком языке, нет ли на нем уже готовых решений? Я думаю что ==поиск вариантов== - не самоцель. кусок проги может быть не идеален, но если у него вполне понятный интерфейс, такой что его можно выдернуть и заменить - это нормально. По моему.
...
Рейтинг: 0 / 0
20.09.2017, 02:52
    #39523551
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
Сделал бы почти как wadman.

Парсер командной строки, в котором регистрируются доступные команды по имени (для простого и быстрого поиска в какой-нить хэш массив загнал бы)
Сами команды представляют из себя тоже объекты с методами parse (предопределённый, но каждая команда может его переписать под свои нужды и разбирать собственные параметры как ей вздумается) и run (а этот абстрактный, разумеется, что бы каждая команда его определила под себя).

Тогда основной парсер читает только название команды и передаёт управление непосредственно нужному объекту, а тот устанавливает свои атрибуты самостоятельно и запускает run. Ещё в объект команды можно было бы запихнуть разные методы help и другую вспомогательную мелочь для удобства
...
Рейтинг: 0 / 0
20.09.2017, 10:14
    #39523622
grok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
scfреализация сама парсит свои аргументы

мне казалось, реализации вообще лучше не знать что оно в каком-то интерпретаторе используется.
single responsibility принцип.

разве только сделать трехслойную схему.

PS: а всякие лексические/синтаксические анализаторы,
это имхо "микроскопом гвозди забивать"
для задач такого уровня.
...
Рейтинг: 0 / 0
20.09.2017, 14:04
    #39523732
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
grokscfреализация сама парсит свои аргументы

мне казалось, реализации вообще лучше не знать что оно в каком-то интерпретаторе используется.
single responsibility принцип.

разве только сделать трехслойную схему.

PS: а всякие лексические/синтаксические анализаторы,
это имхо "микроскопом гвозди забивать"
для задач такого уровня.

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

Если возлагать эту работу на основной интерпретатор, то команды придётся заганять в узкие рамки протокола получения аргументов, а это минус к гибкости.
...
Рейтинг: 0 / 0
21.09.2017, 11:42
    #39524254
паттерн
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Это плохо или нормуль ?
grokКак-то раз у меня была нужда написать командный интерпретатор.
При том, что я совершенно не представлял себе как это делать.
Почесал репу и придумал такой вариант:

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

Вышло с одной стороны просто и быстро, с другой стороны сомнительно.

Как думаете, так норм или стоило поискать других вариантов ?
Всё запихнуть в один класс - классический антипаттерн.

В общем случае это очень распространенная задачка программирования. Любая серверная часть двухзвенки.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Это плохо или нормуль ? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]