Qual abordagem a seguir para o desenvolvimento de aplicativos direcionados a várias plataformas?

9

Para aplicativos direcionados a várias plataformas, vejo principalmente duas abordagens de desenvolvimento:

  • Escolha uma plataforma de desenvolvimento semelhante a JAVA. Tenha uma solução de código e deixe o tempo de execução intermediário manipular plataformas diferentes. Se algo der errado em qualquer plataforma, ajuste um pouco o código. Mas mantenha o mesmo para todos.

  • Faça código modular separando a lógica principal e a interface do usuário. Desenvolva UIs separadas para as respectivas plataformas que chamarão as mesmas bibliotecas principais. Crie o aplicativo separadamente para cada uma das plataformas de destino.

Então, qual seguir? Eu sei, a resposta começará com " Depende ". Mas quero ouvir suas opiniões sobre essas abordagens e os fatores a serem considerados para escolher qualquer uma delas.

Gulshan
fonte
2
Quanto a esta pergunta, não há como responder sem usar "depende". Depende de muitos fatores, como quais plataformas reais você tem em mente, você está planejando aplicativos de desktop independentes ou planeja usar alguns serviços da Web, quais são seus planos para a interface do usuário (o mesmo para todas as plataformas ou variadas?) E em breve. Você acha que o modelo de desenvolvimento Qt ou Gtk cai no primeiro modelo ou não? E quanto a .Net e Mono? Devo continuar ...?
Paweł Dyda 30/10/10
@ Gulshan Desculpe, pergunta óbvia - existe uma razão para que isso não possa ser um aplicativo da web e / ou feito com algo como o Adobe Air?
jellyfishtree
Este site é mais para perguntas e respostas subjetivas, mas também pode haver razões para aceitação. Apenas nos faz sentir como se estivesse jogando junto. Costumo procurar por perguntas postadas recentemente e não por responder.
Jeffo

Respostas:

3

De lado, as brigas atuais do Oracle / Apache / Google, ainda é difícil vencer a JVM para esse fim. É realmente muito alta qualidade na maioria das plataformas, universal, e você tem um bom número de idiomas para escolher (Java, Clojure, Scala etc.). Permite segmentar uma arquitetura de máquina única (a VM) e não se preocupar muito com o hardware do usuário final específico.

Dito isto, existem certos tipos de aplicativos para os quais ele pode não ser adequado: redes de baixo nível vêm à mente, assim como processamento pesado de gráficos / vídeo.

G__
fonte
2

Vá para HTML5. Qualquer plataforma com um navegador HTML5 pode executar seu aplicativo. Embora o HTML5 ainda não esteja pronto há muito tempo, a abordagem de aplicativos da Web é.

StartClass0830
fonte
2
Não há nenhum recurso completo para navegadores HTML5.
Craig
2

No editor de som do Audacity, usamos wxWidgets como nossa biblioteca de plataforma cruzada. Como precisamos vincular às bibliotecas C, e precisamos de velocidade e acesso de baixo nível, uma abordagem da JVM não funcionaria para nós. O código da GUI é 95% o mesmo em todas as plataformas. Usamos #ifdefs para pequenas variações. No entanto, achamos essencial ter um desenvolvedor trabalhando em cada uma das três plataformas (Mac, Windows Linux), porque, mesmo usando a biblioteca de plataforma cruzada, é muito fácil para uma mudança em uma máquina quebrar as coisas em outra.

Se você conseguir o desempenho necessário, vá para a JVM. Se você não puder, use o QT ou o wxWidgets, e eu sugeriria o QT sobre o wxWidgets, pois é menos trabalhoso fazer com que pareça agradável.

James Crook
fonte
11
+1 em "essencial para que um desenvolvedor trabalhe em cada plataforma". Os projetos de plataforma cruzada tornam-se rapidamente uma única plataforma, se você desenvolver apenas uma plataforma por vez.
ASHelly #
2

Como desenvolvedor em tempo real, usei com sucesso uma opção semelhante a 2 - módulos específicos da plataforma separados com uma API comum usada pela lógica principal. No entanto, nada do que eu fiz teve uma interface do usuário - rede, áudio, streaming de dados - nesse caso, é a interface de hardware de baixo nível que é específica da plataforma.

Eu fiz dessa maneira por vários motivos:

1) Para obter o melhor desempenho em cada plataforma

2) Para aproveitar os recursos oferecidos apenas em uma plataforma

3) (J) VMs não existiam para algumas das plataformas (sistemas embarcados, consoles de jogos ...)

AShelly
fonte
2

Depende do que é importante para você :)

