Перейти к основному содержимому
Версия: 11.0.0

Работа с несколькими платформами

Managing Platform Differences & Capabilities

Различия между платформами, являются проблемой не только для кроссплатформенной разработки; даже в рамках одной платформы могут существовать различия.

В первую очередь, можно выделить разнообразие размеров экрана, но также не стоит забывать об иных многочисленных характеристик устройств, требующих обработки в приложении, в зависимости от их наличия или отсутствия. Это особенно важно при проектировании для устройств с разными парадигмами. К примеру, настольные и мобильные операционные системы, предоставляют абсолютно разные модели взаимодействия.

Следовательно, все приложения должны иметь возможность плавного изменения функциональности, иначе существует риск появления в общей части функциональности, которая не используется для конкретной платформы.

Примеры различия платформ

Существует ряд фундаментальных характеристик, которые являются универсальными, от чего могут использоваться в вашем приложении на любой платформе. Таким образом, общими частями можно считать:

  • Экран для отображения пользовательского интерфейса.
  • Некоторые виды устройств ввода. К примеру, сенсоры для смартфонов, а мышь и клавиатура для компьютеров.
  • Отображение данных во views.
  • Изменение данных.
  • Возможность навигации.

Платформозависимые особенности

Помимо универсальных характеристик, вам также надо учитывать ключевые различия между платформами. Вам потребуется проанализировать такие ситуации и написать код специально для их обработки:

  • Размеры экрана: В то время как некоторые платформы (к примеру iOS) имеют стандартизированные размеры экраны, что позволяет относительно легко сверстать пользовательский интерфейс, другие платформы (к примеру Desktop или WebAssembly) имеют самые разнообразные размеры экрана, что затрудняет верстку пользовательского интерфейса.

  • Навигационные метафоры: Они могут сильно отличаться как между разными платформами (к примеру, аппаратная кнопка ' back(рус: назад)'), так и в рамках одной платформы (к примеру, различия между Android 2 и 4, iPhone и iPad).

  • Клавиатура: Некоторые устройства имеют отдельную физическую клавиатура, в то время как другие используют виртуальную. Такие нюансы вы должны отслеживать в коде, поскольку виртуальная клавиатура, при появлении, закрывает часть экрана.

Указанные ранее различия, стоит учитывать при разработке вашего приложения для различных платформ на Avalonia. Пусть вы и должны стремиться к максимальному переиспользованию вашего кода, вам также следует избегать и полного использования одно и того же кода для всех платформ. Вместо этого, для каждой платформы настройте UI так, чтобы им было удобно пользоваться.

Dealing with Platform Divergence

Поддержки нескольких платформ из общей кодовой базы, можно добиться через абстрагирования функционала платформ или условную компиляцию.

  • Абстракция платформы: Данный подход использует паттерн "Фасад", который обеспечивает одинаковый доступ на разных платформах. Он абстрагирует конкретные реализации под каждую платформу в общий API. Основным преимуществом такого подхода, является возможность написания кода, не зависящего от платформы, что повышает возможность повторного использования кода, а также его сопровождения. Однако такой подход не позволяет в полной мере использовать специфичный функционал каждой платформы.

Абстракции для платформ

В Avalonia, вы можете использовать абстракции классов для оптимизации разработки под разные платформы. Этого можно добиться с помощью интерфейсов или базовых классов, определенных в общем коде, а уже под конкретную платформу, добавлять реализацию или расширение соответственно.

Интерфейсы

Благодаря интерфейсам, вы можете создавать платформозависимые классы для использования их в общий библиотеках.

Как это работает

Интерфейсы определяются в общем коде, а после передаются как параметр или свойство. Для Платформозависимых приложений, можно создавать реализации интерфейсов, что позволяет эффективнее использовать общую кодовую базу.

Преимущества

Основным преимуществом такого подхода, является возможность использовать платформозависимые и код, и внешние библиотеки, в реализации для каждой платформы,

Недостатки

Потенциальным недостатком является необходимость создания и передачи реализации в общий код. Если интерфейс используется в глубинах общего кода, то это может привести к необходимости передачи его через несколько методов, что приводит усложнению цепочки вызова. Если общий код использует множество различных интерфейсов, то все они должны быть созданы и установлены в рамках общего кода.

Наследование

Ваш общий код, может содержать абстракции и виртуальные классы, которые можно дополнить в платформозависимых проектах. Данный метод напоминает интерфейсы, но в то же время позволяет задавать готовые реализации.

Как это работает

Вы можете создавать базовые классы в общем коде, которые могут быть дополнены в проектах под конкретную платформу через наследование. Однако C# допускает наследование только от одного класса, из-за чего этот подход может повлиять на будущий дизайн вашего API. Поэтому вам следует использовать наследование с осторожностью.

Преимущества и недостатки

Преимущества и недостатки при использовании интерфейсов, в равной степени применимы и к наследованию. В то же время, дополнительным преимуществом наследования, является базовый класс, который может содержать некоторую реализацию в коде. В теории, это может обеспечить независимость от платформозависимых реализаций, которые можно расширять по мере необходимости.