Desenvolvimento Desktop

Sou iniciante em Java (desde o começo do ano :slight_smile: e me interesso bastante por desenvolvimento desktop, principalmente softwares utilitários e tal.
Então andei fazendo umas pesquisas sobre qual plataforma escolher para programar. Pelo qu posso ver, a maioria dos softwares nesse sentido são desenvolvidos em C++.

Eu já tentei me dar bem com C++, mas acho uma abordagem muito injusta da orientação a objetos (me parece mais como: C++ é procedural, mas se precisar tem objetos, como php). Não gosto da sintaxe - acho confusa, feia.
Outra opção disponível seria o C#. Mas também não me apeguei muito - me parece uma cópia mal feita do Java.
Poderia tentar scripts, como Python, mas também não me atraem muito.

O Java pra mim parece a melhor plataforma de desenvolvimento, um nível generalizado. Mas quando vamos falar de software para desktop, pelas características “cross-platform” que carrega, me parece que deixa um pouco a desejar em interfaces gráficas bonitas e integração com cada sistema operacional.

Gostaria de saber a opinião de vocês, e se tiverem mais experiência no assunto que pudessem dar dicas de por onde começar.

Eu estou no mercado desktop há mais de 10 anos e programo com freqüência nas 3 linguagens. Gosto muito das 3.
Além de moderador do GUJ, sou dono de uma comunidade no DevBrasil (C#) e participo do grupo cppbrasil.

Se você quer programar para desktop, provavelmente o Java é a pior alternativa das 3 que você citou.

O que você quer dizer com “o C++ tem uma abordagem injusta da orientação à objetos”? Injusta em que sentido?
Ele suporta tudo que o Java suporta: Polimorfismo, herança (inclusive herança múltipla).
Ele suporta encapsulamento, com melhores modificadores de acesso (e, inclusive, o acesso friend, que faz muita falta no Java).

O C++ não é uma linguagem procedural. Na verdade, ela implementa 3 paradigmas: procedural, o orientado a objetos e o genérico.
Na prática, os programas modernos em C++ utilizam pouco o paradigma procedural. Os dois últimos são os mais usados.
Quanto ao número de plataformas, creio que nenhuma supera o C++. Pegue uma biblioteca como a Qt (que é OO, por sinal), e você vai ver que sua aplicação vai rodar em praticamente qualquer lugar.
Finalmente, das 3 linguagens que você citou, o C++ é o único que dá garantias de tempo real, incluindo hard-real time (pode ser necessário em apps desktop, como as que trabalham com processamento de vídeo).

O C++ tem duas grandes desvantagens:

  1. É uma linguagem difícil: pois não é uma linguagem gerenciada. E lidar com memória no braço é muito difícil (embora te dê muito controle).
  2. É uma linguagem antiga: Muitas implementações não são tão legais nele, pois alguns conceitos nem sequer estavam maduros na época que eles foram implementados no C++. Há muitas más práticas que a linguagem criou por conta do legado também. Para programar com conforto em C++ é importantíssimo conhecer o que são boas práticas modernas e é importante não sair programando feito um maluco. Depois de entender a sintaxe da linguagem é fundamental pegar um livro como Effective C++ e ler de cabo à rabo (esse tipo de evolução é normal e com o tempo todas as linguagens começam a ter esse tipo de coisa. É o caso de “preferir StringBuilder no lugar de StringBuffer” no Java, ou ArrayList no lugar de Vector, só que o C++ é cheio de coisas como essa). Fique atento pois os últimos 20 anos de evolução do C++ estão na forma de se programar, não na linguagem em si (aliás, se vc não usa STL, boost, ou mesmo a QT, não programou em C++ ainda).

No caso de comparar Java e C#, eu diria que o Java peca em alguns requisitos básicos, que geralmente aparecem em aplicações desktop:

  • Pouca ou nenhuma integração com o SO (nada de acessar registro, AD, etc.)
  • Precária integração com hardware
  • Péssimo suporte a gráficos, sons e multimídia em geral (esqueça jogos em Java).

Para os dois primeiros casos, o C# possui os unsafe methods, que são infinitamente mais fáceis, limpos e seguros do que usar JNI.
Para o último caso, você tem o XNA que, aliás, é suportado em 3 plataformas.

O C# realmente começou como uma cópia, em muitos casos mal feita, do Java. Mas hoje, o Java é que corre atrás do prejuízo. O C# já suporta coisas que o Java vem prometendo faz tempo, como as lambda expressions. E suporta mais coisas: extension methods, LINQ, partial classes, etc. Tem uma implementação mais inteligente dos generics, sobrecarga de operadores, entre outros recursos interessantes. É preciso reconhecer que os prejuízos que a Sun sofreu, associado ao período de venda e aquisição pela Oracle teve um impacto bastante negativo na evolução da linguagem, e a Oracle terá que correr muito se quiser alcançar novamente a MS (que por sinal, está fazendo um ótimo trabalho).

Coloque na mesa os critérios que são importantes para os tipos de aplicações que você quer desenvolver, e enumere o que as linguagens oferem para cobri-los. Pelo seu texto, o que mais parece é que você está preferindo o Java por gosto pessoal, e não por uma escolha técnica.

Não, eu falo de escolha pessoal mesmo. Acho o Java muito organizado, fácil de entender a plataforma (to falando a nível de iniciante, ferramentas de desenvolvimento e runtime…).
Achei um pouco mais difícil quando decidi tentar o C# - me parece que tu fica um pouco preso ao Visual Studio (e a programação visual) pra qualquer coisa que tenha que fazer (visão de iniciante).
Eu gosto muito da abordagem da sun (oracle) de organizar o java.

Quanto ao C++, sim me dá a impressão de ser uma linguagem velha. E fico pensando se vale a pena investir e aprender. Me parece um ganho significativo de liberdade, milhões de bibliotecas por aí… mas parece meio “largado”. Pelo menos é a impressão que me passa. Por exemplo: se eu decidisse começar a aprender C++ hoje, nem saberia por onde.

Me expressei mal, não que a OO do C++seja injusta mas que deveria ser o padrão. Por exemplo: eu vejo pelas bibliotecas padrão do java (como IO), vejo uma orientação a objetos muito limpa, diferente do “padrão” do C++ que me parece muito procedural.

Como eu disse, eu to começando agora e to procurando alguma coisa pra me aprofundar: comecei com Java SE, to tentando aprender Java EE, mas as vezes sinto que falta sair um pouco do “sandbox” que o Java proporciona.

[quote=fuadksd]Não, eu falo de escolha pessoal mesmo. Acho o Java muito organizado, fácil de entender a plataforma (to falando a nível de iniciante, ferramentas de desenvolvimento e runtime…).
Achei um pouco mais difícil quando decidi tentar o C# - me parece que tu fica um pouco preso ao Visual Studio (e a programação visual) pra qualquer coisa que tenha que fazer (visão de iniciante).
Eu gosto muito da abordagem da sun (oracle) de organizar o java.

Quanto ao C++, sim me dá a impressão de ser uma linguagem velha. E fico pensando se vale a pena investir e aprender. Me parece um ganho significativo de liberdade, milhões de bibliotecas por aí… mas parece meio “largado”. Pelo menos é a impressão que me passa. Por exemplo: se eu decidisse começar a aprender C++ hoje, nem saberia por onde.

Me expressei mal, não que a OO do C++seja injusta mas que deveria ser o padrão. Por exemplo: eu vejo pelas bibliotecas padrão do java (como IO), vejo uma orientação a objetos muito limpa, diferente do “padrão” do C++ que me parece muito procedural.

Como eu disse, eu to começando agora e to procurando alguma coisa pra me aprofundar: comecei com Java SE, to tentando aprender Java EE, mas as vezes sinto que falta sair um pouco do “sandbox” que o Java proporciona.[/quote]

a impressão que passa é que a maioria dos professores passam muita coisa errada para os seus alunos hoje em dia. Mas porque ainda hoje c++ é amplamente utilizado?

  1. porque o seu compilador é hoje o que gera código mais enxuto e limpo.
  2. runtime pequeno e muito leve.

É uma linguagem difícil mas que oferece os melhores recursos.

Aqui na faculdade eles passam Java para o pessoal da TI em geral e C++ para jogos e segurança da informação.

Vcs sabem de algum material aberto na web pra aprender C++ (assumindo que vc ja saiba o basico, pq o problema não é a lógica de programaçãoe sim um “bootstrap” pra começar por algum canto)?

[quote=ViniGodoy]Eu estou no mercado desktop há mais de 10 anos e programo com freqüência nas 3 linguagens. Gosto muito das 3.
Além de moderador do GUJ, sou dono de uma comunidade no DevBrasil (C#) e participo do grupo cppbrasil.

Se você quer programar para desktop, provavelmente o Java é a pior alternativa das 3 que você citou.

O que você quer dizer com “o C++ tem uma abordagem injusta da orientação à objetos”? Injusta em que sentido?
Ele suporta tudo que o Java suporta: Polimorfismo, herança (inclusive herança múltipla).
Ele suporta encapsulamento, com melhores modificadores de acesso (e, inclusive, o acesso friend, que faz muita falta no Java).

O C++ não é uma linguagem procedural. Na verdade, ela implementa 3 paradigmas: procedural, o orientado a objetos e o genérico.
Na prática, os programas modernos em C++ utilizam pouco o paradigma procedural. Os dois últimos são os mais usados.
Quanto ao número de plataformas, creio que nenhuma supera o C++. Pegue uma biblioteca como a Qt (que é OO, por sinal), e você vai ver que sua aplicação vai rodar em praticamente qualquer lugar.
Finalmente, das 3 linguagens que você citou, o C++ é o único que dá garantias de tempo real, incluindo hard-real time (pode ser necessário em apps desktop, como as que trabalham com processamento de vídeo).

O C++ tem duas grandes desvantagens:

  1. É uma linguagem difícil: pois não é uma linguagem gerenciada. E lidar com memória no braço é muito difícil (embora te dê muito controle).
  2. É uma linguagem antiga: Muitas implementações não são tão legais nele, pois alguns conceitos nem sequer estavam maduros na época que eles foram implementados no C++. Há muitas más práticas que a linguagem criou por conta do legado também. Para programar com conforto em C++ é importantíssimo conhecer o que são boas práticas modernas e é importante não sair programando feito um maluco. Depois de entender a sintaxe da linguagem é fundamental pegar um livro como Effective C++ e ler de cabo à rabo (esse tipo de evolução é normal e com o tempo todas as linguagens começam a ter esse tipo de coisa. É o caso de “preferir StringBuilder no lugar de StringBuffer” no Java, ou ArrayList no lugar de Vector, só que o C++ é cheio de coisas como essa). Fique atento pois os últimos 20 anos de evolução do C++ estão na forma de se programar, não na linguagem em si (aliás, se vc não usa STL, boost, ou mesmo a QT, não programou em C++ ainda).

No caso de comparar Java e C#, eu diria que o Java peca em alguns requisitos básicos, que geralmente aparecem em aplicações desktop:

  • Pouca ou nenhuma integração com o SO (nada de acessar registro, AD, etc.)
  • Precária integração com hardware
  • Péssimo suporte a gráficos, sons e multimídia em geral (esqueça jogos em Java).

Para os dois primeiros casos, o C# possui os unsafe methods, que são infinitamente mais fáceis, limpos e seguros do que usar JNI.
Para o último caso, você tem o XNA que, aliás, é suportado em 3 plataformas.

O C# realmente começou como uma cópia, em muitos casos mal feita, do Java. Mas hoje, o Java é que corre atrás do prejuízo. O C# já suporta coisas que o Java vem prometendo faz tempo, como as lambda expressions. E suporta mais coisas: extension methods, LINQ, partial classes, etc. Tem uma implementação mais inteligente dos generics, sobrecarga de operadores, entre outros recursos interessantes. É preciso reconhecer que os prejuízos que a Sun sofreu, associado ao período de venda e aquisição pela Oracle teve um impacto bastante negativo na evolução da linguagem, e a Oracle terá que correr muito se quiser alcançar novamente a MS (que por sinal, está fazendo um ótimo trabalho).

Coloque na mesa os critérios que são importantes para os tipos de aplicações que você quer desenvolver, e enumere o que as linguagens oferem para cobri-los. Pelo seu texto, o que mais parece é que você está preferindo o Java por gosto pessoal, e não por uma escolha técnica. [/quote]

Oi Vinícius,

sabe: eu tenho o “sonho técnico” de um dia produzir algo útil em C++ e, como você, também trabalho há alguns anos desenvolvendo aplicações desktop (no início em VisualBasic/Delphi e depois em Java). Quais os seus toolkits favoritos para este tipo de empreitada?

Com relação ao Java ser a pior opção para desktop, há ressalvas. É importante lembrar os aspectos positivos também. O Swing é uma biblioteca riquíssima (o table model pra aplicações corporativas, por exemplo, é uma das sete maravilhas do mundo pra mim :D) , e o desenvolvimento multiplataforma com ele é real. Sim, pode haver pequenas diferenças entre uma plataforma e outra, mas não é algo que chegue a inviabilizar um projeto.

Com relação ao acesso às bibliotecas nativas mais básicas, é verdade, mas por outro lado, não é algo que seja feito de forma tão comum assim como possa parecer. Na esmagadora maioria das vezes, o modelo padrão que ainda reina é o cliente/servidor mesmo. Sobre a beleza das interfaces, neste caso é importante salientar que mais do que a presença de recursos, entra em cena o fator “bom gosto”. Há aplicações com interfaces nojentas em C#, Qt, Cocoa ou qualquer outro framework cool com o qual topemos.

[quote=ViniGodoy]Eu estou no mercado desktop há mais de 10 anos e programo com freqüência nas 3 linguagens. Gosto muito das 3.
Além de moderador do GUJ, sou dono de uma comunidade no DevBrasil (C#) e participo do grupo cppbrasil.

Se você quer programar para desktop, provavelmente o Java é a pior alternativa das 3 que você citou.

O que você quer dizer com “o C++ tem uma abordagem injusta da orientação à objetos”? Injusta em que sentido?
Ele suporta tudo que o Java suporta: Polimorfismo, herança (inclusive herança múltipla).
Ele suporta encapsulamento, com melhores modificadores de acesso (e, inclusive, o acesso friend, que faz muita falta no Java).

O C++ não é uma linguagem procedural. Na verdade, ela implementa 3 paradigmas: procedural, o orientado a objetos e o genérico.
Na prática, os programas modernos em C++ utilizam pouco o paradigma procedural. Os dois últimos são os mais usados.
Quanto ao número de plataformas, creio que nenhuma supera o C++. Pegue uma biblioteca como a Qt (que é OO, por sinal), e você vai ver que sua aplicação vai rodar em praticamente qualquer lugar.
Finalmente, das 3 linguagens que você citou, o C++ é o único que dá garantias de tempo real, incluindo hard-real time (pode ser necessário em apps desktop, como as que trabalham com processamento de vídeo).

O C++ tem duas grandes desvantagens:

  1. É uma linguagem difícil: pois não é uma linguagem gerenciada. E lidar com memória no braço é muito difícil (embora te dê muito controle).
  2. É uma linguagem antiga: Muitas implementações não são tão legais nele, pois alguns conceitos nem sequer estavam maduros na época que eles foram implementados no C++. Há muitas más práticas que a linguagem criou por conta do legado também. Para programar com conforto em C++ é importantíssimo conhecer o que são boas práticas modernas e é importante não sair programando feito um maluco. Depois de entender a sintaxe da linguagem é fundamental pegar um livro como Effective C++ e ler de cabo à rabo (esse tipo de evolução é normal e com o tempo todas as linguagens começam a ter esse tipo de coisa. É o caso de “preferir StringBuilder no lugar de StringBuffer” no Java, ou ArrayList no lugar de Vector, só que o C++ é cheio de coisas como essa). Fique atento pois os últimos 20 anos de evolução do C++ estão na forma de se programar, não na linguagem em si (aliás, se vc não usa STL, boost, ou mesmo a QT, não programou em C++ ainda).

No caso de comparar Java e C#, eu diria que o Java peca em alguns requisitos básicos, que geralmente aparecem em aplicações desktop:

  • Pouca ou nenhuma integração com o SO (nada de acessar registro, AD, etc.)
  • Precária integração com hardware
  • Péssimo suporte a gráficos, sons e multimídia em geral (esqueça jogos em Java).

Para os dois primeiros casos, o C# possui os unsafe methods, que são infinitamente mais fáceis, limpos e seguros do que usar JNI.
Para o último caso, você tem o XNA que, aliás, é suportado em 3 plataformas.

O C# realmente começou como uma cópia, em muitos casos mal feita, do Java. Mas hoje, o Java é que corre atrás do prejuízo. O C# já suporta coisas que o Java vem prometendo faz tempo, como as lambda expressions. E suporta mais coisas: extension methods, LINQ, partial classes, etc. Tem uma implementação mais inteligente dos generics, sobrecarga de operadores, entre outros recursos interessantes. É preciso reconhecer que os prejuízos que a Sun sofreu, associado ao período de venda e aquisição pela Oracle teve um impacto bastante negativo na evolução da linguagem, e a Oracle terá que correr muito se quiser alcançar novamente a MS (que por sinal, está fazendo um ótimo trabalho).

Coloque na mesa os critérios que são importantes para os tipos de aplicações que você quer desenvolver, e enumere o que as linguagens oferem para cobri-los. Pelo seu texto, o que mais parece é que você está preferindo o Java por gosto pessoal, e não por uma escolha técnica. [/quote]

Cara, as comparações foram muito bem esmiuçadas. Da próxima vez que eu for fazer um software desktop vou pensar 2 vezes antes de partir pro Swing logo de cara.
Valeu!

Só para “fixar” no caso da Web, JAVA sai na frente em relação a C++

[quote=kicolobo]Oi Vinícius,

sabe: eu tenho o “sonho técnico” de um dia produzir algo útil em C++ e, como você, também trabalho há alguns anos desenvolvendo aplicações desktop (no início em VisualBasic/Delphi e depois em Java). Quais os seus toolkits favoritos para este tipo de empreitada?

Com relação ao Java ser a pior opção para desktop, há ressalvas. É importante lembrar os aspectos positivos também. O Swing é uma biblioteca riquíssima (o table model pra aplicações corporativas, por exemplo, é uma das sete maravilhas do mundo pra mim :D) , e o desenvolvimento multiplataforma com ele é real. Sim, pode haver pequenas diferenças entre uma plataforma e outra, mas não é algo que chegue a inviabilizar um projeto.

Com relação ao acesso às bibliotecas nativas mais básicas, é verdade, mas por outro lado, não é algo que seja feito de forma tão comum assim como possa parecer. Na esmagadora maioria das vezes, o modelo padrão que ainda reina é o cliente/servidor mesmo. Sobre a beleza das interfaces, neste caso é importante salientar que mais do que a presença de recursos, entra em cena o fator “bom gosto”. Há aplicações com interfaces nojentas em C#, Qt, Cocoa ou qualquer outro framework cool com o qual topemos. [/quote]

Oi Kiko. Se for desenvolver apps desktop com C++, tente produzir algo com o Qt. Mas antes, recomendo fortemente que leia o Effective C++, e aprenda um pouco do C++ moderno. :slight_smile:

Quanto a ser a pior das três linguagens. É bom lembrar que “pior” é uma comparação. Ser a pior das três não significa que a linguagem é ruim. Só significa que há menos vantagens que as outras duas. De fato, o Java é uma boa linguagem para aplicações desktop que não envolvem interação com o SO, ou tempo real e que precisam rodar simultaneamente no Windows e no Linux. Boa parte das aplicações comerciais são assim, e não vejo qualquer problema em faze-las em Swing.

E eu concordo com você: O Swing é poderoso, flexível, e rico. Desde que você siga algumas boas práticas (inclusive a de aprender ele direito, e programar models), ele se torna agradável e poderoso. Há algumas implementações nele que deixam muito a desejar, como é o caso das JInternalPanes, mas nada que não se possa conviver (e todas as outras linguagens tem lá seus problemas).

O fato é que o Java é tão bom, que se você optar por ele, não estará muito atrás do C#. Ao ponto de que, se sua equipe tiver know how em Java, não tem porque fazê-los reaprender o C# caso o sistema realmente não peça muita integração com o Windows (se pedir pouca, pode-se até quebrar o galho com JNA e JNI). Nesse caso, ponha o povo para trabalhar com que eles gostam e sabem melhor, e conviva com os eventuais inconvenientes. :slight_smile:

Agora, o colega estava falando que queria se especializar em aplicações Desktop. Nesse caso, acho importantíssimo que ele não considere Java como sua única escolha. Se você quer ser especialista em desktop, e conseguir empregos realmente bons na área, é importante conhecer bem o C++. Isso abre portas para um leque enorme de aplicações, seja na área de engenharia, monitoramento, segurança, sistemas operacionais, aplicações multimídia, etc. E, vale lembrar, que para apps exclusivamente desktop, o C++ possui hoje o maior e mais bem remunerado mercado.

Mas também é um erro achar que o C++ é a panacéia para todos os problemas. Embora realmente seja possível desenvolver tudo com ele, para as aplicações mais simples, ele não é exatamente a linguagem mais produtiva. Use-o quando precisar de integração ou performance (requisitos comuns em apps desktop), mas tenha em mãos uma linguagem de desenvolvimento rápido quando não precisar disso. Nesse caso, é legal também conhecer o C#, que hoje tem se mostrado uma alternativa de desenvolvimento muito rápido, e com integração fácil com o Windows, ou o próprio Java.

Existem poucas linguagens que considero ruins. Uma delas é o VB6. De resto, é só estar atento para fazer um julgamento técnico, não baseado em gosto pessoal. É difícil, eu sei, eu mesmo já escolhi muito por gosto pessoal, mas quando fizer isso, admita para si mesmo, e meça bem se vale a pena lidar com as consequências da escolha - e muitas vezes vale.

Indiscutivelmente.

As áreas em que o C++ está presente e é forte:

  • Sistemas embarcados (embora aqui use-se ele quase como se usa o C);
  • Sistemas operacionais;
  • Aplicativos desktop para distribuição em escala (seu navegador, bloco de notas, word, etc…)
  • Jogos (praticamente todos);
  • Aplicações multimídia (players de vídeo, photoshop, etc).
  • Aplicações de processamento intenso (bolsa de valores, finanças, meteorologia, aplicações para supercomputadores);
  • Área científica

Áreas onde ele definitivamente não está presente:

  • Web

Pegue o livro do André Bueno aqui no Ponto V:
http://pontov.com.br/site/cpp/46-conceitos-basicos/88-roadmap-c

Recomendo que adquira e leia os livros indicados nesse artigo, em especial, o Effective C++ e o livro de STL.

Veja os artigos de Smart Pointers do Ponto V:
http://www.pontov.com.br/site/cpp/43-smart-pointers

Veja a documentação do QT:
http://doc.qt.nokia.com/qtcreator-2.4/index.html

É injusto o que as faculdades fazem. Geralmente você tem contato com a parte procedural do C++. De bibliotecas, você vê no máximo um pouquinho da IOStream (cout e fstream). Quase não se fala na biblioteca padrão, a STL (muita gente sequer fica sabendo da existência dela), e de pacotes como o . Praticamente ninguém usa classes como a std::string, std::vector ou std::map na faculdade.

Além disso, as APIs maiores não fazem parte do C++ padrão, e não são vistas na faculdade. O C++ é padronizado pela ISO, portanto, demoraria muito manterem uma API integrada como a do Java.

As APIs são desenvolvidas por outro grupo, que criou uma biblioteca chamada boost: http://www.boost.org/
São as classes da boost que gradualmente vão se incorporando ao C++.

Outras APIs fantásticas, como o QT, dificilmente são citadas em faculdade. Se você quer ver um conjunto de classes sólido, bem estruturado, fácil de mexer, estude a QT.

Na faculdade, também quase não se vê o terceiro paradigma do C++, o genérico, responsável por boa parte da evolução do C++. Não se vê as práticas de programação modernas (aposto que você não ouviu falar de RAII ou Smart Pointers).

Infelizmente, muitos profissionais acabam por comparar toda plataforma Java (linguagem + APIs) com o que viram de C++ na faculdade (praticamente só parte da linguagem), e acabam mesmo com uma impressão muito negativa.

[quote=kicolobo]
Oi Vinícius,

sabe: eu tenho o “sonho técnico” de um dia produzir algo útil em C++ e, como você, também trabalho há alguns anos desenvolvendo aplicações desktop (no início em VisualBasic/Delphi e depois em Java). Quais os seus toolkits favoritos para este tipo de empreitada?

Com relação ao Java ser a pior opção para desktop, há ressalvas. É importante lembrar os aspectos positivos também. O Swing é uma biblioteca riquíssima (o table model pra aplicações corporativas, por exemplo, é uma das sete maravilhas do mundo pra mim :D) , e o desenvolvimento multiplataforma com ele é real. Sim, pode haver pequenas diferenças entre uma plataforma e outra, mas não é algo que chegue a inviabilizar um projeto.

Com relação ao acesso às bibliotecas nativas mais básicas, é verdade, mas por outro lado, não é algo que seja feito de forma tão comum assim como possa parecer. Na esmagadora maioria das vezes, o modelo padrão que ainda reina é o cliente/servidor mesmo. Sobre a beleza das interfaces, neste caso é importante salientar que mais do que a presença de recursos, entra em cena o fator “bom gosto”. Há aplicações com interfaces nojentas em C#, Qt, Cocoa ou qualquer outro framework cool com o qual topemos. [/quote]

No quesito interface é a mais pura verdade a questão do bom gosto mesmo. O swing é muito rico e você pode desenhar o que quiser com ele, aliás swing e qtgui possuem uma coisa em comum: Ambos são lightweight. Qtgui também não é nativo do sistema operacional e é muito responsível como podem ver em algumas aplicações.

No quesito agilidade de desenvolvimento o java é a primeira opção na minha humilde opinião, porque você consegue fazer “bons softwares” com maior facilidade(grande parte das boas práticas do c++ já estão implementadas).

Agora no quesito “aplicação desktop” eu já optaria por c++ por causa do runtime muitas vezes mais leve. Grande parte dessas aplicações estão constantemente sendo alocadas e desalocadas em memória no sistema por usuários. Eles executam 4 ou 5 players simultâneamente, abrem documentos dos mais variados. Dessa maneira uma aplicação desktop necessita de runtime bem leve para atender espectativas de uso.

Também gosto do Java pra desktop e acho ele muito produtivo. Existem bibliotecas que permitem inclusive integração com os widgets do Windows 7, muito fáceis, o Java 7 deixou ele menos verboso e a nova API de IO me ajudou bem no momento que eu precisei usar o recurso, pura sorte. hehehe Apesar do Eclipse e Netbeans serem os mais populares, existem IDEs comerciais em Java bem produtivas.

Mas concordo com o que o pessoal falou, cada uma tem as vantagens e desvantagens, então vai do que a pessoa prioriza. No meu caso específico, eu precisava rodar a mesma aplicação em diferentes plataformas sem precisar disponibilizar meu código fonte ou ficar gerando builds separados. Com o Java ou .NET ainda tem a vantagem de quando surgir um hardware novo, a atualização da VM já garante as otimizações no meu software sem que eu precise recompilar ou liberar meu código fonte. E como minhas aplicações são mais cálculos que ficar criando objetos, o garbage colector não foi um impeditivo. Se eu precisasse dos recursos que o vinigodoy citou, a escolha poderia ser outra.

O C# foi minha primeira opção porque eu vinha do Delphi, mas esbarrei em quebra de compatibilidade quando fui usar o framework mais novo, até os services packs quebraram meu código. Mas sei que hoje esse problema reduziu bastante e pra maioria das aplicações a não ser que você use alguma coisa mais específica não vai esbarrar com isso. Outra dificuldade é que eu precisava de rodar no Linux e Mac e o Mono é bem mais limitado e lento do que o .NET Framework, mas também depende do caso.

Oi ViniGodoy,

Achei suas respostas bem esclarecedoras sobre desenvolvimento desktop.
Mas um comentário seu me despertou curiosidade:

O que acha de tão ruim em VB6 ?

Eu sempre achei que o maior problema do VB6 eram os programadores.
Com o marketing de qualquer um poder programar nela, você encontrava realmente qualquer um “programando”… e aí já viu.

Mas na ferramenta em si, quais eram os grandes problemas que via nela?

Sobre desenvolvimento desktop em geral, com as especulações de que o windows 8 jogará as aplicações desktop para segundo plano
(Aplicações em javascript + html + css rodarão direto no windows, sem o browser), acham que esse cenário mudará muito?

[quote=AbelBueno]Oi ViniGodoy,

Achei suas respostas bem esclarecedoras sobre desenvolvimento desktop.
Mas um comentário seu me despertou curiosidade:

Sobre desenvolvimento desktop em geral, com as especulações de que o windows 8 jogará as aplicações desktop para segundo plano
(Aplicações em javascript + html + css rodarão direto no windows, sem o browser), acham que esse cenário mudará muito?

[/quote]

Olha, o windows continua hemulando DOS ateh hoje, opinião pessoal; o pessoal do tio bill não fazem uma loucura dessas nem a pau.

[quote=josue carrecon][quote=AbelBueno]

Sobre desenvolvimento desktop em geral, com as especulações de que o windows 8 jogará as aplicações desktop para segundo plano
(Aplicações em javascript + html + css rodarão direto no windows, sem o browser), acham que esse cenário mudará muito?

[/quote]

Olha, o windows continua hemulando DOS ateh hoje, opinião pessoal; o pessoal do tio bill não fazem uma loucura dessas nem a pau.[/quote]

Lembrando que quando desenvolvia o Vista (longhorn) a Microsoft dizia que todas as suas aplicações seriam em .NET, que ninguém desenvolveria mais nas APIs nativas e que as próprias APIs Win32 rodariam sobre o .NET e não o contrário. E quem acompanhou as versões beta do Vista, viu que a cada novo beta a quantidade de .NET no SO só ia diminuindo e que até hoje o MS Office de demais ferramentas da MS rodam nativas. Até o bloco de notas continua nativo :lol:

Mas é fato que se a MS fizer isso, vai ser uma das últimas grandes a priorizar o html5, visto que Google, Apple, Facebook, Oracle, etc faz tempo que investem pesado em HTML+CSS+Javascript.

valeu as dicas.

[quote]Sobre desenvolvimento desktop em geral, com as especulações de que o windows 8 jogará as aplicações desktop para segundo plano
(Aplicações em javascript + html + css rodarão direto no windows, sem o browser), acham que esse cenário mudará muito? [/quote]

eu acho que pra apps simples, com “pouca densidade visual” e pouco cálculo (apps simples) html javascript e cia sao o suficiente. permitem uma personalização boa a interface (é bem genérico).

agora tem aqueles softwares que precisem de padrões de projeto melhores, mais “profissionais” vão continuar no padrão atual.

Que tipo de integração com as widgets? fala mais aí!

QT é a melhor API pra GUI (levando em conta o cross-platform (sem gambiarra) e beleza (simples, mas bonito)?

[quote=fuadksd]valeu as dicas.

[quote]Sobre desenvolvimento desktop em geral, com as especulações de que o windows 8 jogará as aplicações desktop para segundo plano
(Aplicações em javascript + html + css rodarão direto no windows, sem o browser), acham que esse cenário mudará muito? [/quote]

eu acho que pra apps simples, com “pouca densidade visual” e pouco cálculo (apps simples) html javascript e cia sao o suficiente. permitem uma personalização boa a interface (é bem genérico).

agora tem aqueles softwares que precisem de padrões de projeto melhores, mais “profissionais” vão continuar no padrão atual.

Que tipo de integração com as widgets? fala mais aí!

QT é a melhor API pra GUI (levando em conta o cross-platform (sem gambiarra) e beleza (simples, mas bonito)?
[/quote]

para desktop è o que a maioria das empresas está adotando. Vide adobe photoshop,skype, google earth

[quote=ViniGodoy]Eu estou no mercado desktop há mais de 10 anos e programo com freqüência nas 3 linguagens. Gosto muito das 3.
Além de moderador do GUJ, sou dono de uma comunidade no DevBrasil (C#) e participo do grupo cppbrasil.

Se você quer programar para desktop, provavelmente o Java é a pior alternativa das 3 que você citou.

O que você quer dizer com “o C++ tem uma abordagem injusta da orientação à objetos”? Injusta em que sentido?
Ele suporta tudo que o Java suporta: Polimorfismo, herança (inclusive herança múltipla).
Ele suporta encapsulamento, com melhores modificadores de acesso (e, inclusive, o acesso friend, que faz muita falta no Java).

O C++ não é uma linguagem procedural. Na verdade, ela implementa 3 paradigmas: procedural, o orientado a objetos e o genérico.
Na prática, os programas modernos em C++ utilizam pouco o paradigma procedural. Os dois últimos são os mais usados.
Quanto ao número de plataformas, creio que nenhuma supera o C++. Pegue uma biblioteca como a Qt (que é OO, por sinal), e você vai ver que sua aplicação vai rodar em praticamente qualquer lugar.
Finalmente, das 3 linguagens que você citou, o C++ é o único que dá garantias de tempo real, incluindo hard-real time (pode ser necessário em apps desktop, como as que trabalham com processamento de vídeo).

O C++ tem duas grandes desvantagens:

  1. É uma linguagem difícil: pois não é uma linguagem gerenciada. E lidar com memória no braço é muito difícil (embora te dê muito controle).
  2. É uma linguagem antiga: Muitas implementações não são tão legais nele, pois alguns conceitos nem sequer estavam maduros na época que eles foram implementados no C++. Há muitas más práticas que a linguagem criou por conta do legado também. Para programar com conforto em C++ é importantíssimo conhecer o que são boas práticas modernas e é importante não sair programando feito um maluco. Depois de entender a sintaxe da linguagem é fundamental pegar um livro como Effective C++ e ler de cabo à rabo (esse tipo de evolução é normal e com o tempo todas as linguagens começam a ter esse tipo de coisa. É o caso de “preferir StringBuilder no lugar de StringBuffer” no Java, ou ArrayList no lugar de Vector, só que o C++ é cheio de coisas como essa). Fique atento pois os últimos 20 anos de evolução do C++ estão na forma de se programar, não na linguagem em si (aliás, se vc não usa STL, boost, ou mesmo a QT, não programou em C++ ainda).

No caso de comparar Java e C#, eu diria que o Java peca em alguns requisitos básicos, que geralmente aparecem em aplicações desktop:

  • Pouca ou nenhuma integração com o SO (nada de acessar registro, AD, etc.)
  • Precária integração com hardware
  • Péssimo suporte a gráficos, sons e multimídia em geral (esqueça jogos em Java).

Para os dois primeiros casos, o C# possui os unsafe methods, que são infinitamente mais fáceis, limpos e seguros do que usar JNI.
Para o último caso, você tem o XNA que, aliás, é suportado em 3 plataformas.

O C# realmente começou como uma cópia, em muitos casos mal feita, do Java. Mas hoje, o Java é que corre atrás do prejuízo. O C# já suporta coisas que o Java vem prometendo faz tempo, como as lambda expressions. E suporta mais coisas: extension methods, LINQ, partial classes, etc. Tem uma implementação mais inteligente dos generics, sobrecarga de operadores, entre outros recursos interessantes. É preciso reconhecer que os prejuízos que a Sun sofreu, associado ao período de venda e aquisição pela Oracle teve um impacto bastante negativo na evolução da linguagem, e a Oracle terá que correr muito se quiser alcançar novamente a MS (que por sinal, está fazendo um ótimo trabalho).

Coloque na mesa os critérios que são importantes para os tipos de aplicações que você quer desenvolver, e enumere o que as linguagens oferem para cobri-los. Pelo seu texto, o que mais parece é que você está preferindo o Java por gosto pessoal, e não por uma escolha técnica. [/quote]

Concordo com VinyGodoy em todos os pontos. Entretanto deve-se analisar que tipo de software será desenvolvido, entre outros fatores para escolher a linguagem utilizada para desenvolvimento.

Eu particularmente gosto muito de Java e já desenvolvi algumas aplicações desktop, entretanto no último software que elaborei eu não o cogitei para desenvolver uma aplicação desktop, pois esse software faz uma integração com um coletor de dados que utiliza Windows CE 5.0, no qual o software do coletor também desenvolvi, neste caso a melhor opção foi utilizar C#, pois sem sombra de dúvidas esta linguagem é a melhor opção nesta situação de integração.

Como VinyGodoy disse: “Coloque na messa os critérios que são importantes”