O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Sugestões de Framework para criação de Desktop Apps

Iniciado por Pretty-Belle, 13/05/2020 às 14:44

Oi!

Eu desenvolvo este editor aqui para criação de databases de minha engine. Eu uso o framework SWT para Java, mas não estou gostando dele e vim pedir sugestões para alternativas.

O principais problemas dele:
- Renderização MUITO lenta, não só dos canvas que eu desenho manualmente (tipo o editor de mapas), mas também dos próprios widgets nativos, que ficam dando flicker;
- Java. Eu até gosto de Java, mas a falta de delegates/funções anônimas nesse projeto e a exigência de ter classe pra tudo me atrapalham e atrasam o desenvolvimento;
- Falta de customização do Look n' Feel. Eu sei que a biblioteca Swing permite mudar e é similar à SWT, mas gostaria de conhecer outras alternativas.

Coisas que eu gosto no SWT e seria ideal se o outro framework também tivesse:
- Criação de telas com drag n' drop OU alguma forma de pré-visualizar a tela sem ter que executar o programa do início;
- Reflection OU tipagem dinâmica;
- Type hints com verificação estática de tipos (se for numa linguagem com tipagem dinâmica).

A linguagem em si não importa, eu me viro com qualquer uma. Porém gostaria de evitar C++ (não tem reflection e, em geral, acho um saco de usar) e linguagens para programação puramente estrutural.
Se possível, me indiquem também uma IDE para a linguagem em questão que dê suporte a type-checking, autocomplete e refatoração (estilo Qt para C++ ou Eclipse para Java).

Obrigada!
Já perceberam que em vez de as pessoas usarem esse espaço para uma assinatura de fato, elas colocam alguma coisa aleatória (imagem, frase filosófica, divulgação, tipo o que estou fazendo agora), e colocam no corpo das mensagens o que deveria ser a assinatura?

Já chegou a tentar o Visual Studio? A linguagem principal é C#, e tem todas as features que você precisa aí, o único downside que vejo é ficar preso ao Windows (apesar de provavelmente existirem opções pra portabilidade).

Se você não se importar muito com peso (nota que peso != responsividade, que parece ser o problema no seu caso aí), o Electron pode ser uma alternativa. Electron é pesado em termos de memória (física e virtual), mas a renderização costuma ser bem lisa. É um framework pra Javascript, que deve ser a linguagem mais relaxada que você vai encontrar por aí, mas que tem bastante suporte. Se você quiser a tipagem estática, dá pra usar TypeScript sem muita dificuldade (ele "compila" pra JS).
Não tem nem como discutir a customização do look n' feel também: a interface é montada com HTML/CSS, é bem fácil customizar as coisas. Talvez seja mais chatinho a parte de preview, mas certamente tem alguma ferramenta pra isso por aí. Pra IDE, acho que o VS Code dá conta aqui (alguns podem dizer que na verdade não é IDE, é editor de código; não que isso faça alguma diferença).

E sobre o Java, se for continuar nele: a partir do Java 8 a linguagem já suporta funções anônimas, e já é uma versão relativamente antiga (2014). Já considerou atualizar? xd
~ Masked

13/05/2020 às 15:24 #2 Última edição: 13/05/2020 às 16:13 por Syureri
Usando Java ao invés de C# 8.0 em pleno século 2020? Como Qt está fora de questão...


  • Windows Forms: Disponível em Windows (.NET Framework, .NET Core, .NET 5, Mono), Linux (Mono) e OSX (Mono). Pode usar C#, F#, C++/CLI ou qualquer outra linguagem .NET.
  • Windows Presentation Foundation (WPF): Disponível em Windows (.NET Framework, .NET Core e .NET 5). Usa XAML (basicamente XML) para criação da interface e C# (ou qualquer outra linguagem .NET) para lógica. Recomendável fortemente pela Microsoft como sucessor do Windows Forms.
  • Avalonia UI: Disponível em Windows, Linux (GTK3) e OSX (MonoMac). Acelerado via Direct2D e Skia. Possui suporte experimental para Android e iOS. Assim como WPF, usa XAML para criação da interface e C# para lógica.
  • ImGUI: Menção de honra.

