Архитектурные соображения при проектировании консольных приложений? - PullRequest
8 голосов
/ 03 мая 2009

Я недавно запрограммировал консольное приложение, и мне было очень тяжело проектировать его во многих аспектах, особенно в C #, учитывая его чистую OO-парадигму. Вопросы, с которыми я сталкивался, включают в себя что-нибудь от того, как передать опции до того, как вернуть проблемы классу точки входа, среди многих, многих других.

Мой вопрос: знает ли кто-нибудь из вас о хороших разработках консольных приложений в парадигме ОО, чтобы я мог учиться у них? Код хороших реализаций особенно добро пожаловать.

РЕДАКТИРОВАТЬ: Я не после API командной строки, но после хороших принципов проектирования, и, в частности, хороших реализаций, из которых я мог учиться.

РЕДАКТИРОВАТЬ 2: Существует простое взаимодействие с пользователем в приложении, но это не полноценная сортировка CLI / REPL. Думайте об этом как о команде TeX, более или менее. Интересно, что хотя существует хорошая теория (не отличающаяся от X, используйте шаблон Y, вы должны знать принципы ОО ... [ваш преподаватель информатики был бы очень горд!]), Нет никакого реального кода, который я мог бы взять посмотрите, чтобы увидеть эти концепции в действии. Опять же, где мне искать (код!) Хорошее приложение командной строки в чистой ОО-парадигме?

Ответы [ 5 ]

7 голосов
/ 03 мая 2009

Звучит так, как будто вы создаете интерфейс, который выполняет одну из нескольких отдельных операций с каждым вызовом. Я не уверен, имеете ли вы в виду приложение «командной строки» (которое выполняет одно действие, затем завершает работу) или приложение CLI (которое отображает приглашение и многократно отвечает на ввод пользователя). В общем случае первое будет гораздо проще построить, чем второе; Я думаю, что имеет смысл использовать CLI только в том случае, если вашему приложению требуется постоянное состояние, которое развивается через несколько команд. Если вы занимаетесь чем-то вроде этого, то alphazero верен - вам, вероятно, следует узнать о REPL и скопировать хороший.

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

Разумно представлять приложение как набор отдельных объектов «Command», по одному для каждого типа операции. Таким образом, точка входа в приложение должна быть своего рода объектом CommandLineDispatcher, который отправляет запросы в соответствующий объект Command.

Чтобы быть модульным, диспетчер должен быть настроен с абстрактным отображением (например, Hashtable), чтобы связать каждый токен команды (обычно первое слово строки командной строки) с объектом Command, который его обрабатывает. Диспетчер также может обрабатывать типичные парсинги, возможно, используя некоторую готовую библиотеку «getopts» для выполнения тяжелой работы.

Для простоты каждый объект Command может реализовывать согласованный интерфейс для выполнения своей работы; может быть что-то вроде этого:

public void execute(List<String> args)

Таким образом, диспетчер точки входа просто находит запрашиваемую Команду и executes ее.

Относительно обработки ошибок: метод execute() может просто генерировать исключение для сообщения об ошибках ... Исключение может быть перехвачено и обработано диспетчером или просто зарегистрировано на экране. В качестве альтернативы, сбой Команды может вызвать некоторую общую функцию usage для объединения сообщения об ошибке с общими инструкциями. Я не думаю, что «точка входа» обязательно должна быть осведомлена о проблемах, как вы предлагаете; если вам нужна надежная обработка ошибок (например, для ведения журнала или оповещения), похоже, что он принадлежит отдельному компоненту, который может быть предоставлен объекту Command.

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

4 голосов
/ 03 мая 2009

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

Сказав, что вы можете подробно описать наш вопрос о том, где они находятся в ключевых областях?

Вы можете использовать множество шаблонов из Руководства по архитектуре приложений от Microsoft.

1 голос
/ 03 мая 2009

В самом (крайнем) общем смысле консольное приложение представляет собой тип REPL:

http://en.wikipedia.org/wiki/REPL

Очевидно, что доменное (консольное) приложение не поддерживает полный язык тьюринга, но многие проблемы перекрываются, и хороший REPL должен быть очень надежным приложением командной строки. Я уверен, что вы можете многому научиться, изучая дизайн и реализацию типичного REPL. (Большинство REPL имеют открытый исходный код. (Попробуйте ruby ​​или python для OO REPL))

1 голос
/ 03 мая 2009

В Java я часто использую Apache CLI , я погуглил "CLI for .NET", но пока еще не реализовал. Может быть, вам полезно прочитать подход Java для получения параметров консоли.

Для архитектуры вашего приложения она не должна сильно отличаться от архитектуры, которую вы используете в веб-приложении, разница в том, что консоль - это интерфейс уровня презентации. Может быть, вы можете определить некоторые 'ConsoleControllers' для получения модели с бизнес-уровня на консоль и наоборот. Думайте о каждом вводе пользователя как о запросе;).

0 голосов
/ 04 мая 2009

Чтобы программа имела хороший архитектурный дизайн, особенно на C #, вы должны быть знакомы с концепциями проектирования ОО, чтобы полностью использовать преимущества парадигм ОО

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