Pergunta

Espero que esta questão não pareça tão ampla quanto pode parecer à primeira vista.Estou projetando um aplicativo de software em meu <sarcasm>volumoso</sarcasm> tempo livre.Eu gostaria que fosse multiplataforma e modular.Neste ponto, como ainda estou na fase de planejamento, posso escolher praticamente qualquer linguagem e conjunto de ferramentas.

Isso torna as coisas mais difíceis, e não mais fáceis, porque aparentemente existem muitas maneiras de atingir ambos os objetivos (modularidade, agnosticismo de plataforma).

Minha premissa básica é que a segurança, o armazenamento de dados, a interação com o sistema operacional e a configuração devem ser todos gerenciados por um aplicativo "contêiner" - mas a maioria das outras funcionalidades será fornecida por meio de módulos plug-in.Se eu tivesse que descrevê-lo em alto nível (sem revelar completamente a minha ideia), seria um único aplicativo que pode realizar muitos trabalhos diferentes, todos dedicados ao mesmo objetivo (há muitas coisas diferentes para fazer, mas todas os dados precisam interagir e estar altamente disponíveis).

Esta não é uma ideia nova e não é particularmente exótica.No entanto, me vejo lutando não tanto com a forma de fazer isso (posso pensar em várias maneiras), mas com qual método é melhor.

Por exemplo, sei que o Eclipse praticamente incorpora o que estou descrevendo, mas acho que os aplicativos Java em geral (e o Eclipse não é exceção) são muito grandes e lentos para o que preciso.O mesmo vale para aplicativos de desktop escritos em Python e Ruby (que são linguagens excelentes!)

Não me importo de recompilar a base de código para diferentes plataformas como executáveis ​​nativos.No entanto, C e C++ têm seu próprio conjunto de problemas.

Como desenvolvedor C#, tenho preferência por código gerenciado.Mas ainda não estou convencido do Mono (posso estar convencido).

Alguém tem alguma ideia/experiência/framework favorito específico para compartilhar?

Foi útil?

Solução

Só para citar um exemplo:para aplicativos .NET, há o CAB (Composite Application Block) e o Composite Application Guidance para WPF.Ambos são principalmente implementações de um conjunto de vários padrões de design focados na modularidade e no baixo acoplamento entre componentes semelhantes a uma arquitetura de plug-in:você tem uma estrutura IOC, classes base MVC, um corretor de eventos fracamente acoplado, carregamento dinâmico de módulos e outras coisas.

Então, suponho que esse tipo de infraestrutura padrão seja o que você está tentando encontrar, mas não especificamente para .NET.Mas se você ver o CAB como um conjunto de implementações de padrões, poderá ver que quase todas as linguagens e plataformas possuem alguma forma de estruturas já integradas ou de terceiros para padrões individuais.

Então minha opinião seria:

  1. Estude (se não estiver familiarizado) alguns desses padrões de design.Você poderia tomar como exemplo a estrutura CAB para documentação do WPF: Padrões na Biblioteca de Aplicativos Compostos
  2. Projete sua arquitetura pensando em quais desses padrões você acha que seriam úteis para o que você deseja alcançar primeiro sem pensar em implementações de padrões ou produtos específicos.
  3. Depois de definir seus 'requisitos de arquitetura' mais especificamente, procure estruturas individuais que ajudem a realizar cada um desses padrões/recursos para a linguagem que você decidir usar e monte sua própria estrutura de aplicativo com base neles.

Concordo que o difícil é tornar toda essa plataforma independente.Eu realmente não consigo pensar em nenhuma outra solução para escolher uma linguagem independente de plataforma madura como Java.

Outras dicas

Você está planejando um aplicativo desktop ou web?

Todo mundo por aqui parece achar que o Mono é ótimo, mas ainda não acho que esteja pronto para uso na indústria, eu igualaria o mono a onde está o vinho, ótima ideia;quando funciona, funciona bem, e quando não funciona... bem, você está sem sorte.mod_mono para Apache é extremamente problemático e difícil de executar corretamente.