Quando enfrentamos essa opção por um aplicativo Mac / Windows para várias plataformas há cerca de 10 anos, analisamos as várias opções entre plataformas - Java, Qt, wxWidgets etc. O problema que tivemos foi a aparência e a a interface do usuário era realmente importante para nós e todos os aplicativos "multiplataforma" pareciam comprometidos. Acabamos mordendo a bala e construindo nosso próprio núcleo de plataforma cruzada, com uma interface personalizada para cada plataforma no topo (escrita em PowerPlant para Mac e MFC no Windows). Com o tempo, ficamos muito bons nisso, e a parte "multiplataforma" ficou mais espessa sem comprometer a interface do usuário.

Agora, estamos analisando novamente essa decisão para um novo projeto. Olhando para as opções agora, eu provavelmente usaria o Qt - é gratuito e realmente parece ter amadurecido bem. Java pode ter sido uma opção, mas não podemos realmente levar em consideração o desempenho (estamos processando imagens em 3D).

Se a interface do usuário for realmente importante para você, suspeito que você precisará investir muito tempo para que as coisas pareçam corretas em cada plataforma, se você usa algo como Qt ou cria o seu próprio. Para um aplicativo interno ou especializado em que os usuários possam aceitar mais uma interface menos polida, pode ser bom!

Lances
fonte
1

