Pull to refresh

3 in 1: Desktop, Mobile, Web. Кроссплатформенная разработка

Reading time5 min
Views9.5K

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


Кроссплатформенная разработка

Удобно писать один код вместо трех, это значительно сокращает время создания программы. Но к сожалению каждая платформа имеет свой зависимый код(функционал). Часто без функционала предоставляемого конкретной платформой просто не обойтись. Возможным решением этой проблемы являются стратегии проектирования (подробнее можно узнать в книге Александреску «Современное проектирование на С++»). Весь зависимый код выносится в классы настройки, так называемые «policy», которыми в дальнейшем конфигурируются более крупные классы.
Использование кроссплатформенных библиотек(boost, stl и другие) также упрощает разработку.

MVC

Использование модели MVC значительно упрощает проектирование приложения, т.к. большинство платформенных зависимостей локализуются в компоненте «Представление(View)».

Htmlayout

Для организации графического интерфейса была использована библиотека Htmlayout, которая позволяет описывать графический интерфейс программы при помощи html и css. Реализация GUI при помощи веб-ориентированных средств несет в себе массу положительных моментов, начиная с большого количества веб-дизайнеров и заканчивая огромным количеством уже готовых вариантов дизайна. А имея в качестве одной из целевых платформ «веб» это уменьшает затраты на реализацию дизайна в виде html+css.
Htmlayout имеет реализацию для Windows Mobile, что позволяет использовать её также для мобильной платформы.

Программа калькулятор

Программа типа «калькулятор» выбрана потому что в полной мере позволяет попробовать реализовать модель MVC и предполагает использование некоторых компонентов библиотеки «boost», которые были мне интересны.

Desktop

Реализация приложения для десктопа(родной для меня платформы), предполагала прежде всего написание моделей данных, используемых в программе и реализацию общей архитектуры программы. Новым моментом для меня было использование библиотеки Htmlayout. Однако никаких проблем с реализацией графического интерфейса с её помощью не возникло.

Код файла main.cpp, в котором происходит конфигурирование и инстанцирование основных классов:
#include"stdafx.h"<br/>
<br/>
//Calculator includes<br/>
#include"RegexNumberCheckModel.h"<br/>
#include"CalculatorModel.hpp"<br/>
#include"DesktopView.h"<br/>
#include"CalculatorController.hpp"<br/>
<br/>
CAppModule _Module;<br/>
<br/>
int APIENTRY WinMain(    HINSTANCE hInstance<br/>
                     ,HINSTANCE hPrevInstance<br/>
                     ,LPSTR lpCmdLine<br/>
                     ,
int nShowCmd)<br/>
{<br/>
<br/>
    
//MVC concept:<br/>
    //Model<br/>
    typedef  CalculatorModel<double, Operations, RegexNumberCheckModel> MyCalculatorModel;<br/>
    MyCalculatorModel calcModel;<br/>
    
//View<br/>
    typedef  DesktopView<MyCalculatorModel> MyCalculatorView;<br/>
    MyCalculatorView calcView;<br/>
    
//Controller<br/>
    typedef  CalculatorController<MyCalculatorModel, MyCalculatorView::ViewPolicy> MyCalculatorController;<br/>
    MyCalculatorController calcController(calcModel, calcView);<br/>
<br/>
    calcView.Run(hInstance);<br/>
<br/>
    
return 0;<br/>
}


Mobile

Реализация под мобильную платформу началось с написания тестовой программы «Hello, world» описанной в статье «WTL: Программирование для мобильных и встраиваемых устройств на базе WinCE/Windows Mobile». Для реализации GUI калькулятора пришлось только привязать окно программы и окно библиотеки, плюс немного изменить шаблон css. Для адаптации модели данных пришлось сконфигурировать проверку ввода собственным классом, вместо используемого «boost/xpressive».

Код main.cpp мобильной версии:
#include"stdafx.h"<br/>
<br/>
//Calculator includes<br/>
//#include "RegexNumberCheckModel.h"<br/>
#include"NoNumberCheckModel.h"<br/>
#include"CalculatorModel.hpp"<br/>
#include"MobileView.h"<br/>
#include"CalculatorController.hpp"<br/>
<br/>
CAppModule _Module;<br/>
<br/>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)<br/>
{<br/>
<br/>
//MVC concept<br/>
    //Model<br/>
    typedef  CalculatorModel<double, Operations, NoNumberCheckModel> MyCalculatorModel;<br/>
    MyCalculatorModel calcModel;<br/>
    
//View<br/>
    typedef  MobileView<MyCalculatorModel> MyCalculatorView;<br/>
    MyCalculatorView calcView;<br/>
    
//Controller<br/>
    typedef  CalculatorController<MyCalculatorModel, MyCalculatorView::ViewPolicy> MyCalculatorController;<br/>
    MyCalculatorController calcController(calcModel, calcView);<br/>
<br/>
    calcView.Run(hInstance);<br/>
<br/>
<br/>
    
return 0;<br/>
}



Изменения минимальны: CalculatorModel конфигурируется классом NoNumberCheckModel, а DesktopView заменен на MobileView.

Web

Сразу замечу, что описанная программа «калькулятор» не является веб-приложением, это приложение с веб-интерфейсом.
С реализацией под веб было немного сложнее, слишком мало статей и примеров можно найти в интернете на эту тему. Результатом небольшого исследования стала статья «Apache, fastcgi и c++: «Hello, world», опубликованная неделю назад на хабре. После выбора основной технологии, особых проблем с реализацией интерфейса и обработкой AJAX-запросов не возникло.
Класс реализующий компонент «Представление(View)» DesktopView заменен на FastcgiView.

Заключение

Правильный подход к проектированию приложения позволяет без значительных усилий разрабатывать программы способные работать под большинством популярных платформ.
А наличие библиотек вроде htmlayout, boost и stl позволяет делать это быстро.
Думаю подобная техника разработки вполне подойдет для программ вроде torrent-клиентов или систем управления «умный дом»…
Tags:
Hubs:
Total votes 47: ↑37 and ↓10+27
Comments41

Articles