Se você está visando o desktop, nada supera a estrutura Eclipse RCP (Rich Client Platform): http://wiki.eclipse.org/index.php/Rich_Client_Platform.

Você pode construir windows, linux, mac, todos sob o mesmo código e todos os componentes da UI são nativos do sistema operacional.E o RCP vence em modularidade, tem uma arquitetura de plug-in incomparável (pelo que vi)

Trabalho com RCP há 1,5 anos e não sei o que mais poderia substituí-lo, é o número 1 em seu nicho.

Se você se opõe totalmente ao java, eu examinaria wxWidgets com python ou C++

Se você deseja independência de plataforma, terá que escolher entre desempenho e esforço de desenvolvimento.C++ pode ser mais rápido que Java (isso é discutível FWIW), mas você obterá independência de plataforma muito mais facilmente com Java.Python e Ruby estão no mesmo barco.

Duvido que o .NET seja muito mais rápido que o Java (afinal, ambas são linguagens VM), mas o grande problema do .NET é a independência da plataforma.Mono tem um objetivo nobre e resultados surpreendentemente bons até agora, mas irá sempre estar tentando acompanhar a Microsoft no Windows.Você pode aceitar suas limitações, mas ainda não é o mesmo que ter ambientes multiplataforma idênticos aos de Java, Python e Ruby.Também:as ferramentas de desenvolvimento e suporte do .NET são fortemente voltadas para o Windows e provavelmente sempre serão.

IMO, sua melhor aposta é direcionar Java ...ou, pelo menos, a JVM.Se você não gosta da linguagem Java (e como desenvolvedor C#, acho que não é o caso), então você pelo menos tem opções como Jython, JRuby e Scala.Com a JVM, você obtém uma independência de plataforma muito boa, bom desempenho e acesso a um grande número de bibliotecas e ferramentas de suporte.Quase sempre há uma biblioteca, porta ou implementação Java que fará o que você precisa.Não creio que nenhuma outra plataforma tenha o mesmo número de opções;há valor real nessa flexibilidade.

Quanto à modularidade:isso tem mais a ver com como você constrói o software do que com a plataforma que você usa.Não sei muito sobre arquiteturas de plugins como você descreve, mas acho que isso será possível em praticamente qualquer plataforma moderna que você escolher.

Se você planeja desenvolver em python, você sempre pode usar Pires para otimizar algumas das partes mais lentas.

Com minha experiência limitada em Mono, posso dizer que estou bastante convencido disso.O fato de haver um desenvolvimento ativo e muito esforço contínuo para adequá-lo às especificações das mais recentes tecnologias .Net é encorajador.É extremamente útil poder usar as habilidades .Net existentes em várias plataformas.Tive problemas semelhantes com desempenho ao tentar realizar algumas tarefas básicas em Python + PyGTK - talvez elas possam funcionar nas mãos certas, mas é bom não ter que se preocupar com desempenho 90% do tempo.

Para aplicativos de desktop, escrevê-lo em uma linguagem interpretada e usar um kit de ferramentas de interface de usuário multiplataforma como wxWidgets proporcionará um longo caminho em direção à independência de plataforma (você só precisa ter cuidado para não usar quaisquer outros módulos que não sejam multiplataforma , use coisas como Python os.path módulo, em vez de fazer coisas como config_path = "/home/$USER")

Dito isto, para fazer um bom aplicativo multiplataforma, você terá que fazer algumas coisas de maneira diferente em cada plataforma.

Por exemplo, o OS X é provavelmente o mais diferente - as preferências geralmente são armazenadas em ~/Library/Prefernces/ como .plists, as interfaces de usuário geralmente são baseadas em janelas flutuantes, com uma única barra de menu encaixada na parte superior da tela.

Suponho que é aqui que a modularidade entra em jogo.Com o exemplo de preferências acima, você poderia ter uma classe UserConfig, do qual você tem versões específicas do sistema operacional.O Windows armazena dados de configuração no apropriado Application Data pasta ou o registro.O Mac OS usa arquivos .plist em ~/Library/Preferences/, e o unix'y usa ~/.dotfiles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top