Какой подход следует использовать при разработке приложений для нескольких платформ?


9

Для приложений, ориентированных на несколько платформ, я вижу в основном два подхода к разработке:

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

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

Итак, какой из них следовать? Я знаю, ответ начнется с « Это зависит ». Но я хочу услышать ваше мнение об этих подходах и факторах, которые следует учитывать при выборе любого из них.


2
Что касается этого вопроса, нет способа ответить на него, не используя «это зависит». Это зависит от многих факторов, например, от того, какие именно платформы вы имеете в виду, планируете ли вы автономное настольное приложение или планируете использовать некоторые веб-сервисы, каковы ваши планы относительно пользовательского интерфейса (одинаковы для каждой платформы или различны?) И скоро. Как вы думаете, модель разработки Qt или Gtk подходит для первой модели или нет? А как насчет .Net и Mono? Должен ли я продолжить ...?
Павел Дида

@Gulshan Извините, очевидный вопрос - есть ли причина, по которой это не может быть веб-приложение и / или сделано с чем-то вроде Adobe Air?
Медуза

Этот сайт больше для субъективных вопросов и ответов, но так же могут быть причины для принятия. Это заставляет нас чувствовать, что ты играешь вместе. Я склонен искать недавно опубликованные вопросы, а не без ответа.
JeffO

Ответы:


3

Нынешние склоки Oracle / Apache / Google в стороне, все еще трудно победить JVM для этой цели. Это действительно очень высокое качество на большинстве платформ, универсальное, и у вас есть множество языков на выбор (Java, Clojure, Scala и т. Д.). Это позволяет вам ориентироваться на архитектуру одного компьютера (ВМ) и не беспокоиться о конкретном оборудовании конечного пользователя.

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


2

Перейти на HTML5. Любая платформа с браузером HTML5 может запустить ваше приложение. Хотя HTML5 еще не готов к этому, подход с использованием веб-приложений есть.


2
Нет полнофункциональных браузеров HTML5.
Крейг

2

В звуковом редакторе Audacity мы используем wxWidgets в качестве нашей кроссплатформенной библиотеки. Поскольку нам нужно соединиться с библиотеками C, и нам нужны скорость и низкоуровневый доступ, подход JVM не будет работать для нас. Код GUI на 95% одинаков на всех платформах. Мы используем #ifdefs для небольших вариаций. Однако мы считаем необходимым, чтобы разработчик работал на каждой из трех платформ (Mac, Windows Linux), потому что даже при использовании кроссплатформенной библиотеки изменение на одной машине слишком просто, чтобы сломать вещи на другой.

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


1
+1 за «необходимо, чтобы разработчик работал на каждой платформе». Кроссплатформенные проекты быстро становятся единой платформой, если вы разрабатываете только для одной платформы одновременно.
AShelly

2

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

Я сделал это таким образом по нескольким причинам:

1) Чтобы получить оптимальную производительность на каждой платформе

2) Чтобы воспользоваться преимуществами, предлагаемыми только на 1 платформе

3) (J) Виртуальные машины не существовали для некоторых платформ (встроенные системы, игровые приставки ...)


2

Это зависит от того, что важно для вас :)

Когда около 10 лет назад мы столкнулись с этим выбором для кроссплатформенного приложения Mac / Windows, мы хорошо рассмотрели различные кроссплатформенные варианты - Java, Qt, wxWidgets и т. Д. Проблема, с которой мы столкнулись, заключалась в том, что внешний вид пользовательский интерфейс был действительно важен для нас, и все «кроссплатформенные» приложения выглядели, ну, скомпрометированы. Мы закончили тем, что кусали пулю и строили наше собственное кроссплатформенное ядро ​​с настраиваемым пользовательским интерфейсом для каждой платформы сверху (написано на PowerPlant для Mac и MFC на Windows). Со временем мы стали достаточно хорошими, и «кроссплатформенная» часть стала толще без ущерба для пользовательского интерфейса.

Сейчас мы снова смотрим на это решение для нового проекта. Глядя на варианты сейчас, я бы, наверное, выбрал Qt - он бесплатный и действительно хорошо созрел. Java могла бы быть вариантом, но мы не можем реально снизить производительность (мы занимаемся обработкой трехмерных изображений).

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


1

