• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

OldCoder

Ultimate++: um Toolkit especial

8 mensagens neste tópico

Não sei se já alguma vez experimentaram o Ultimate++.

É um Toolkit de GUI de uso aberto (opensource, licença BSD), com a sua própria IDE, e ferramentas para desenvolvimento rápido. Permite desenvolvimento de aplicações para Windows e Linux.

Até aqui não tinha visto nada de especial... Até começar a ler a API com um pouco mais de atenção (o código fonte da biblioteca e da IDE vêm também incluídos no download.)

Esta biblioteca está carregada de truques. O Hello World de Ultimate++ (que deve ser compilado dentro da sua própria IDE) consiste no seguinte:

#include <CtrlLib/CtrlLib.h>

using namespace Upp;

GUI_APP_MAIN { // esta macro feiosa está somente a substituir o WinMain e o main do Windows e Linux.
   TopWindow myApp;
   myApp.Title("Hello World!");
   myApp.Run();
}

É impossível comentar num só post as diferenças todas entre isto e outros toolkits como o MFC ou o wxWidgets, mas para abreviar, o melhor no U++ é que desmotiva o uso abusivo da heap e funciona muito melhor quando os objectos são todos declarados na stack. Tenho a certeza que eles conseguiram isto com um monte de ponteiros inteligentes ocultos, porque a API do windows usa ponteiros e referências indirectas que se farta.

Por exemplo, os eventos são praticamente todos definidos por herança de métodos. Nada de "Connects" com ponteiros a funções separados das classes. EDIT: Ok, entusiasmei-me um bocado aqui. Os "Connects" estão lá, mas bem escondidos. Mas pelo menos, são sempre gerados dinâmicamente e têm uma sintaxe clara e simples.

Uma implementação particularmente inteligente foi permitir ao programador desenhar janelas num ambiente gráfico que gera automaticamente um template de classe: por exemplo, desenho no editor um form chamado MyDialogLayout, e depois uso-o no código assim, se quiser declarar uma janela de diálogo chamada MyDialog:

class MyDialog : public WithMyDialogLayout<TopWindow>

Desta forma, o parâmetro de template pode ser utilizado para embedir o form noutro lado se quiser. E claro que isto tem outras vantagens, como tornar muito mais fácil corrigir o código.

A sério, se tiverem curiosidade dêem-lhe uma vista de olhos e depois digam-me o que acham.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pelos screenshots o IDE em si não é feio. Quando tiver tempo tenho que experimentar (tanto em Linux como em Windows).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vantagens em relação ao wxWidgets?

http://www.wxwidgets.org/

Sim, eu tenho usado o wxWidgets para GUI desde 2003. :D

Na verdade, já tinha espreitado antes o U++ e na altura fui muito céptico, mas só ultimamente é que tenho reparado como eles estão a amadurecer.

Vou tentar fazer uma comparação justa, isto mesmo tendo em conta que conheço um toolkit melhor que o outro.