Todo mundo se preocupa com linguagens como Java sendo "multiplataforma", mas o que eles realmente estão falando é que você pode compilar uma vez e executar em qualquer lugar. Mesmo em uma linguagem como Java (ou C # / mono), você ainda precisará de camadas de abstração para lidar com detalhes específicos do SO em algumas áreas.

C ++ e, de fato, a maioria das linguagens, são multiplataforma, você só precisa compilar para segmentar cada plataforma.

A chave é o processo, e não as ferramentas / idiomas:

  1. Verifique se você possui um processo de compilação integrado que cria e executa os testes de unidade para todas as plataformas de destino .
  2. Certifique-se de que todos os desenvolvedores testem em todas as plataformas de destino antes de fazer o check-in do código - Isso obviamente significa garantir que qualquer desenvolvedor tenha acesso ao número apropriado de máquinas / vms.
  3. Resumo bem. Abstraia tudo o que chama em APIs nativas. Escreva bibliotecas que atendem a essas chamadas.
  4. Se você estiver fazendo algo além da interface do usuário de formulários bastante simples que apenas atenda ao menor denominador comum, aceite que o código da GUI não é multiplataforma. Abstraia sua GUI / camada de apresentação e codifique-a separadamente para cada plataforma. Sim, existem kits de ferramentas da GUI de plataforma cruzada, adequados para aplicativos avançados, mas se você estiver fazendo algo mais avançado, precisará codificar para os recursos da plataforma nativa.

Essas etapas são as mesmas, independentemente do idioma / conjunto de ferramentas / estrutura que você usar.

Simon P Stevens
fonte
1

Alavancar a Web!

Sério, se você deseja o melhor retorno, escreva um aplicativo da web.

Por quê?

  • Normalmente, os clientes da Web não exigem muita energia do PC.
  • Os clientes da Web estão em TODA PARTE. Não apenas PC / MAC / Linux, mas em telefones, dispositivos móveis e muito mais.
  • Nada a mais para baixar para os usuários! (Normalmente, a menos que você queira algo sofisticado e use o Flash ou o Silverlight)
  • Todos os componentes comuns estão no lado do servidor e podem ser Java, .NET, PHP ou uma mistura de vários componentes existentes. O cliente não deve se importar!

Até as duas abordagens que você mencionou são muito semelhantes. O navegador da web renderiza HTML para várias arquiteturas subjacentes. Da mesma forma, a JVM interpreta o código Java de uma maneira que faz sentido para o hardware subjacente. A web, no entanto, simplesmente possui uma base de clientes mais ampla!

Ryan Hayes
fonte
0

Eu tive muita sorte com Mono. Posso escrever o mesmo código para máquinas Windows que faço para máquinas Linux e, na maioria das vezes, funciona em ambas. E posso usar as habilidades que já conheço em C # e WinForms.

Robert Harvey
fonte
Qual interface do usuário você usa ou se refere a aplicativos baseados em servidor? Estou curioso, porque tenho um aplicativo em funcionamento usando o WinForms e portado para o Mono e é legal, mas seria necessário uma quantidade enorme de trabalho para ser como as winforms "reais". Talvez GTK # seja melhor? O MonoDevelop é bom, mas talvez um pouco desajeitado.
Dan Rosenstark
Com o Mono, ambas as abordagens podem ser seguidas. Como Yar, qual você está seguindo e por quê? Essa é a questão.
Gulshan #
Sim, eu não sabia que você estava procurando uma fidelidade perfeita entre plataformas. Você pode obter isso com o GTK #, mas o custo é "bonito", porque um kit de ferramentas comum como esse precisa ser utilizado como o "menor denominador comum". Estou inclinado a concordar com o StartClass0830: o HTML5 seria muito trabalhoso, mas você poderia fazer algumas coisas bem legais em várias plataformas com ele.
Robert Harvey
0

Faça uma prova de conceito primeiro.

Se for um aplicativo razoavelmente complexo, a criação de uma prova de conceito dará uma idéia de quais recursos de idioma você precisa e de quais áreas você precisará para alavancar a estrutura ou bibliotecas de terceiros.

Os recursos e as bibliotecas de idiomas que você precisa determinarão qual idioma você escolherá (e, assim, como abordará o suporte a várias plataformas)

heretik
fonte
0

Criei um sistema, começando com um aplicativo de desktop, 15 anos atrás, quando o Java ainda estava em sua infância e não estava pronto para ser usado na criação desses tipos de aplicativos. Eu sabia que precisava ter um núcleo em C ++ e o projetei desde o início para ser multiplataforma, incluindo o uso de tipos de tamanho (por exemplo, int32 em vez de int ou long), para que pudesse rodar em Mac, Windows e UNIX (pré-Linux dias).

No momento em que tentei procurar um bom ambiente de interface do usuário entre plataformas, havia alguns que incluíam o XVT. Fiz o treinamento para o XVT e, quando comecei a criar um aplicativo real, percebi que não conseguiria criar uma aparência limpa e nativa na plataforma (começando no Mac). Então desisti dessa ideia e construí uma interface de usuário nativa do Mac (PowerPlant) sobre o núcleo portátil.

Alguns anos depois, mudamos para o Windows (UI no MFC). Foi mais rápido a criação de uma interface de usuário na segunda vez, mantivemos uma interface de usuário do Mac e do Windows em paralelo por um curto período de tempo e depois fomos para o Windows. Mais tarde, o núcleo mudou-se para vários tipos de UNIX e Linux, para nos permitir executar cálculos baseados em servidor. O núcleo funcionou bem, com alguns ajustes quando o preparamos para 64 bits.

Agora, voltei a usar um Mac e gostaria que pudéssemos voltar ao Mac, mas o tamanho e a complexidade do aplicativo tornam essa uma escolha difícil. Ainda faz sentido que grande parte desse aplicativo seja um aplicativo de desktop - é como um ambiente CAD. Mas, em vez de criar a interface do usuário novamente em uma linguagem C / C ++ específica da plataforma (e continuar mantendo uma interface do usuário baseada em MFC), estou mais inclinado a reescrever a pilha inteira em Java para que ela possa ser executada em várias plataformas.

Ainda pode haver razões para executar um núcleo não Java, digamos C ++, como fizemos. Mas eu gostaria de executar testes de desempenho iniciais para ver se isso era realmente necessário. E eu olhava atentamente minha interface do usuário para ver se poderia construí-la como um aplicativo da Web, conectado ao núcleo por meio de serviços da Web, para que eu pudesse ter uma variedade de clientes - aplicativos de desktop, aplicativos móveis, aplicativos da Web etc. Se eu precisasse de uma peça em C ou C ++, ela poderia ser escrita em uma camada de Java? Ou como um serviço da web?

Outra consideração: quanto tempo seu aplicativo estará disponível? Quão complexo ele se tornará? Se você tiver alguma idéia sobre isso, considere a possível longevidade de qualquer biblioteca de interface do usuário que esteja usando e sua capacidade ao longo do tempo de que as pessoas ajudem a mantê-las. Isso pode ser difícil de considerar agora, mas vale a pena pensar.

- Alex

Alex
fonte
A JVM provou ser muito estável em termos de compatibilidade com versões anteriores da biblioteca de tempo de execução. Para este cenário, teria sido um muito bem se encaixar ...
0

Se você pode torná-lo um aplicativo da web, faça um aplicativo da web. Usando kits de ferramentas como o ExtJS , é relativamente fácil criar interfaces de usuário compatíveis com vários navegadores, semelhantes a GUI.

Caso contrário, Java ou QT + C ++ ou C + Wx são opções possíveis para ter uma fonte para todos.

Sua segunda abordagem é apropriada se você deseja que o aplicativo pareça nativo em todas as plataformas de destino. Os aplicativos nativos para Mac têm uma aparência diferente dos aplicativos nativos do Windows, apenas o uso de outra capa e botões de atalho não será suficiente para cobrir isso.

user281377
fonte