Каждый суетится из-за того, что такие языки, как Java, являются «кроссплатформенными», но на самом деле они говорят о том, что вы можете один раз скомпилировать и запустить везде. Даже в таком языке, как Java (или C # / mono), вам все равно понадобятся уровни абстракции для работы с деталями, специфичными для ОС, в некоторых областях.

C ++ и фактически большинство языков кроссплатформенные, вам просто нужно скомпилировать для каждой платформы.

Ключевым является процесс, а не инструменты / языки:

  1. Убедитесь, что у вас есть интегрированный процесс сборки, который собирает и запускает модульные тесты для всех целевых платформ .
  2. Прежде чем проверять код, убедитесь, что каждый разработчик тестирует на всех целевых платформах. Это, очевидно, означает, что разработчик должен иметь доступ к соответствующему количеству машин / виртуальных машин.
  3. Аннотация хорошо. Абстрагируй все, что вызывает родной API. Напишите библиотеки, которые обертывают эти вызовы.
  4. Если вы делаете что-то помимо довольно простого пользовательского интерфейса форм, который обслуживает наименьший общий знаменатель, просто признайте, что код GUI не является кроссплатформенным. Абстрагируйте свой GUI / уровень представления и закодируйте его отдельно для каждой платформы. Да, существуют кроссплатформенные наборы инструментов с графическим интерфейсом, которые хороши для простых приложений, но если вы делаете что-то более продвинутое, вам захочется кодировать возможности собственной платформы.

Эти шаги одинаковы независимо от того, какой язык / набор инструментов / рамки вы используете.


1

Используйте Интернет!

Серьезно, если вы хотите получить максимальную отдачу, напишите веб-приложение.

Почему?

  • Веб-клиенты обычно не требуют большой мощности ПК.
  • Веб-клиенты ВЕЗДЕ. Не только на ПК / MAC / Linux, но и на телефонах, мобильных устройствах и многом другом.
  • Ничего лишнего, чтобы скачать для пользователей! (Как правило, если вы не хотите что-то модное и использовать Flash или Silverlight)
  • Все общие компоненты находятся на стороне сервера и могут быть Java, .NET, PHP или сборкой из множества имеющихся у вас компонентов. Клиент не должен заботиться!

Даже два упомянутых вами подхода очень похожи. Веб-браузер отображает HTML для нескольких базовых архитектур. Точно так же JVM интерпретирует код Java таким образом, который имеет смысл для базового оборудования. Сеть, однако, просто имеет более широкую клиентскую базу!


0

Мне очень повезло с Моно. Я могу написать тот же код для машин Windows, что и для машин Linux, и по большей части он работает на обоих. И я могу использовать навыки, которые я уже знаю в C # и Winforms.


Какой интерфейс вы используете или имеете в виду для серверных приложений? Мне любопытно, потому что у меня есть работающее приложение, использующее Winforms, и я портировал на Mono, и это хорошо, но потребовалось бы ОГРОМНОЕ количество работы, чтобы быть похожим на "настоящие" winforms. Возможно, GTK # лучше? MonoDevelop хорош, но, возможно, немного неуклюже.
Дэн Розенстарк

С Mono можно следовать обоим подходам. Как Яр, за кем ты следуешь и почему? Вот в чем вопрос.
Гульшан

Да, я не осознавал, что вы ищете идеальную верность формы между платформами. Вы можете получить это с GTK #, но вы получите это за счет «симпатичного», потому что такой общий набор инструментов должен идти за «наименьший общий знаменатель». Я склонен согласиться с StartClass0830: HTML5 будет много работы, но вы можете сделать некоторые действительно крутые кроссплатформенные вещи с ним.
Роберт Харви

0

Сначала сделайте проверку концепции.

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

Функции языка и библиотеки, которые вам нужны, определят, какой язык вы выберете (и, следовательно, как вы приблизитесь к межплатформенной поддержке)


0

Я создал систему, начав с настольного приложения, 15 лет назад, когда Java еще только начинала развиваться и не была готова для использования при создании приложений такого типа. Я знал, что мне нужно иметь ядро ​​в C ++ и с самого начала проектировал его как кроссплатформенное, включая использование размерных типов (например, int32 вместо int или long), чтобы оно могло работать на Mac, Windows и UNIX (до Linux) дней).

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

Пару лет спустя мы перешли на Windows (пользовательский интерфейс в MFC). Во второй раз процесс создания пользовательского интерфейса был быстрее, мы некоторое время поддерживали параллельный интерфейс Mac и Windows, а затем перешли на Windows. Позже ядро ​​перешло на различные разновидности UNIX и Linux, что позволило нам запускать серверные вычисления. Ядро работало хорошо, с некоторыми изменениями, когда мы сделали его готовым для 64-битной системы.

Теперь я вернулся к использованию Mac и хотел бы, чтобы мы могли вернуться к Mac, но размер и сложность приложения делают этот выбор трудным. Для большей части этого приложения все еще имеет смысл быть настольным приложением - это похоже на среду САПР. Но вместо того, чтобы снова создавать пользовательский интерфейс на платформенно-зависимом языке C / C ++ (и продолжать поддерживать пользовательский интерфейс на основе MFC), я более склонен переписывать весь стек в Java, чтобы он мог работать на нескольких платформах.

Могут все еще быть причины для запуска не-Java ядра, скажем C ++, как мы это сделали. Но я хотел бы провести ранние тесты производительности, чтобы увидеть, действительно ли это необходимо. И я бы внимательно посмотрел на свой пользовательский интерфейс, чтобы посмотреть, смогу ли я создать его как веб-приложение, подключенное к ядру через веб-сервисы, чтобы у меня был целый ряд клиентов - настольные приложения, мобильные приложения, веб-приложения и т. Д. Если мне нужен кусок в C или C ++, может ли он быть написан под слоем Java? Или как веб-сервис?

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

Алекс


JVM оказалась очень стабильной с точки зрения обратной совместимости библиотеки времени выполнения. Для этого сценария это было бы очень хорошо ...

0

Если вы можете сделать это веб-приложением, сделайте это веб-приложением. Используя наборы инструментов, такие как ExtJS , относительно легко сделать хорошо выглядящий GUI-подобный кросс-браузер-совместимый пользовательский интерфейс.

В противном случае, Java или QT + C ++ или C + Wx являются возможными вариантами, чтобы иметь один источник для всех.

Ваш второй подход уместен, если вы хотите, чтобы приложение выглядело и чувствовалось на каждой целевой платформе. Нативные Mac-приложения выглядят и выглядят иначе, чем нативные Windows-приложения, просто использование другого скина и привязок клавиш будет недостаточно для этого

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.