Vantagens em relação ao wxWidgets:

  • Usa gestão determinista de componentes: como consequência, cada componente utilizada no ambiente gráfico é uma variável, há um menor risco de erros relacionados com pointeiros, e estimula o modelo de RAII no desenho de classes.
  • Contém uma biblioteca NTL alternativa ao STL (também o wxWidgets tem a sua), mas com um aspecto muito inovador: semântica de movimento de variáveis (para quem tem curiosidade, eles implementaram isto com chamadas de asm :P ). Isto é, por exemplo, a = b move o conteúdo da variável b para o endereço de a. Isto leva a código muito mais eficiente, já que permite omitir processos dispendiosos de destruição de variáveis temporárias.
  • Usa templates sempre que estes fazem sentido, ao contrário do wxWidgets que tem sempre evitado o uso de templates, e só recentemente os começa a incorporar (creio que finalmente há parametrização de comportamento no 2.9.0, mas mesmo assim, não usei muito).
  • Traz a sua própria IDE e as suas próprias ferramentas de desenvolvimento rápido: é muito fácil desenhar uma janela, e chamá-la no código com um par de linhas. Para além do mais, graças ao desenho determinista da biblioteca, cada elemento visual corresponde a uma variável no código. Nada de mnemónicas complicadas e IDs, basta chamar a variável tal como no designer. O mesmo é verdade para gráficos, a IDE permite o desenho de gráficos e gera automáticamente código muito simples que permite chamar objectos Image a partir de classes geradas.
  • Tem o seu próprio formato de documentação (.tpp), que gera rtf, permite acedê-lo desde o código, e permite facilmente ao programador embedir a ajuda em qualquer biblioteca ou programa. Algo entre Javadoc e doxygen, mas com o texto da documentação separado do código.
  • A invocação dinâmica de eventos é muito mais fácil que no wxWidgets: utiliza objectos Callback<> que se podem construir facilmente com a macro THISBACK, e que aceita ponteiros a métodos com variáveis arbitrárias. No U++, não há declaração estática de eventos (se bem que isto pode por vezes ser uma desvantagem).
  • Tem o seu próprio motor gráfico (chamado Chameleon), que tanto permite desenhar aplicações com um aspecto nativo, como customização. Pelo que experimentei é muito rápido. A propósito, notei uns quantos problemas de desenho de elementos nativos no Windows, no wxWidgets, que o U++ não tinha. A família de classes Draw é também notoriamente eficiente (mais que os wxDC), surpreendeu-me bastante. :D

Desvantagens em relação ao wxWidgets:

  • A semântica de movimento é confusa para quem desconhece a biblioteca. Por exemplo, a opção de copiar objectos NTL está presente, mas só através do operador  "<<=". A escolha de operadores neste caso foi, na minha opinião, contra-intuitiva.
  • Apesar da conveniente ferramenta de documentação, a que se refere à própria biblioteca é escassa, o que dificulta ainda mais a já difícil aprendizagem.
  • É possível produzir código muito rapidamente no U++, mas só depois de um grande investimento de tempo a compreender como funciona. wxWidgets é de aprendizagem mais fácil, em grande parte devido às suas semelhanças com as MFC.
  • É uma biblioteca restrita para C++, não suporta outras linguagens. Em contrapartida, o wxWidgets suporta Python, Ruby, Java, D, e até .NET entre outras. Por outro lado, também é interdependente com o seu próprio IDE, enquanto o wxWidgets pode ser utilizado numa multitude de IDEs.
  • Só suporta Windows e Linux (X11/Ubuntu/Debian). O wxWidgets, por outro lado, suporta Windows, Linux, Mac OSX, e já se ouviu falar de experiências de sucesso em plataformas portáteis.
  • No geral, como produto open source, não tem a maturidade nem o alcance do wxWidgets: é gerido por uma comunidade muito mais pequena.

E pelo que dizem outros, muito do que disse para o wxWidgets é também válido para o Qt!... Mas aí não me meto, porque nunca usei Qt.

PS: A propósito, não mencionei coisas como suporte de OLE, comunicação em rede, e multithreading... porque os suporta tão bem como as outras bibliotecas... Agora que me lembro, até já lá vi amostras de código para criar controlos de ActiveX.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelo excelente post.

Eu vou fazer um editor para um motor 3D que ando a desenvolver, e estou bastante indecido entre wxWidgets, Qt e Ultimate++.

O que eu gosto no wxWidgets é que tem widgets bastante poderosos, como o wxPropertyGrid, o wxAUI (sistema de docking poderosa), boa documentação e bons editores (wxDesigner, DialogBlocks, wxFormBuilder).

Estou a gostar do que vejo no Ultimate++, mas está-me a custar decidir usar, porque não é tão conhecido, como disseste a comunidade é mais pequena. Outra coisa que não gosto (também não gosto no wxWidgets nem no Qt) é que não usa a STL, que já uso nas minhas aplicações.

Está complicado decidir. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelo excelente post.

Eu vou fazer um editor para um motor 3D que ando a desenvolver, e estou bastante indecido entre wxWidgets, Qt e Ultimate++.

