|
||||
|
ГЛАВА 1Введение
Добро пожаловать в мир разработки мобильного программного обеспеченияС каждым днем программное обеспечение играет в жизни людей все более заметную роль, давая нам возможность получать информацию, принимать решения "в режиме реального времени" и вообще вести более продуктивную и интересную жизнь. Вначале, когда количество доступных компьютеров было весьма невелико, каждый из них использовался в режиме коллективного доступа. Сегодня триумфальное шествие закона Мура подарило нам более демократичный и распределенный вид вычислительной техники — настольные и переносные (лэптопы, ноутбуки) "персональные компьютеры". В настоящее время мы являемся свидетелями еще более глубокого эволюционного процесса. Персональные компьютеры и централизованные серверы ни куда не делись, но их постепенно начинают окружать мириады мобильных устройств, обеспечивающих дальнейшую децентрализацию вычислительных мощностей. Это расширяет сферу применения программных приложений на доселе неведомые области. Те самые люди, которые просматривают Web-страницы, обмениваются сообщениями электронной почты, проводят время за электронными играми, совершают электронные покупки или каким-то иным образом интерактивно взаимодействуют с миром сетевой информации при помощи настольных компьютеров, все чаще предпочитают захватывать с собой "в дорогу" ту или иную отдельную частичку этих возможностей. Несколько лет тому назад компания Microsoft, в которой я работаю уже длительное время, сформулировала свои рыночные цели таким образом: "Компьютер на каждом столе и в каждом доме!" Сейчас становится очевидным, что эта формулировка должна быть дополнена словами о "программном обеспечении, которое может выполняться в любое время, в любом месте и на любом устройстве". Тем самым мы вплотную подходим к вопросу о мобильных устройствах. Что такое, собственно говоря, мобильные устройства и в чем состоит специфика разработки программного обеспечения для них? Что такое мобильные устройства? С вычислительной точки зрения мобильные устройства представляют собой некое компромиссное решение. Мы жертвуем невероятной вычислительной мощью, огромной емкостью памяти и графическими возможностями современных настольных компьютеров в пользу мобильных устройств в основном ради небольших размеров самих устройств, возможности использовать устройства сразу же, как только в этом возникает необходимость, а также их способности работать в течение длительного времени без перезарядки батарей. Этот компромисс вовсе не так уж плох, как могло бы показаться на первый взгляд. Принимая во внимание непрерывный экспоненциальный рост мощности процессоров и снижение цен, мы находимся на том этапе, когда, например, мое самое заурядное устройство Pocket PC (процессор XScale с тактовой частотой 400 МГц, ОЗУ объемом 64 Мбайт) по своим возможностям во многих отношениях оказывается мощнее настольных компьютеров, работавших под управлением Windows 95 всего лишь несколько лет тому назад. Но наряду с этим мобильные устройства являются также качественно другими. Простой перенос операционной системы и приложений с настольного компьютера на мобильное устройство не даст тех результатов, которые могли бы удовлетворить конечного пользователя. Каждому, кто пользуется современным мобильным телефоном или устройством PDA (Personal Digital Assistant — персональный электронный помощник, "карманный компьютер"), хорошо известно, что хотя устройство, которым он владеет, и является самым настоящим компьютером с богатым набором разнообразных возможностей, все же оно значительно отличается от настольного или переносного компьютера. В случае мобильных устройств приоритеты проектирования и пользовательские ожидания иные, нежели в случае традиционных настольных компьютеров. В наши дни мобильные устройства предлагают разработчикам и конечным пользователям такие уникальные возможности для получения информации, обогащения знаниями и развлечения, которые еще несколько лет тому назад трудно было даже себе представить. Каждый, кто в течение более или менее длительного времени пользовался современными смартфонами или устройствами с возможностями Wi-Fi, мог сам убедиться в том, какие фантастические вещи сейчас становятся доступными. Ничто не отражает смысл выражения "информация на кончиках пальцев" так буквально, как вычислительное устройство, которое можно в любой момент достать из кармана и сразу же начать работать с интересующей вас информацией. Установившиеся принципы разработки программного обеспечения остаются в силе и по отношению к мобильным устройствам. Выбрасывать имеющиеся у вас книги, посвященные методам успешного программирования или обеспечению безопасности, нет никакой необходимости. В действительности, при разработке программ для мобильных устройств следование принципам создания программного обеспечения, проверенным на практике, приобретает еще большую актуальность. Предлагаемая настольными компьютерами среда разработки приложений настолько богата различными возможностями и терпима к произволу пользователей, что разработчики могут решать многие из возникающих перед ними проблем "силовыми методами", не заботясь о применении рекомендованных методик программирования. Недостаточно серьезное отношение некоторых программистов к необходимости строго соблюдать базовые принципы проектирования и создания программ можно отчасти объяснить тем обилием ресурсов, которые находятся в их распоряжении. Как правило, такой подход к делу приводит к ухудшению условий работы пользователя из-за снижения быстродействия приложения, которого можно было бы избежать, или непродуманности пользовательского интерфейса; тем не менее, в силу большого запаса процессорной мощности, ресурсов экрана и возможностей ввода данных, свойственных настольным компьютерам, пользователям удается преодолевать указанные ограничения. В случае мобильных устройств наблюдается иная ситуация. Недоработанный пользовательский интерфейс очень скоро начинает раздражать пользователей, которые рассчитывают на возможности быстрого и интуитивно понятного доступа к информации, но не имеют в своем распоряжении никаких средств, позволяющих компенсировать просчеты, допущенные на стадии проектирования. Точно так же расточительное или непродуманное использование памяти в программе очень быстро приводит к замедлению работы приложений вплоть до того, что они становятся совершенно бесполезными. Поэтому требования, предъявляемые к проектированию программного обеспечения для мобильных устройств, оказываются гораздо более жесткими, чем в случае настольных компьютеров. Данная книга является руководством по разработке программного обеспечения, предназначенного для использования на мобильных устройствах, поскольку при создании мобильных приложений приобретение навыков использования систематического подхода к проектированию и созданию программ становится особенно актуальным. Эта тема пока еще плохо освещена в литературе, а недостаток руководств, написанных доступным языком, и описаний соответствующих методик вызывает чувство неудовлетворенности как у разработчиков, пытающихся перенести свои профессиональные интересы в область мобильных устройств, так и у конечных пользователей, которые реально испытывают на себе отрицательные последствия любых просчетов, допущенных проектировщиками программного обеспечения. Несмотря на то что при написании примеров, приведенных в данной книге, использовалась платформа NET Compact Framework, лежащие в их основе идеи имеют общий характер и представляют интерес для всех разработчиков приложений, какую бы из мобильных сред они для себя ни выбрали. Независимо от того, используются ли собственные коды C/C++, платформы .NET Compact Framework или Java/J2ME, либо любая другая технология, ориентированная на мобильные устройства, хорошее знание устоявшихся методов разработки мобильных приложений играет весьма существенную роль. Читатель научится ясно понимать и со знанием дела анализировать проблемы, с которыми приходится сталкиваться при разработке мобильных приложений, что позволит ему при любых обстоятельствах доводить процесс разработки до успешного завершения. Хочу надеяться, что эта попытка облегчить читателям вхождение в данную область и поделиться с ними знаниями, приобретенными моими коллегами и мною в нелегких условиях, когда нам приходилось пробираться по узким лабиринтам, а на всем пути нас подстерегали многочисленные невидимые ловушки, окажется удачной. Эта книга задумана как руководство, в котором вы найдете необходимые практические рекомендации относительно того, как пройти все этапы разработки мобильного программного обеспечения, чтобы ваши усилия увенчались успехом, и вы смогли извлечь из мобильных вычислительных устройств все то, на что они способны. Успех определяется несколькими ключевыми факторамиУспешность технического решения зависит от того, насколько удачными были проектные решения. Главную роль в этом играет умение выделить самое главное, отделить зерна от плевел и обозначить ключевые моменты, на продумывание которых стоит затратить свое драгоценное время. В любом деле можно легко отличить специалиста, который делает все "легко и непринужденно", от пыхтящего от натуги новичка. Причина этого очень проста: специалист способен делать все с изящной легкостью потому, что ему это дается действительно легко! Он сразу же интуитивно понимает, на чем необходимо сосредоточить свои усилия, а на что можно просто не обращать внимания. В то же время не обладающий достаточным опытом новичок изводит себя, пытаясь сосредоточиться одновременно на всем, что и заканчивается результатом, предсказать который не представляет особой сложности. Каждый, кому довелось пройти путь от начинающего лыжника или виндсерфера (два вида спорта, для которых характерна очень крутая кривая обучения) до уровня специалиста, сможет по достоинству оценить справедливость этого утверждения. Иногда даже сами специалисты не могут сказать, что именно делает их специалистами, а просто знают, как правильно сделать то-то и то-то (временами такая их позиция буквально бесит новичков, ожидающих от них хоть каких-то объяснений). Обучение тому, как выделить главное, на чем следует сконцентрироваться, является ключевым аспектом становления специалиста. Можно воспользоваться близкой аналогией из области математики, приведя в качестве примера "эффекты первого порядка" в их противопоставлении эффектам "второго, третьего и более высоких порядков", где идея состоит в том, что в любом конкретном уравнении с множеством отдельных членов имеются малозначительные факторы и факторы, с которыми "действительно следует считаться" Общее поведение системы определяется эффектами нижайших порядков. Точно так же обстоит дело и с разработкой мобильного программного обеспечения: здесь все имеет значение, но одни факторы играют гораздо более важную роль, чем другие. Ниже перечислены ключевые факторы, от которых зависит успешность разработки программного обеспечения для мобильных устройств. Важно учитывать все эти факторы, но первыми указаны самые значимые из них. В порядке уменьшения степени важности таковыми являются следующие факторы: 1. Сфера применения приложения. Очень важно ясно представлять себе, как в общих чертах, так и на уровне конкретных пользовательских сценариев, какие задачи должно решать данное мобильное приложение. Это утверждение может казаться слишком очевидным, но современные программные проекты буквально "напичканы" всевозможными "уникальными средствами" и обеспечивают достижение целей, ценность которых вызывает сомнения, что и стало причиной краха целого ряда многообещающих проектов, как крупных, так и небольших. Не стоит особняком в этом смысле и мобильное программное обеспечение. Успешные мобильные приложения должны острее фокусироваться на решении частных задач и преследовать еще более конкретные цели, чем их аналоги, выполняющиеся на настольных компьютерах и серверах. Очень важно отчетливо представлять себе, в решении каких задач данное приложение должно оказать помощь пользователю. Так же, если не еще более важно, сформулировать, чего данное приложение делать не должно. Отчетливая направленность приложения имеет критическое значение. 2. Производительность. Составив общее представление о том, каким должно быть ваше мобильное приложение, и установив сферу его применения, вы должны проанализировать все факторы, от которых зависит производительность приложения. Производительность мобильного приложения определяет его успешность в гораздо большей степени, чем любая другая характеристика. Быстрота ответной реакции мобильных приложений должна превышать ту, которая считается нормальной для приложений, выполняющихся на настольных компьютерах и серверах. Не обеспечив отличную производительность, вы не сможете перекрыть этот недостаток никакими другими проектными решениями. Представьте только, насколько вы были бы раздражены, если бы ваш телефон не позволял вводить номера с той скоростью, с какой их можно набирать на клавиатуре; пользователи мобильных устройств требуют от них высокой скорости ответной реакции. Очень важно подчеркнуть, что путь к повышению производительности лежит не через построчную оптимизацию кода вручную (во многих случаях это заведомо обречет вас на неудачу), а через понимание того, что именно является самым важным с точки зрения конечного пользователя, с последующей концентрацией на этом всех ваших творческих усилий и мастерства проектировщика, чтобы приложение показало себя с самой лучшей стороны. 3. Продуманный дизайн пользовательского интерфейса. Пользовательские интерфейсы мобильных устройств должны обеспечивать безошибочный и интуитивно понятный доступ к элементам управления. Интерфейсы этой категории весьма отличаются от тех типичных интерфейсов, которые предлагаются пользователям приложений, предназначенных для настольных компьютеров. Наряду с различиями в физических свойствах дисплеев и механизмов ввода различными являются и типичные способы использования интерфейса. Кроме того, не все конечные пользователи имеют одинаковый предыдущий опыт работы и в равной степени хорошо знакомы с приложениями для настольных компьютеров и вашими целевыми мобильными устройствами, что выдвигает дополнительные требования к дизайну пользовательского интерфейса. Разработка подходящего пользовательского интерфейса требует практики и носит итеративный характер. Сначала вы разрабатываете первоначальный вариант интерфейса, а далее переделываете его не один раз, пока ваше мобильное приложение не сможет обеспечить для пользователя все необходимые условия работы. Код приложения должен быть достаточно гибким, чтобы обеспечить вам свободу внесения в проект многократных изменений. Это является одновременно и наукой, и искусством. 4. Модель данных и модель памяти. Способ внутреннего представления данных в приложении, объем данных, хранящихся в памяти в каждый момент времени, и методы обработки данных влияют на функционирование мобильного приложения самым кардинальным образом 5. Коммуникационная модель. Непременным условием успешного создания замечательных мобильных приложений является разработка хорошей модели, позволяющей управлять способом и длительностью обмена данными между устройством и другими компьютерами. Мобильные устройства могут связываться с настольными компьютерами, серверами и другими устройствами, и каждый из этих видов взаимодействия вы должны хорошо понимать и правильно обеспечивать с технической точки зрения. Гораздо большее, чем в случае настольных компьютеров внимание вы должны уделить анализу вероятных причин разрыва связи, а также ситуаций, в которых полоса ограничена или ее стоимость высока, а каналы связи не являются надежными. Соответствующие технические методы, обеспечивающие удовлетворение описанных выше требований, обсуждаются в последующих главах. Как читать эту книгуТе знания, которыми автор делится с читателями в этой книге, были приобретены им на протяжении многих лет напряженной работы и являются результатом его личного опыта, а также подробных обсуждений с друзьями и партнерами по сети их собственного опыта, накопленного в процессе разработки мобильных приложений. Разработка мобильных программ — это работа, которая одновременно доставляет огромное удовольствие. Всякий раз, когда видишь, как на экране мобильного устройства, без труда умещающегося в кармане, вдруг появляется и начинает выполняться созданное тобой приложение, испытываешь чувство удовлетворения. При наличии таких технологий, как .NET Compact Network и Visual Studio .NET компании Microsoft, a также других конкурентоспособных инструментов и сред выполнения, предлагаемых различными поставщиками, разработка приложений для мобильных устройств становится вполне доступным занятием. Наилучший способ ознакомления с соответствующими методиками и их изучения — это их применение на практике и реализация наряду с собственными идеями. Я советую вам хорошенько запомнить перечисленные выше факторы успеха и приступить к чтению этой книги в том порядке, который вам кажется наиболее подходящим. Если вас особенно интересуют некоторые конкретные вопросы разработки программного обеспечения, можете сразу же приступить к чтению соответствующих разделов. Книга изобилует множеством полезных примеров; вы можете совершенно свободно переходить к любому интересующему вас месту книги и "пощупать" все собственными руками. И самое главное — смело экспериментируйте! Способы разработки программ для мобильных устройствСуществует немало технологий, позволяющих создавать приложения для мобильных устройств. Во многом подобно разработке приложений для настольных компьютеров, двумя основными моделями являются модель серверного Web-приложения и модель интеллектуального клиента. Данная книга в основном посвящена клиентским приложениям для мобильных устройств, но в целях сравнения имеет смысл вкратце проанализировать модели приложений обоих типов. Серверные приложения для мобильных устройствСерверные приложения принято называть "приложениями браузера". Приложения этого типа обладают значительной гибкостью. Их привлекательной чертой является то, что они не требуют присутствия на мобильном устройстве никаких других программных компонентов, кроме типового мобильного браузера. Недостаток такого подхода состоит в том, что, как и в случае любых других Web-приложений, мобильные Web-приложения требуют постоянной связи с сервером и не могут предложить того разнообразия возможностей и столь же быстрой ответной реакции, что и решения, обеспечиваемые установкой всех нужных программных компонентов на мобильном устройстве. Необходимость поддержания постоянного соединения с сервером требует особого внимания, поскольку в случае мобильных устройств, в отличие от настольных компьютеров, возможны нерегулярные нарушения связи, обусловленные передвижением пользователя, мобильное устройство которого не имеет никаких проводных подключений. В то же время, если ваше приложение должно выполняться лишь после того, как пользователь установит соединение с сервером, и вы желаете расширить круг целевых устройств, вариант мобильного Web-решения несомненно заслуживает внимания.
Технология компании Microsoft, предназначенная для разработки Web-приложений, носит название ASP.NET (Active Server Pages .NET). ASP.NET предлагает "мобильные элементы управления" ASP.NET, предназначенные для мобильных устройств. Visual Studio .NET 2003 предоставляет пользователям возможность создавать мобильные ASP.NET-приложения. На рис. 1.1 показано диалоговое окно Visual Studio для создания нового проекта ASP.NET Mobile Web Application. Процесс проектирования и создания мобильных Web-приложений в целом выглядит так же, как и в случае Web-приложений, ориентированных на настольные варианты Web-браузеров, за исключением перечисленных ниже основных отличий: ■ Проектное пространство. Вам предоставляется проектное пространство (design surface), которое учитывает особенности мобильных устройств и характеризуется использованием упрощенной и модернизированной парадигмы компоновки элементов управления, ориентированной на мобильные приложения. ■ Элементы управления, разработанные специально для устройств. Вместо обычного набора элементов управления HTML вам предлагается набор элементов управления Mobile Web Forms (Web-форм для мобильных устройств). Эти элементы специально спроектированы таким образом, чтобы они могли нормально визуализироваться на широком ряде устройств. Некоторые из предлагаемых элементов управления, такие, например, как элемент управления PhoneCall, являются специфическими для определенных типов устройств. ■ Язык визуализируемой разметки документов. На стадии выполнения приложения элементы управления Mobile Web Forms, выполняющиеся на сервере, могут генерировать документы, в которых используются синтаксис языков разметки Wireless Markup Language (WML), Compact HTML (cHTML) или HTML, в зависимости от возможностей браузера, установленного на мобильном устройстве, от которого поступил запрос. Исходя из информации, полученной вместе с запросом от мобильного Web-браузера, среда выполнения на стороне сервера принимает решение относительно того, какой набор параметров будет наиболее оптимальным для дисплея мобильного устройства, с которым она взаимодействует. Новые варианты технологии ASP.NET Mobile Web поддерживают широкий спектр устройств. Поддержку устройств нового типа можно дополнительно получить от компании Microsoft, изготовителей устройств, а также конечных разработчиков, желающих использовать в качестве целевых устройств такие, которые в настоящее время средой выполнения не поддерживаются. Для доступа к мобильным Web-приложениям на устройстве должен быть установлен мобильный браузер, располагающий соответствующими возможностями. Существует множество разновидностей мобильных браузеров, но наиболее распространенными являются уже упоминавшиеся ранее WML-, cHTML- и HTML-браузеры. Большинство современных мобильных телефонов поставляются с предварительно установленным Web-браузером того или иного типа Значительно больше информации относительно разработки мобильных ASP.NET- приложений вы найдете в оперативной справочной документации. (Великолепной отправной точкой для этого может служить раздел "Mobile" на Web- сайте http://www.asp.net.) Рис. 1.1. Создание нового проекта ASP.NET для мобильного Web приложения Мобильные приложения на основе модели интеллектуального клиентаВ этой книге основное внимание уделено разработке клиентских приложений для мобильных устройств. Если вы решаете, что ваше мобильное приложение будет лучше всего работать в качестве "толстого" клиента, то вам придется принять еще одно важное решение. Вы должны решить, какую именно технологию следует использовать на стороне клиента. Будете ли вы создавать приложение с использованием собственного или управляемого кода? У каждого из этих двух вариантов имеются свои преимущества и недостатки. Собственный кодПриложения на основе собственного кода (native code) обычно разрабатываются с использованием языков С или С++. Собственные коды полезны в тех случаях, когда вы хотите добиться от системы максимальной производительности или же вам требуется низкоуровневый доступ к оборудованию. В то же время, собственным кодам свойствен ряд серьезных недостатков, перечень которых приводится ниже. ■ Процесс разработки приложений с использованием собственного кода менее продуктивен по сравнению с вариантом управляемого кода. Поскольку вы работаете на более низком уровне абстракции, для создания кода программы потребуется больше времени. ■ Собственный код зависит от процессора. Результатом компиляции собственного кода является последовательность машинных команд, которые зависят от целевого микропроцессора. Таким образом, если предполагается, что в дальнейшем программа должна будет выполняться на процессорах, относящихся к разным семействам, то вам придется компилировать и развертывать несколько версий приложений. Иногда то же самое может потребоваться даже в случае разных процессоров, принадлежащих одному семейству. Так, существует несколько различных вариантов очень популярных микропроцессоров ARM, для каждого из которых необходимо использовать отдельные версии компиляторов собственного кода. ■ Собственный код требует более жесткого тестирования по сравнению с управляемым кодом. Работая с собственным кодом, вы должны самостоятельно заботиться о распределении памяти и других ресурсов. Как показывает практика, создание "идеального приложения" — задача не из легких, если вообще осуществимая. В сложных системах почти всегда найдутся области памяти, которые в силу тех или иных причин не были освобождены после того, как необходимость в них отпала. По прошествии некоторого времени даже небольшая утечка памяти или иных ресурсов в повторяющемся коде может привести к исчерпанию ресурсов устройства. Многие сотовые телефоны почти никогда не выключаются. Во многих устройствах PDA предусмотрены средства немедленного восстановления состояния системы, которые поддерживают выполнение приложений или их сохранение в памяти даже в тех случаях, когда устройство выключается. Своим поведением в отношении утечки памяти мобильные устройства больше напоминают не настольные компьютеры, а серверы, которые часто также остаются включенными в течение длительного времени. В случае утечки памяти система, в конечном счете, перестанет отвечать на ваши запросы или будет работать нестабильно. Разработка собственных кодов для мобильных устройств требует предельного внимания и строгого тестирования приложений в режиме "24/7" (24 часа в сутки, 7 дней в неделю). Инструменты разработки на С++ для мобильных устройств Управляемый кодТермин "управляемый код" (managed code) относится к программному коду, выполняющемуся в управляемой среде (managed environment), будь то среда сервера, персонального компьютера, мобильного устройства или встроенной системы. Диспетчер среды времени выполнения (runtime engine), или просто —среды выполнения, отвечает за распределение ресурсов, управление выполнением потоков и необходимую синхронизацию, а также обеспечивает безопасность типов выполняющегося кода, предотвращая несанкционированный доступ к памяти. Этот уровень абстракции располагается выше уровня собственного кода, что позволяет значительно повысить производительность труда разработчиков и надежность кода. Время существования объектов и других типов, размещенных в памяти выполняющимся кодом, отслеживается диспетчером среды выполнения, что избавляет разработчика от необходимости решения этой задачи. В результате компиляции управляемого кода генерируются двоичные коды инструкций, которые включают в себя метаданные с подробными описаниями классов, типов, переменных и другую информацию, необходимую для управления выполнением кода. Содержащиеся в метаданных описания кодов диспетчер среды выполнения использует для реализации своих административных и контрольных функций. Именно богатый набор метаданных и является ключевым отличием управляемого кода от собственных кода. К числу других характеристик, являющихся общими для многих управляемых сред выполнения, относятся следующие: ■ Независимость от процессора. При компиляции программы, написанной с использованием управляемого кода, получаются не специфические для процессора машинные команды, а программа на промежуточном языке. Для промежуточного языка (intermediate language) часто используют сокращение IL, а в некоторых средах времени выполнения его называют "байтовыми кодами" ("byte codes"); оба эти термина имеют один и тот же смысл. Впоследствии этот промежуточный код преобразуется в мобильном устройстве в соответствующий формат исполняемого кода. Компиляция программы в формат IL обеспечивает возможность выполнения одного и того же скомпилированного кода не только на различных процессорах, но и с использованием адресов различного размера. Так, один и тот же IL-компонент может выполняться и на 32-, и на 64-разрядных процессорах, поскольку инструкции не зависят от размера адресных полей процессора. ■ Независимость от операционной системы. Среды выполнения управляемого кода вместе с их библиотеками обеспечивают разработчикам возможность написания программ на уровне абстракции, расположенном поверх базовой операционной системы. Учитывая тот факт, что пользовательские интерфейсы и модели взаимодействия с пользователем для классов устройств, в которых применяются различные степени абстрагирования верхних уровней, значительно отличаются друг от друга, принцип разработки программ "пишется однажды, выполняется везде" ("write once, run everywhere") вряд ли можно считать практически осуществимым, однако операционная система все еще остается весьма полезным средством обеспечения переносимости приложений на устройства разных классов. Кроме того, возможность создавать автономные (автономные (headless) — не имеющие пользовательского интерфейса) компоненты, способные выполняться на различных устройствах без перекомпиляции, оказывается очень полезной при построении повторно используемых модулей. После того как автономные компоненты заполнены общим кодом, остается лишь реализация зависящих от конкретного типа устройства пользовательских интерфейсов, в которых используются общие модули такого типа. ■ JIT-компиляция (just-in-time — оперативная) и/или интерпретация кода. Существует два метода выполнения управляемого кода: 1) JIT-компиляция, когда IL сначала транслируется в собственные машинные команды процессора, а затем выполняется, и 2) интерпретация, когда просматривается каждая инструкция IL, и для выполнения предусмотренных ею действий вызываются предопределенные библиотеки. Код, получаемый в результате JIT-компиляции, работает быстрее, однако интерпретаторы легче создавать, поскольку они не обязаны знать, как генерировать специфические для процессора команды. Во многих случаях сначала создают интерпретатор, с помощью которого можно быстро перенести управляемый код времени выполнения на новый процессор, и лишь затем создают JIT-компиляторы, позволяющие оптимизировать код для конкретных типов наиболее распространенных процессоров. Один и тот же IL-код может либо интерпретироваться, либо JIT-компилироваться; окончательный выбор остается за теми, кто реализует исполняемый код. ■ Сборка мусора. Сборка мусора — это операция, избавляющая разработчиков приложений от необходимости заниматься утилизацией памяти, используя низкоуровневые функции. Существует множество различных стратегий сборки мусора, каждая из которых оптимизирована для сценариев определенного типа. Исследования в этой области продолжаются, приводя к нахождению все более оптимальных стратегий для самых важных сценариев. Обычной стратегией, применяемой в средах выполнения на мобильных устройствах, является стратегия "отслеживания и очистки" ("mark and sweep"), суть которой состоит в том, что среда выполнения периодически составляет список всех переменных, находящихся в данный момент в области видимости, и отслеживает все объекты, на которые эти объекты ссылаются. Каждый из обнаруженных таким способом объектов снабжается "меткой", указывающей на то, что объект все еще используется. На основании этой схемы создается дерево активных объектов (live-object tree), представляющее полный набор всех объектов, к которым код приложения может получить доступ. После того как все активные объекты отмечены, выполняется операция очистки, которая освобождает все объекты, являющиеся для приложения недоступными. Программы, осуществляющие сборку мусора, представляют собой чрезвычайно сложные системы, так что для оптимизации производительности серверов, настольных компьютеров и мобильных устройств всегда остается масса возможностей. В организациях, занимающихся разработкой сред выполнения управляемых кодов, значительная доля усилий направляется на повышение эффективности стратегий сборки мусора до уровня, способного обеспечить получение максимально возможных производительности и надежности. ■ Контроль версий. Помимо всего прочего метаданные можно использовать для передачи обширной информации, касающихся номера версии компонента и номеров версий компонентов, от которых он зависит. Среды выполнения управляемых кодов, располагающие возможностями контроля версий, способны обеспечивать корректную работу нескольких версий одних и тех же компонентов на одной и той же машине, позволяя каждому компоненту связываться именно с теми компонентами, с которыми он создавался и тестировался. Этот фактор имеет большое значение для обеспечения долговременной устойчивой работы устройств, на которых выполняется множество приложений. Встроенная поддержка контроля версий позволяет избежать конфликтов между ними и предотвратить возникновение как малозначительных, так и явно выраженных проблем, к которым может привести отсутствие надлежащего контроля версий. ■ Поддержка безопасности объектов. Наконец, управляемый код может расширить возможности политик безопасности, используемых на устройстве. Среды выполнения управляемого кода с развитой поддержкой средств безопасности могут установить политику, определяющую, какие именно полномочия предоставляются тем или иным разновидностям кода. Такой подход часто называют обеспечением безопасности путем явной проверки полномочий. Примерами политик безопасности подобного рода могут служить следующие: "Код, подписанный заслуживающей доверия третьей стороной, может выполняться без каких-либо ограничений", "Код, присутствующий в локальной файловой системе, может получать доступ к файлам, находящимся в указанном наборе папок" или "Загруженный из Internet код, не снабженный подписью заслуживающей доверия третьей стороны, имеет минимальные права доступа без возможности выполнения типовых операций файлового ввода-вывода". В разных средах выполнения поддержка средств безопасности различна; так, поддержка средств безопасности платформой J2ME отличается от той, которая обеспечивается платформой .NET Compact Framework v1.1. Политики безопасности, поддерживаемые платформой .NET Compact Framework v1.1, являются подмножеством политик безопасности, поддерживаемых платформой .NET Framework. Двумя наиболее распространенными средами выполнения управляемого кода на мобильных устройствах являются J2ME (Java Mobile Edition) и .NET Compact Framework. В данной книге для иллюстрации принципов разработки программного обеспечения для мобильных устройств используется платформа .NET Compact Framework, хотя большинство обсуждаемых положений справедливы по отношению к любым разновидностям методов разработки мобильных программ, включая разработку программ с использованием собственных кодов Преимущества управляемого кода трудно переоценить. Руководствуйтесь следующим общим правилом: если имеется хоть малейшая возможность использовать для разработки проекта управляемый код, воспользуйтесь ею. Благодаря этому значительно сократятся сроки разработки кода и количество ошибок в нем, облегчится перенос кода на новые устройства, повысятся его безопасность и устойчивость, а сопровождать его будет гораздо легче, чем аналогичный собственный код. Разрабатывать приложения с использованием собственных кодов имеет смысл лишь тогда, когда это диктуется соображениями производительности или необходимостью получения низкоуровневого доступа к устройствам. Но и в этих случаях лучше всего написать на собственном коде лишь небольшие критические участки программы, а во всей остальной ее части использовать высокоуровневый управляемый код. Как будет показано далее в этой книге, использование проверенных методов проектирования мобильного программного обеспечения в сочетании с управляемой средой времени выполнения, поддерживающей JIT-компиляцию, приводит к тому, что необходимость в привлечении собственных кодов возникает лишь в редких случаях. Возможностей управляемого кода чаще всего будет вполне достаточно даже для создания динамичных игр с высокой долей анимации. Преимущества высокоуровневых абстракций управляемого кода невозможно оспаривать. Пару десятков лет тому назад программисты переходили при разработке программ от языка ассемблера к языку С, оставляя ассемблерный код лишь для решения узкоспециальных или критических задач. Такой переход на более высокий уровень абстракции позволил разрабатывать намного более сложные приложения, отличающиеся повышенной надежностью, в гораздо более короткие сроки. В настоящее время совершается аналогичный переход от собственных кодов C/C++ к средам с управляемым кодом. .NET Compact Framework — среда выполнения управляемого кода для устройствПоскольку для иллюстрации рекомендуемых методов разработки программного обеспечения для мобильных устройств в этой книге используется платформа .NET Compact Framework, целесообразно привести в данной вводной главе высокоуровневый обзор этой платформы. Подробному описанию того, как работает .NET Compact Framework и какие методы управления памятью, компиляции кодов и сборки мусора она обеспечивает, посвящена следующая глава. Разработчики, остановившие свой выбор на других моделях программирования для мобильных устройств, обнаружат, что многие понятия имеют одинаковый смысл во всех моделях. Платформа .NET Compact Framework состоит из двух основных частей: 1) основного исполнительного механизма; 2) широкого набора библиотек управляемых классов. Основной исполнительный механизмОсновной исполнительный механизм .NET Compact Framework реализован на собственном коде. Его задачей является загрузка управляемого кода, компиляция, запуск и выполнение всех задач, связанных с обеспечением выполнения управляемого кода. Платформа .NET Compact Framework перенесена на несколько различных семейств процессоров, включая х86, StrongARM, SH3, MIPS и другие. Плавающая запятая: что собой представляет число?Библиотеки классов Ниже перечислены API-интерфейсы, используемые разработчиками при создании приложений. Эти API-интерфейсы можно разбить на следующие четыре логические категории: 1. Библиотеки базовых классов. Эти классы являются основой основ программирования. Поддержка строк, массивов, коллекций, файловых операций ввода-вывода, потоков, сетей и многих других вещей, которые вам всегда хотелось бы иметь под рукой при написании кодов, — все это содержится в библиотеках базовых классов. 2. Рисунки/формы. Библиотеки инструментов рисования и создания форм обеспечивают поддержку создания двумерных рисунков и богатого набора всевозможных форм и элементов управления, которые вы будете использовать при построении пользовательских интерфейсов. 3. Доступ к данным. Библиотеки доступа к данным предлагают модель реляционных таблиц, функционирующих в памяти, которая носит название ADO.NET и предназначена для работы с данными, созданными в памяти, загруженными из XML-документов или запрошенными из базы данных. 4. XML и Web-службы. В библиотеках этой категории содержатся средства, необходимые для работы с XML-документами и вызова Web-служб для обмена информацией между устройствами и серверами посредством XML и протокола SOAP. ПереносимостьИсполнительный механизм .NET Compact Framework и библиотеки классов проектировались таким образом, чтобы их можно было сравнительно легко переносить на устройства различных типов, работающие под управлением различных операционных систем. Одними из первых целевых устройств были те, которые работали под управлением операционных систем Windows СЕ 4.1, Pocket PC 2000/2002/2003 и выше, а также Microsoft Smartphone. В будущем возможна поддержка и других платформ, не относящихся к семейству платформ Windows. Следует также отметить, что поскольку платформа .NET Compact Framework создавалась поверх стандартов ЕСМА и ISO для инфраструктуры общего языка (Common Language Infrastructure — CLI), то вполне возможно, что другие организации разработают собственные варианты реализации CLI для языков С# и VB.NET, ориентированные на различные типы устройств. В этих реализациях библиотеки базовых классов, вероятнее всего, останутся теми же, но высокоуровневые библиотеки в них могут быть другими. В настоящее время существует, по крайней мере, две реализации CLI от независимых производителей, предназначенные для настольных компьютеров и серверов. РезюмеСовременные многофункциональные мобильные устройства предоставляют разработчикам замечательные возможности для создания конкурентоспособного мобильного программного обеспечения. Программы для мобильных устройств способны украсить людям досуг, доставить им ценную информацию и облегчить принятие решений, а также увеличить производительность труда за счет того, что работа может выполняться не только за рабочим столом. Учитывая богатое разнообразие новейших технологий и возможностей, наше время можно считать поистине благодатным для разработчиков программного обеспечения. Удачные мобильные приложения предоставляют пользователям интерфейсы, позволяющие сосредоточиться на сути задачи и быстро получить результат. Ключевым фактором таких удобств в работе является производительность приложения. При создании мобильных приложений первостепенным вопросом, на который всегда требуется находить ответ, является следующий: "Должно ли приложение быть локальным или основанным на браузере?" Вариант локальных приложений позволяет создавать максимально удобные условия работы для пользователей и обеспечивает возможность запуска приложений даже при отсутствии подключения к сети, хотя и требует предварительной установки на устройстве соответствующего программного обеспечения. Если выбран вариант многофункционального приложения, развернутого на локальном устройстве, то необходимо дать ответ также на следующий вопрос: "Следует ли создать приложение с использованием собственного кода или же с использованием среды выполнения управляемого кода?" Ответ по умолчанию подразумевает использование управляемого кода, поскольку в этом случае вы получаете существенный выигрыш в производительности и надежности, которые обеспечиваются современными средами, поддерживающими управляемый код. В настоящее время имеется несколько таких сред, самыми популярными из которых являются среды J2ME и .NET Compact Framework. В оставшейся части книги описываются наиболее важные аспекты приложений и сред выполнения для мобильных устройств и излагаются основные идеи и методы разработки программного обеспечения, при помощи которых вы сможете создавать замечательные мобильные приложения. Для иллюстрации этих идей, которая сопровождается множеством примеров, в книге применяется платформа .NET Compact Framework. Независимо от сделанного вами выбора языка или среды выполнения, обсуждающиеся в книге общие принципы в равной степени относятся к разработке мобильных приложений как с использованием собственных кодов, так и с использованием сред выполнения управляемого кода. Хочется надеяться, что чтение этой книги доставит вам удовольствие, и вы испытаете немало приятных минут, изучая и исследуя на практике те замечательные возможности, которые мобильные устройства открывают перед разработчиками новейшего программного обеспечения! Примечания:1 Caveat emptor (лат.) — пусть покупатель будет бдителен. |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|