Mas sério, usa o Visual Studio. Não tem IDE melhor no mercado, mesmo com os troços da JetBrains.

E C++ possui sim reflection, tanto durante runtime quanto compile-time (embora seja preferível fazer tudo via compile-time).

13/05/2020 às 17:34 #3 Última edição: 13/05/2020 às 20:56 por Pretty-Belle
Gente, muito obrigada pelas sugestões!! Eu sabia da existência desse .NET mas nunca testei. De fato prefiro C# a Java, só nunca tinha usado ele pra app (só pro Unity msm).
No caso a portabilidade pra Linux para mim é algo importante, eu de vez em quando preciso usar lá.

Citação de: Brandt online 13/05/2020 às 15:19
E sobre o Java, se for continuar nele: a partir do Java 8 a linguagem já suporta funções anônimas, e já é uma versão relativamente antiga (2014). Já considerou atualizar? xd
Pior que isso é até familiar pra mim, mas a SWT é toda à base de classe anônima+método abstrato então eu nem sei se poderia usar mesmo hahah

Citação de: Syureri online 13/05/2020 às 15:24
E C++ possui sim reflection, tanto durante runtime quanto compile-time (embora seja preferível fazer tudo via compile-time).
Disso eu realmente não sabia, mas também não estou tão surpresa porque eu sou meio old school com C++ mesmo, a cada dia descubro uma feature nova de C++ no código alheio XD
Mas essa reflection no C++ chega a podar fazer coisas tipo, encontrar um campo do objeto pelo nome em runtime? Esse era o tipo de coisa que eu fazia com a reflection do Java. E também o tipo de coisa que seria trivial em linguagens tipo Lua, que representam objetos como tabelas/dicionários, mas não imagino como poderia ser feito em C++.
Já perceberam que em vez de as pessoas usarem esse espaço para uma assinatura de fato, elas colocam alguma coisa aleatória (imagem, frase filosófica, divulgação, tipo o que estou fazendo agora), e colocam no corpo das mensagens o que deveria ser a assinatura?

Fugindo um pouquinho do tópico, mas ainda acho uma observação relevante... Sobre reflection: https://softwareengineering.stackexchange.com/a/123959

No geral, você não precisa de Reflection a não ser que queira fazer macros ou algo do tipo. Um exemplo comum de uso de reflection em Java mesmo são as @Annotations, que no geral são só interfaces vazias que algum outro objeto consegue listar aplicando reflection. Se tudo que você precisa é definir campos dinamicamente (pra definir valores de um objeto de dados, por exemplo), usar um HashMap é suficiente (e provavelmente mais performático!).

Não cheguei a ver no código em si se realmente é o caso, mas acho que vale a pena considerar. Mesmo que você mude para outra linguagem com reflection, talvez seja interessante buscar outra solução.
~ Masked

13/05/2020 às 18:17 #5 Última edição: 13/05/2020 às 18:20 por Syureri
É comum entre programadores que se você precisa de reflection pra qualquer coisa durante runtime, isso indica uma falha de design no seu código. Você não precisa checar se a variável que está chamando o método possui um método "GetPlayerHealth" visto que só variáveis que possuem esse método deveriam estar sendo passadas. (sem curto circuito do if sem necessidade)
De fato, reflection é uma coisa a ser evitada mesmo em C#. Linguagens compiladas não lidam muito bem com isso. Ex: C# compilado pra código nativo via AOT não suporta reflection e você pode até desativar isso completamente, tendo mais performance e binários menores.

No caso de c++, é mais complicado, visto que a linguagem possui ênfase em aplicações com performance crítica (como jogos). O máximo que você consegue durante runtime em c++ seria utilizando RTTI, para trabalhar com objetos polimórficos, mas mesmo isso é desencorajado por ter um peso enorme.

