В статье выполнен высокоуровневый сравнительный анализ существующих на рынке объектно-ориентированных библиотек для Palm OS. Результаты оценки должны позволить профессионалу и начинающему С++ разработчику определить свою стратегию в использовании существующего библиотечного инструментария. С прикладной точки зрения, основная проблема объектно-ориентированного подхода к разработке приложений состоит в отсутствии очевидных и легко доступных способов предоставления преимуществ данной технологии широкому кругу неискушённых в тонкостях С++ программирования разработчиков. Использование стандартных библиотек классов может послужить одним из способов решения указанной проблемы. Попытаемся ответить на вопросы - какими свойствами должны обладать библиотеки и как они должны предоставляться разработчику? Зачастую, за понятиями "простоты" и "качества" кроются совершенно неисследованные глубины. Существует масса теоретических монографий и практических руководств в области разработки С++ приложений, но отыскать теоретический материал, посвящённый проектированию и разработке "стандартных" объектно-ориентированных библиотек классов, исключительно непросто. Проблема кроется в отсутствии строгой методологической основы, которая должна определять место и свойства библиотеки классов в цикле разработки программного обеспечения (ПО) вообще и под Palm в частности. Ключ к решению упомянутой задачи лежит в области обоснования архитектуры библиотеки для тех или иных прикладных задач (т.е. областей использования). На практике, программы часто разбивают на отдельные, по возможности малосвязанные, слои:
Такой подход позволяет разработчику создавать прикладную программу с четко выраженной архитектурой, которой свойственны независимость частей и хорошо специфицированные интерфейсы между ними. В долговременной перспективе "стоимость сопровождения" разработчиком ПО с такой архитектурой оказывается существенно ниже, чем при сквозном программировании приложения. Однако, данный подход, требует значительных стартовых усилий от разработчика, что не всегда оправдано в рамках конкретного проекта. Разрешение этого противоречия связано с использованием профессиональных стандартных библиотек классов. Сразу отметим, что не следует ориентироваться на использование универсальной библиотеки классов. С позиций разработчика ПО объектная модель такой библиотеки может оказаться достаточно сложной или негибкой. На практике, разработчик будет вынужден полностью адаптировать свой код под объектную модель библиотеки и безусловно станет "заложником" чужих архитектурных решений. Таким образом, средства разработки часто приходят в противоречие с реальными требованиями конкретной задачи. Разработка же "удачной" и "открытой" объектной модели, нетривиальная профессиональная задача. Например, библиотеки фирмы Microsoft: MFC, ATL, WTL могут служить примерами различных объектных моделей библиотек, которые, в принципе, предназначены для решения одних и тех же типовых задач, но различными и не всегда совместимыми способами, что требует от разработчика дополнительных трудозатрат при их совместном использовании. Введём понятия и критерии оценки значимые для целей высокоуровневого анализа. Предметная область - это перечень понятий и их взаимные зависимости. Разработчик манипулирует ими при создании ПО. Другими словами, предметная область отражает ваше понимание бизнеса, для которого вы создаёте своё приложение или ваше понимание операционной системы, если вы ставите задачу разработки стандартной библиотеки классов. Абстрактный тип данных (АТД) - это любая структура данных и набор методов, занимающихся их обработкой. Эта абстракция означает, что мы можем каждому понятию предметной области поставить в соответствие свою структуру данных и свой набор методов. Другими словами, в модели предметной области каждому понятию (типу элемента) можно поставить в соответствие абстрактный тип данных. Базовая (низкоуровневая) модель предметной области - это представление предметной области в виде элементарных АТД (первокирпичиков), на основе которых строятся более сложные АТД и их зависимости. Эта абстракция может использоваться для представления элементарных типов данных и операций над ними в границах данной аппаратной и программной платформ. Пакетная (высокоуровневая) модель предметной области - в нашем случае, это представление предметной области в виде составных объектов, которым могут быть поставлены в соответствие физические модули программного кода или функции прикладного программного интерфейса (API), входящего в состав OS. Эту абстракцию будем использовать для определения действий, выполняемых системой в целом. В UML (Унифицированный Язык Моделирования) такой механизм группировки носит название пакетов (package) и послужит нам для цели построения архитектур OS и библиотек. Например, форма отвечает за размещение элементов управления (controls) и за обработку событий. Понятие "форма" является составным объектом, поскольку в форме могут находиться элементы управления, которые можно отнести к неделимым объектам. Один из старейших вопросов методологии создания ПО: как разбить большую систему на небольшие подсистемы? Очевидно, что каждая библиотека должна базироваться на предметной области решаемой задачи. В идеальном случае предметная область стандартной библиотеки классов должна полностью покрывать и даже расширять пакетную и базовую модели операционной системы. Это означает, что её объектная модель должна соответствовать пакетной и базовой моделям конкретной операционной системы. Как правило, объектная модель библиотеки формирует свою собственную подобласть, в чём-то сужая, а в чём-то расширяя базис. На практике библиотека обеспечивает решение каких-то ограниченных типовых задач и поэтому её предметная область уже, чем предметная область операционной системы. В свою очередь для прикладного программиста важна связь между предметной областью библиотеки и понятиями решаемой задачи. Отсутствие такой связи означает, что разработчик будет использовать классы библиотеки только в ограниченном объёме. Другими словами, объектная модель библиотеки должна являться также пространством, которое эквивалентно или включает в себя предметную область конкретной решаемой задачи. Только в этом случае работа программиста будет лёгкой и эффективной, лишённой существенных архитектурных переделок кода приложения при изменении требований к нему. Объектную модель библиотеки также можно условно разделить на высокоуровневую и низкоуровневую. Высокоуровневая объектная модель состоит из составных объектов, которые содержат совокупность элементарных АТД. Низкоуровневую объектную модель библиотеки должны составлять элементарные (неделимые) АТД. Такое условное деление позволяет лучше оценить архитектуру библиотеки, так как к высокоуровневым и низкоуровневым моделям должны быть применены различные критерии оценки их полноты и практической ценности. В качестве критериев оценки библиотек будем использовать следующие объективные характеристики значимые с точки зрения разработчика приложений:
Резюмируя вышеуказанный перечень критериев можем сказать, что сравнительный анализ библиотек можно свести к оценке архитектур представленных на рынке библиотечных продуктов. С практической точки зрения, мы считаем такую оценку наиболее комплексной и значимой. Основу оценки составляют критерии качества трёх категорий АТД, которые должны поддерживаться библиотекой:
Все инструментальные средства на рынке Palm OS можно поделить на две основных группы:
Компактность, эффективный доступ к системным функциям, высочайшая степень гибкости и скорость выполнения являются преимуществами первой группы. Однако данные продукты предполагают высокий уровень владения C/C++, знание функций API и множества нюансов, связанных с данной технологией. Простота и высокая скорость разработки являются преимуществами второй группы. Такой инструментарий может быть легко интегрирован с соответствующим компонентом ConduitÒ , который используется для синхронизации данных между PalmR устройством и персональным компьютером. Однако, эти инструменты не могут обеспечить достаточную гибкость при написании сложных приложений. Более того, PalmR устройства не могут обеспечить необходимую скорость выполнения программ разработанных таким способом. Большинство серьезных программных продуктов разрабатываются при помощи первой группы. Это мощные компиляторы языков программирования C и C++, которые формируют эффективный код программы. На сегодняшний день, под Palm OS доступны следующие компиляторы:
Указанные C++ компиляторы позволяют использовать все преимущества объектно-ориентированной технологии для быстрого создания качественных программ, но не включают в себя стандартной объектно-ориентированной библиотеки для разработки приложений под Palm OS. По причине отсутствия библиотеки код становится более объёмным, требует больше времени на разработку и отладку, теряет гибкость и способность к масштабируемости. Поэтому большинство программ пишется по старинке, с использованием C и ограниченного набора API. Однако, такой подход также не оправдан по следующим причинам: Причина 1 - oтсутствие повторно используемого кода Программисту ежедневно приходится решать множество стандартных задач, которые могут и должны быть решены один раз в какой-нибудь библиотеке. Насколько это серьезно? По нашим оценкам, типичное приложения под Palm OS, которое просто отображает форму на экране и производит минимальную обработку событий, занимает около 160 строк кода. Неужели стартовая программы должна быть столь велика и так сложна? Программа типа "Hello World" не должна занимать больше 10 строк кода! Причина 2 - oграниченные возможности Palm OS API Palm OS имеет очень ограниченный набор функций. Например, менеджер строк позволяет производить только несколько базовых операций над строками. Это значит, что программист должен решать много низкоуровневых и второстепенных задач, отклоняясь от цели проекта. Причина 3 - квалификация программистов Большинство стандартных задач решаются не самым лучшим образом, в зависимости от уровня квалификации конкретного программиста. Очевидно, что в случае использования профессиональной C++ библиотеки, можно получить более высокую скорость и качество написания программ за счёт использования апробированных типовых решений стандартных задач (образцов решений). С целью выявления стандартных задач рассмотрим предметную область, с которой имеет дело каждый разработчик программ для Palm.
Решение любой задачи в области разработки программного обеспечения начинается с постановки задачи, которая включает разработку модели предметной области. Абстрагируясь от деталей, можно сказать, что любое Palm OS-приложение может состоять из следующих слоёв, входящих в состав предметной области:
Каждый из слоёв может быть представлен базовой и пакетной моделями. С целью иллюстрации выполним простейшую объектную декомпозицию слоя GUI в Palm OS. GUI базируется на двух ключевых понятиях (см.Рис.1):
Рис.1: UML модель фрагмента предметной области Формам в Palm OS соответствует своя структура данных и своё API, которое работает с этой структурой. В формы помещаются элементы управления, посредством которых пользователь взаимодействует с приложением. Элементы пользовательского интерфейса могут быть следующих типов:
Каждый из указанных типов можно рассматривать как специфический АТД. Например, Gadget позволяет программисту расширять набор стандартных элементов Palm OS путём создания своих собственных элементов управления. В свою очередь, Controls бывают следующих типов:
Подобная детализация может быть продолжена для других типов элементов. Главный же вывод состоит в том, что ATД форм являются составными и включают базовые АТД различных типов. Любая претендующая на удобство использования библиотека должна покрывать приведенную выше предметную область своей собственной. Эта область должна предоставлять в распоряжение программиста как минимум набор классов эмулирующих поведение формы и стандартных элементов управления. Поскольку слой GUI основан на событийном программировании, класс формы в библиотеке должен также предоставлять средства обработки и маршрутизации событий. Это означает, что объектная модель библиотеки должна содержать развитые механизмы наследования и использования, фильтрации и обработки различных событий связанных с GUI. Всё множество функций API в Palm OS закреплены за соответствующими менеджерами, в зависимости от того, какие задачи эти функции решают. Например, есть API менеджера форм, есть API менеджера баз данных, есть API у Exchange manager и т.д. Пакетная структура Palm OS API представлена на Рис.2 и также является структурным элементом рассматриваемой предметной области. Рис.2 : UML диаграмма пакетов (менеджеров Palm OS) Даже предварительное рассмотрение модели предметной области, с которой имеет дело программист позволяет сформулировать ключевую проблему: не вооружённый высокоуровневым интерфейсом в лице стандартной С++ библиотеки, разработчик обречён на поиск непротиворечивых решений во всём многообразии существующих менеджеров Palm API и возможных АТД. С другой стороны наличие такой библиотеки, содержащей объектную модель максимально соответствующую модели предметной области в целом (а значит, содержащей образцы решений типовых задач), должно максимально упростить задачу программиста по разработке конкретных приложений.
Итак, использование С++ библиотеки содержащей классы, реализующие типовые решения стандартных задач является объективной необходимостью. Такие библиотеки появились на рынке программного обеспечения, что, несомненно, предоставляет возможность выбора (см. Табл. 1: Сводная таблица оценок ):
Библиотека Teenee 1.2.0. самая первая C++ библиотека под Palm OS. Эта библиотека не дублирует своими объектами API операционной системы, она основана на таких объектах как форма, приложение, модальный диалог. Фактически библиотека базируется на двух основных классах:
Класс приложения, занимается маршрутизацией поступающих событий в класс формы. Программист наследует свой класс формы от представленного в библиотеке базового класса GeneralForm и включает в него один или несколько дочерних классов по обработке событий. Эти классы могут образовывать цепочки, передавая события от одного класса к другому. Это интересная и гибкая архитектура, но она не направлена на решение типовых задач, скорее она использовалась как среда поддержки конкретного прикладного проекта. Проблема запуска приложения, когда область глобальных переменных (и в том числе vtables) недоступна, решается путём включения в код программы собственной реализации метода SysAppLaunchCmdFind, который объявлен, но не реализован в классе библиотеки AbstractApplication. Такое решение нельзя назвать удачным, потому что оно противоречит принципам полиморфизма и сокрытия данных. При обработке исключительных ситуаций (exceptions) Teenee базируется на стандартных классах STL, таких, как exception, bad_alloc. Низкоуровневая объектная модель библиотеки не полна: в распоряжении разработчика нет ни классов строк, ни классов коллекций, ни классов для работы с элементами управления Palm OS. Не полна и высокоуровневая модель библиотеки: отсутствуют классы для работы с базами данных Palm, классы для работы с сетью. Вывод: объектная модель Teenee слабо отражает модель предметной области, неполна, архитектура не ориентирована на типовые задачи и несёт в себе черты реального проекта(ов) ранее реализованного(х) посредством этой библиотеки. В связи с этим пользоваться библиотекой непросто.
Bear River's Palm Application Framework, или PAF, обеспечивает разработчиков широким набором С++ классов, которые включают общие элементы необходимые для создания различных приложений. PAF обеспечивает поддержку библиотек Palm OS, которые обеспечивают интерфейсы с системными сервисами Palm OS и наборами системных утилит. Сервисы и утилиты предоставляют разработчику решения типовых задач и их использование разработчиком приводит к уменьшению риска появления ошибок программирования и трудоёмкости разработки. PAF проектировался для решения разнородных задач. Во-первых, чтобы обеспечить удобную для программиста объектную структуру разработки приложений. Во-вторых, чтобы уменьшить нагрузку на Palm OS, разработчики библиотеки позаботились об опциональности её функций. В-третьих, PAF предоставляет прикладному программисту широкие возможности для расширения своего кода. PAF включает в себя:
Классы поддержки форм, таблиц и gadgets делятся на две группы - на классы, непосредственно представляющие сам объект и на классы-менеджеры. Например, класс PForm представляет собой объект формы, а класс PFormManager является менеджером форм. Классы менеджеры хранят в себе коллекции классов-объектов. Такое поведение позволяет классам-менеджерам автоматически вызывать обработчики соответствующих классов-объектов. PAF содержит классы реализующие обмен данными с внешними источниками и классы, которые можно отнести к слою обработки данных. Проблема запуска приложения, когда область глобальных переменных (и в том числе vtables) недоступна, решается путём включения в код программы собственной реализации глобальной функции Find. Такое решение также нельзя назвать удачным, потому что оно тоже противоречит принципам полиморфизма и сокрытия данных. Вывод: PAF безусловно претендует на роль универсальной, но с недостаточно проработанной архитектурой. В целом, библиотека представляет собой обширные наработки С++ кода, безусловно интересные профессиональным программистам, как примеры готовых решений. Она полно отражает Palm OS API. Однако, классы библиотеки слабо связаны с предметной областью операционной системы. Поэтому она сложна в освоении и в использовании. В результате код, написанный с использованием PAF, выглядит громоздким и сложным.
TeT Co. Ltd. Object Library for Palm OS R (POL) является самым молодым продуктом. В настоящее время на рынке присутствует уже вторая версия библиотеки. Эта C++ библиотека под Palm имеет архитектуру, схожую с такими известными библиотеками под Windows как MFC и WTL. Библиотека базируется на следующих основных классах:
Класс приложения обеспечивает автоматическую загрузку требуемого класса формы по её идентификатору. Обработчики событий формы автоматически получают управление по картам обработки события. Для этого достаточно связать идентификатор события с именем его обработчика. Карты обработки событий позволяют маршрутизировать события по иерархии классов форм. Ещё одна отличительная черта данной библиотеки это механизм фильтрации событий. Благодаря этому механизму, библиотека может быть легко расширена собственными элементами управления (controls) разработчика. Механизмы маршрутизации и фильтрации событий выгодно отличают POL от конкурентов. Библиотека позволяет создавать старые и новые gadgets, имеет развитой класс обработки строк, внешне совместимый с классом CString из MFC, обеспечена поддержка исключительных ситуаций (exceptions), есть поддержка баз данных Palm. В библиотеку входят классы-шаблоны (templates) для хранения коллекций и специально оптимизированные по скорости обработки и минимизации числа попыток распределения памяти. Класс CGrid обеспечивает автоматическую прокрутку таблицы и её синхронизацию с вертикальной полосой прокрутки, что отсутствует в Palm OS и других библиотеках. Этот класс реализует таблицы и позволяет полностью выделять всю строку или несколько строк. При этом поддерживаются устройства с цветным экраном. Есть возможность автоматически синхронизировать таблицу с базой данных на Palm. Проблема запусков приложения, когда область глобальных переменных (и в том числе vtables) недоступна, удачно решается посредством специализированного класса-шаблона. Ещё одна интересная особенность: POL интегрирована с Metrowerks CodeWarrior 6 IDE. К сожалению, во второй версии библиотеки не представлены классы ориентированные на слои обработки данных и работу со связью (data processing and data exchange). Вывод: основное отличие данной библиотеки - соответствие низко- и высокоуровневой объектной модели POL объектной модели Palm OS для слоя GUI. Реализацию библиотеки отличает ярко выраженная строгая и открытая архитектура, что позволяет рассматривать библиотеку как универсальный продукт лишённый какой-либо проектной специфики. Эта библиотека наиболее проста в использовании.
Сводная таблица оценок библиотек и краткая справка о их дополнительных характеристиках приведена в Табл.1. и Табл.2. соответственно. Суммарная оценка вышеперечисленных продуктов выполнена по пятибалльной системе с учётом весового множителя, отражающего степень важности показателя с точки зрения разработчика.
Табл. 1: Сводная таблица оценок
Табл. 2: Сводная таблица дополнительных характеристик Диаграмма приведенная на Рис.3 показывает условную качественную сравнительную характеристику предметных областей Palm OS API и рассмотренных библиотек. Не всякая операционная система, и Palm OS в частности, предоставляет в распоряжение программиста средства для своего расширения. Например, чтобы обеспечить отображение на Palm элементов списков, стандартный Palm OS API необходимо расширить специальным АТД, который должен включать методы, использующие механизм виртуальных функций С++. Поэтому предметные области библиотек пересекают предметную область Palm OS. Средства расширения стандартных возможностей Palm OS и наличие АТД, скрывающих специфику Palm OS, повышают практическую ценность этих библиотек для разработчика. Рис.3 Ни одна из существующих на рынке стандартных С++ библиотек в их текущем состоянии не может претендовать на роль безусловного лидера. АТД рассмотренных библиотек не полны и в основном покрывают слои GUI или Data exchange. С системной точки зрения, наиболее предпочтительной выглядит библиотека POL, как продукт лишённый проектной специфики и поддерживающий удобную объектную модель разработки приложений. Если разработчики библиотеки приложат усилия и расширят поддержку недостающих слоёв, как ATД единой базовой и пакетной моделей, то данная библиотека сможет претендовать на роль стандарта "де-факто" для Palm OS. Данный вывод основан на наличии у библиотеки продуманной и открытой объектной архитектуры, которая не накладывает реальных ограничений на возможность реализации недостающих слоёв ATД и не потребует изменений уже разработанных АТД. При разработке приложений интенсивно использующих обмен данными через COM порт рекомендуем использовать библиотеку PAF. За основу разработки приложений интенсивно использующих GUI и базы данных лучше брать модель разработки предлагаемую POL. http://www.palmq.ru URL этой статьи: http://www.palmq.ru/sections.php?op=viewarticle&artid=31 |