2010-08-23 3 views
2

Я собираюсь написать программу на C++, но я не уверен, как это сделать. Я хочу создать программу, которая может использоваться с интерфейсом командной строки, но также с интерфейсом графического интерфейса, поскольку я не хочу привязывать пользователя к определенному интерфейсу, например, к набору виджетов для зависимостей.Проектирование системы интерфейса/бэкэнд в C++?

Как был бы лучший способ сделать это? Я знаю, что некоторые программы, такие как RSync и SSH, имеют интерфейсы в графических интерфейсах, но я не уверен, как это делается. Разве это было бы неловко иметь программу, которая просто использует system() для запуска всего этого, имея довольно графический интерфейс?

ответ

6

Вы реализуете алгоритмы вашей программы в библиотеке, тщательно избегая любой материал UI. API для ваших алгоритмов указан в заголовочные файлы.

Затем вы можете написать несколько приложений, которые используют эту библиотеку, одну реализацию интерфейса GUI и интерфейс командной строки. Они включают заголовки и компилируются против API, и вы связываете библиотеку с ней.
Будьте осторожны, чтобы не компилировать библиотеку и графический интерфейс с непоследовательными настройками.

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

6

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

Более сложные ответы включают в себя установку вашего бэкэнда в качестве демона/сервера.

Вам не нужны системные вызовы для выполнения любого из этих действий (если у вас нет особых требований).

1

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

+1

Не MVC _views_ для просмотра данных _model_? – sbi

+0

@sbi, вы правы, мой ответ был недостаточно точным, я отредактирую свой ответ. – David

0

Вы можете использовать QT для интерфейса GUI. Но я бы на самом деле просто написал вашу библиотеку в первую очередь. Затем сделайте свой графический интерфейс последним.

Некоторые полезные советы

  1. Обязательно писать тесты во время написания кода.

  2. Обязательно используйте инструмент покрытия кода, чтобы оценить модульные тесты при написании кода.

  3. Обязательно избегайте типов BOOL, поскольку они обычно определяются в API платформы (например, win32). Вместо этого используйте bool.

  4. Вперед объявить как можно больше типов в ваших заголовочных файлах. Включите как можно меньше файлов заголовков в каждый заголовочный файл библиотеки.

  5. Экспозиция как минимальный интерфейс.

  6. Обязательно соблюдайте правильные методы кодирования для C++. Herb Sutters Book C++ coding standards is excellent in this regard.

  7. Как только вы напишите свой gui, поместите как можно меньше бизнес-логики в обработчики событий GUI. В основном вы хотите, чтобы ваша библиотека была агностикой в ​​отношении вашего графического интерфейса. Кто-то еще упомянул здесь шаблон MVC. Это отличный совет.

Смежные вопросы