Agora se você quiser obter informações sobre um tipo durante compile-time, a história é diferente. De fato, é muito satisfatório em c++11~17 e vai ficar ainda melhor em c++20 (o/
É possível checar se um tipo possui um membro/método, checar se herda de alguma coisa, se um método joga exceptions (me diga que tu não usa exceptions, favor), e gerar código durante compile-time é algo que a linguagem faz desde que templates começaram a existir. Esse tipo de coisa é muito melhor na minha opinião, visto que você realmente não precisa, nem quer, essas informações depois que o código está compilado. Pelo contrário, seria redundante e um peso desnecessário.

13/05/2020 às 18:40 #6 Última edição: 13/05/2020 às 18:43 por Strato
De IDE o VS é o mais completo. Mas ainda sim prefiro o VSCode por considerar mais prático e customizável (além de pode usar com Linux). O Code até pode virar uma "IDE" se vc fizer umas gambiarras com as extensões kkk

Por via de dúvidas acredito que WinForms ou outro "Presentation" da M$ atenda sua necessidade, contudo, por questões de customização e apelo visual sugiro algum framework javascript. Tipo o Electron que é o mais popular neste assunto, mas tem outra ótima alternativa que é NeutralinoJS - que recomendo mais. E se somar TypeScript acho que fica nos padrões que vc definiu

Mas se preferir seguir com C# e nível customização semelhante aos frameworks javascript, existe React Native Windows - inclusive arriscaria ir nele primeiro q nos outros presentations da microsoft. E também alternativa ao WinForms no Linux com gtk (c# e tem pra python tb). Aproveitando q comentei python, tem o Kivy com estética mais 'mobile' mas mexi pouco nesse para recomendar
Gifts: Mistyrol | [

De fato eu não preciso de reflection... Eu até pensei em usar hash maps no caso de uso que falei, mas com eles algumas partes do código ficariam mais feias, pois eu acesso os campos desses objetos várias vezes em vários momentos diferentes (assim, igual um objeto comum). Se fosse usar um C++ da vida, eu faria isso por falta de opção.
Quanto a acessar o campo normalmente, eu fazia isso antes, e resolvi mudar para acesso por nome (string) simplesmente porque do outro jeito não era nem um pouco prático ou escalável. Eu precisava criar alguma interface com get/set para cada campo que existisse em comum entre as classes e que eu usasse de forma genérica, e ainda escrever o efeito separado de cada widget para os respectivos campos que ele modificam (e são MUITOS), em vez de simplesmente associá-lo a uma string com o nome do campo e deixa que os métodos do reflection fazem o trabalho.
Ah, eu também uso através da biblioteca Gson para salvar/carregar os dados.

OBS: Talvez eu esteja usando o termo errado. Eu chamo de reflection porque esse é o nome do módulo em que essas coisas estão dentro da biblioteca padrão do Java. Não sei o quão abrangente isso é porque não olhei todos os métodos.

Citação de: Strato online 13/05/2020 às 18:40
Por via de dúvidas acredito que WinForms ou outro "Presentation" da M$ atenda sua necessidade, contudo, por questões de customização e apelo visual sugiro algum framework javascript. Tipo o Electron que é o mais popular neste assunto, mas tem outra ótima alternativa que é NeutralinoJS - que recomendo mais. E se somar TypeScript acho que fica nos padrões que vc definiu
Tem alguma IDE própria para Typescript, que permita as coisas que falei (refatoração, autocomplete)? Eu sempre senti falta dessas coisas em linguagens dinamicamente tipadas porque eu só uso notepad++/sublime/algum editor genérico. Parece firula mas é que as tools de autocomplete e refactor do Eclipse me ajudam MUITO xD Se tiver e ela integrar legal com Electron, parece uma boa. No caso do Eclipse tinha um plugin específico para o SWT, que visualizava as telas a partir do código. Não sei como funcionaria nos outros frameworks.
Já perceberam que em vez de as pessoas usarem esse espaço para uma assinatura de fato, elas colocam alguma coisa aleatória (imagem, frase filosófica, divulgação, tipo o que estou fazendo agora), e colocam no corpo das mensagens o que deveria ser a assinatura?