O Ultimate++ tem uma demo com um controlo OpenGL, mas é (muito) mais fácil ver como funciona depois de estar familiarizado com a gestão de janelas. A falta de documentação é mesmo :P

O que eu gosto no wxWidgets é que tem widgets bastante poderosos, como o wxPropertyGrid, o wxAUI (sistema de docking poderosa), boa documentação e bons editores (wxDesigner, DialogBlocks, wxFormBuilder).

Eu também hesitei por causa das jóias da coroa do wxWidgets como o wxAUI, mas o Ultimate++ tem já uns quantos widgets poderosos em desenvolvimento: já inclui widgets como o GridCtrl, o ExpandFrame e o Docking. Nesse aspecto, não está muito atrás.  E o designer de layouts da IDE do U++ não fica muito atrás de ferramentas como o wxDesigner... A propósito, estás habituado a arrastar wxSizers para dentro do form para manter a escala das widgets? No U++, o designer usa "springs" para definir se as widgets crescem com o resto da janela ou ficam fixas; não te precisas de preocupar com sizers no código. Quando descobri as "springs", foi uma alegria! :D

Mas a documentação é um grande problema no U++, sim senhor. :D

Estou a gostar do que vejo no Ultimate++, mas está-me a custar decidir usar, porque não é tão conhecido, como disseste a comunidade é mais pequena. Outra coisa que não gosto (também não gosto no wxWidgets nem no Qt) é que não usa a STL, que já uso nas minhas aplicações.

Bem, no que diz respeito a compatibilidade com o STL, as minha primeiras experiências no Ultimate++ foram frustrantes... Mas agora já me estou a começar a habituar à grande diferença. As Strings do NTL até aceitam e devolvem char* sem problemas. O grande senão é que quando dizes "=" tens que te lembrar que as variáveis estão a mudar de sítio. E isto, parecendo que não, ao príncipio provoca crashes até dizer chega e custa a habituar... e no NTL não se usam iteradores por uma questão de "filosofia".

Eu aventurei-me por uma simples razão. Apesar da falta de documentação, tens uma pequena comunidade bastante acessível e na qual é mais fácil tomar parte. Ainda hoje relatei um bug ao autor da package de Docking, ele corrigiu-o num instante, e um par de horas depois, já se podia baixar o código corrigido no Google Code. Há um número de pessoas bastantes activas, e desde um par de anos para cá, parece que a biblioteca tem evoluído imenso. E depois, tens outros bónus como o Chameleon que está embutido em toda a biblioteca: podes mudar o estilo das widgets todas acrescentando algumas linhas num construtor (se experimentares o U++, compila o exemplo UWord para veres o que acontece). O wxWidgets não tem equivalente (wxUniversal? Não o abandonaram já?).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E depois, tens outros bónus como o Chameleon que está embutido em toda a biblioteca: podes mudar o estilo das widgets todas acrescentando algumas linhas num construtor (se experimentares o U++, compila o exemplo UWord para veres o que acontece). O wxWidgets não tem equivalente (wxUniversal? Não o abandonaram já?).

Isso por acaso é algo que não me interessa muito. Detesto aplicações que não são nativas. E o que gosto do wxWidgets é que, pelo menos com as últimas versões, os widgets costumam ser bastante nativos, sendo difícil perceber que a aplicação não usa o toolkit nativo do sistema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como eu disse antes, e podes mais tarde verificar, a customização é opcional.

Por omissão, os controlos usados são nativos. Aliás, mais nativos que os do wxWidgets no Linux, por exemplo (que usa o GTK para motor gráfico).

A única diferença é que lá, que o potencial de criar interfaces gráficos alternativos é superior. No Windows Vista, programas do Ultimate++ de há seis meses atrás desenhavam menus com ícones de forma mais correcta que o wxWidgets 2.8.10. Por outro lado, no Linux as aplicações de U++ adaptam-se melhor ao interface do Gnome. O Chameleon confere flexibildade para os dois lados, mas sem transformar um programa de C++ num programa escrito em Java Swing :P:D.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora