Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре
Шрифт:
Интервал:
Закладка:
Точно так же как не существует наилучшего универсального транспортного средства, не существует и единственного способа коммуникации, которое будет являться наиболее подходящим для вашего мобильного приложения во всех возможных ситуациях. Даже если не принимать во внимание денежные соображения, мул принесет вам гораздо больше пользы, чем вездеход, если необходимо взобраться вверх по крутому скалистому склону, а путешествие поездом будет гораздо эффективнее перелета на самолете, если необходимо добраться до соседнего города. То же самое можно сказать и в отношении средств коммуникации; самая дорогая, быстрая и современная технология связи вовсе не обязательно окажется наилучшим решением для вашего мобильного приложения. Важно понимать природу открывающихся перед вами возможностей выбора и принимать взвешенные решения, которые позволят полностью удовлетворить потребности вашего приложения в связи.
Что касается второй цитаты, то у нас есть все основания сомневаться в том, что семейный фильм 80-х годов о визите космического пришельца способен научить нас чему-либо в области мобильной связи. За цитатой скрывается простой намек: даже у представителей высокоразвитых цивилизаций иногда могут возникать трудности с тем, чтобы просто "сделать звонок домой". Чтобы связаться со своими родными, пришельцу потребовалось при помощи кабеля подключить обычный телефон через дешифратор к своему оборудованию; к счастью, нам (как мы надеемся!) будет немного легче. В любом случае для организации эффективной связи мы должны подготовить достаточно гибкий и надежный проект, позволяющий справляться с неожиданно возникающими проблемами.
Чтобы обеспечить доступ к сетевым ресурсам, в которых нуждается ваше мобильное приложение, вам придется преодолеть такие препятствия, как ненадежные соединения, недружественные брандмауэры и мобильные сети, которые, похоже, так и хотят извести вас всевозможными "усовершенствованными" пакетами, НТТР-заголовками или потоками, используемыми для передачи данных. Мобильные коммуникационные сети являются и будут оставаться более неоднородными по сравнению со стационарными сетями, и, как и в случае других аспектов проектирования мобильных приложений, весьма маловероятно, чтобы подход, основанный на принципе "пишется однажды — выполняется везде", привел вас к успеху при решении коммуникационных задач. Для того чтобы все работало так, как надо, вы должны провести множество экспериментов, во многом разобраться, создать качественный проект, надежно протестировать его и при этом, скорее всего, проявить, подобно упомянутому пришельцу, немалую долю изобретательности, ибо только тогда вы сможете быть уверены в том, что ваше приложение будет способно в любых ситуациях обеспечить связь "с домом".
Что касается третьей цитаты, то формулировка этого закона Мэрфи говорит сама за себя. Если существует хоть малейшая вероятность сбоя связи, то, как показывает практика, этот сбой обязательно наступит, причем это произойдет неожиданно и в самый неподходящий момент. Это вовсе не означает, что конечным пользователям вашего мобильного приложения остается только смириться с ненадежностью его работы. Тем не менее, отсюда следует, что вы должны приложить все усилия к тому, чтобы предусмотреть в логике работы приложения вероятность возникновения подобных сбоев и по возможности сгладить их отрицательные последствия. Устойчивая связь при ненадежных соединениях вполне возможна. Важно только заранее предполагать вероятность возникновения проблем подобного рода и прибегать к соответствующим защитным мерам.
Написание кодов программ для работы с мобильными сетями
Во всех случаях, представляющих практический интерес, приложения взаимодействуют с ресурсами, находящимися вне самого приложения. Приложения взаимодействуют с операционной системой, локальными ресурсами устройства и сетевыми ресурсами. Чем выше уровень взаимодействия, тем шире возможности приложения, но тем меньше вы можете их контролировать. Усиление взаимодействия с ресурсами вне устройства сопровождается увеличением вероятности возникновения сбоев при подключении к ним. Самое главное, о чем вы всегда должны помнить при написании кода, обеспечивающего взаимодействие через сеть, — это то, что вы не можете полностью контролировать конечный результат попытки установления соединения.
Ниже приводится краткое описание нескольких возможных уровней взаимодействия, перечисленных в порядке усиления степени зависимости мобильного приложения от ресурсов окружения.
■ Замкнутые вычислительные системы. При написании алгоритмов обработки данных, принадлежащих только вашему приложению, его судьба находится полностью в ваших руках. Все, что происходит в такой системе, происходит в результате выполнения кода, который вы знаете до мелочей и всегда можете проверить. Если ваш алгоритм распределяет и освобождает память, то часть контроля в процессе управления памятью он уступает среде выполнения, но вы по- прежнему можете быть достаточно уверены в том, что сохраняете контроль над всей системой. Такая ситуация в значительной мере соответствует замкнутой системе, поведение которой является для вас полностью предсказуемым.
■ Кооперативные вычисления совместно с операционной системой. При написании кода, взаимодействующего со средой выполнения и операционной системой, вы уступаете им несколько больше контроля в обмен на получение расширенных услуг с их стороны. В качестве типичного примера можно привести представление пользовательского интерфейса на современных вычислительных устройствах; пользовательский интерфейс является результатом совместной работы кода приложения и операционной системы. Базовая операционная система и среда выполнения приводят пользовательский интерфейс в действие и посылают вашему приложению события и сообщения, когда происходит нечто, что может представлять для него интерес. При разработке такого класса систем вы уже не располагаете возможностями столь полного контроля, как в случае замкнутых систем; теперь вы имеете дело с кооперативной системой, в которой комфортные условия работы пользователя обеспечиваются совместными усилиями вашего приложения и среды выполнения. Хотя вы и не можете точно сказать, что именно происходит в операционной системе, но вы все еще в состоянии делать достаточно надежные предположения относительно того, как будет вести себя приложение в целом. Например, в то время как ваше приложение уступает контроль над низкоуровневыми деталями функционирования пользовательского интерфейса, можно достаточно уверенно говорить о том, что оно по-прежнему сохраняет полный контроль над всем, что происходит с интерфейсом, и не разделяет этот ресурс ни с какими другими приложениями.
■ Кооперативные вычисления совместно с другими приложениями, выполняющимися на том же устройстве. Ваше мобильное приложение обладает полным контролем над своим пользовательским интерфейсом постольку, поскольку операционная система и среда выполнения устанавливают логические границы между индивидуальными ресурсами различных приложений; мое — это мое, а ваше — это ваше. Когда приложение начинает работать с глобальными ресурсами устройства, например, локальными файлами или базами данных, оно должно учитывать, что не только оно одно может использовать эти ресурсы. Роль честного посредника, распределяющего эти ресурсы, играет операционная система, но она не может гарантировать вашему приложению права исключительного полного доступа к данному ресурсу в любой момент времени. Кроме того, существует вероятность превышения допустимых пределов расхода ресурсов; например, если другие приложения исчерпали все доступное пространство файловой системы, то в вашем приложении должны быть предусмотрены адекватные способы выхода из подобных ситуаций. При работе с разделяемыми ресурсами очень важно предусматривать в коде соответствующие защитные меры, исходя из того непреложного факта, что любая попытка доступа к разделяемому ресурсу может оказаться неудачной. Необходимо также продумать, что будет происходить в тех случаях, когда к ресурсу будут пытаться получить доступ одновременно несколько приложений; одни типы ресурсов разрешают лишь одиночный доступ, другие допускают параллельный доступ, но не гарантируют согласования данных в процессе обновлений, тогда как третьи обеспечивают атомарное выполнение операций чтения и записи данных. Понимание поведения глобальных ресурсов устройства в условиях состязательного доступа к ним играет очень важную роль в обеспечении устойчивой работы приложения.
■ Кооперативные вычисления с интенсивным использованием сети. Если ваше приложение зависит от услуг, предоставляемых по сети, то появляются два дополнительных источника потенциальной неустойчивости. Доступ к сетевым ресурсам может оказаться невозможным из-за неготовности компьютера на другом конце сети к совместной работе. Что-то может нарушиться из-за того, что одно из звеньев сетевой цепочки, соединяющей два компьютера между собой, может повести себя не так, как ожидалось.