Как бы вы создали консольное приложение из существующего объектно-ориентированного API? - PullRequest
3 голосов
/ 02 июня 2009

у меня есть:

  • существующий объектно-ориентированный API с собственным кодом (не GUI)
  • Приложение с графическим интерфейсом, которое работает с этим API

Цель: Чтобы создать дополнительное консольное приложение, которое позволяет пользователю выполнять некоторые наборы рабочих процессов (аналогично тем, которые описаны в приведенном выше приложении с графическим интерфейсом), вводя команды. Это приложение должно быть «с состоянием» - доступные команды и их результаты будут зависеть от ранее введенных команд.

Проблема: Я не хочу «изобретать велосипед». Существуют ли шаблоны для создания приложения и определения словарного запаса? В настоящее время, мне кажется, лучшим вариантом было бы написать набор помощников и анализатор команд "с нуля".

P.S. Если бы мой API был в .Net, я бы посмотрел в сторону PowerShell, но API велик, и его внедрение в .Net занимает очень много времени.

Ответы [ 6 ]

3 голосов
/ 02 июня 2009

Шаблон использования, который вы описываете, звучит как цикл Read-Eval-Print (REPL), общий способ взаимодействия для интерпретируемых языков.

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

1 голос
/ 03 июня 2009

Оберните ваш API с помощью автоматических инструментов, таких как SIP или SWIG , импортируйте их как модуль python в сеанс ipython , делайте вещи с объектами из командная строка. Работа выполнена.

Если это не удастся, это будет потому, что либо:

  • Ваши объекты / API не подходят для автоматического переноса (но процесс приведения их в оборачиваемое состояние обычно означает их улучшение).
  • Python не совсем то, что вы имели в виду для командной строки (даже с улучшениями ipython).
1 голос
/ 02 июня 2009

Чтобы начать работу в командной строке, сначала не изобретайте колесо. Существует много вариантов разбора команд.

В Java есть Commons CLI , который предоставляет вам все, что вам нужно. Также имеется .NET CLI порт .

InfiniteRed имеет хорошее описание того, как это сделать в Ruby.

Что касается реализации, у вас есть правильная идея. Но и здесь не изобретай велосипед. Инкапсулируйте работу в Command объектах и ​​посмотрите на использование шаблона Цепочки ответственности; Сеть общин хорошо работает. Существует также .NET Цепной порт .

Если использование этих платформ не вариант, посмотрите, как они реализованы. Также, если у вас есть проблемы с взаимодействием с некоторыми из этих опций, Ruby действительно хороший швейцарский армейский нож для подобных вещей. Он относительно переносим, ​​и код может оказаться действительно чистым и простым в обслуживании.

ОБНОВЛЕНИЕ: JCommander также выглядит интересно.

1 голос
/ 02 июня 2009

Если вы в конечном итоге используете .net, возможно, вы могли бы взглянуть на библиотеку Mono.Options: http://tirania.org/blog/archive/2008/Oct-14.html

"Mono.Options - прекрасная команда библиотека разбора строк. Это небольшое, краткий, радость в использовании, легко и мощный, все в одном. "

1 голос
/ 02 июня 2009

Есть ли у вас COM-интерфейсы? PowerShell может легко создавать сценарии COM, WMI или .NET; Вы даже можете выполнять вызовы p / invittime во время выполнения с помощью чистого скрипта; намного меньше времени, затрачиваемого на создание прототипа. Как только вы укрепите дизайн, вы можете дополнительно обернуть его как родные командлеты позже для скорости.

-Oisin

0 голосов
/ 02 июня 2009

Я полностью согласен с ответом xOn, но для поддержания состояния между вызовами просто сделайте его объектом com одного экземпляра, затем напишите функцию «login» для вызова AddRef и функцию «logoff» для вызова Release. Таким образом, объект будет зависать между вызовами. Единственный риск - многократные запуски на одном и том же ящике с несколькими входами в систему ... поэтому вам захочется это поймать.

В зависимости от требуемого состояния, если его не так много, и его можно легко передавать в файл или базу данных на диске, тогда объект com с несколькими экземплярами будет вести себя лучше и не потребует вызовов addref или release. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...