O WinRT pode realmente ser usado apenas nos limites?


15

A Microsoft (principalmente, Herb Sutter ) recomenda ao usar o WinRT com C ++ / CX para manter o WinRT nos limites do aplicativo e manter o núcleo do aplicativo escrito no padrão ISO C ++.

Como eu escrevi um aplicativo que gostaria de deixar portátil, minha funcionalidade principal foi escrita em C ++ padrão e agora estou tentando escrever um front end no estilo Metro para ele usando C ++ / CX. No entanto, tive um problema com essa abordagem. Por exemplo, se eu quiser enviar por push um vetor de tipos C ++ definidos pelo usuário para um controle XAML ListView, preciso envolver meu tipo definido pelo usuário em um tipo de ref / value do WinRT para que ele seja armazenado em a Vector^. Com essa abordagem, inevitavelmente fico envolvida em grande parte das minhas classes C ++ nas classes WinRT.

Esta é a primeira vez que tentei escrever um aplicativo nativo portátil em C ++. É realmente prático manter o WinRT dentro dos limites como este? De que outra forma esse tipo de núcleo portátil com um limite específico de plataforma pode ser tratado?


Algo como MVVM, onde Model é padrão C ++, V e VM são objetos de interoperabilidade WinRT?
Max

5
"mas cada VM efetivamente se transforma em um invólucro em torno dos meus modelos padrão". - isso é bastante comum para visualizar modelos em qualquer cenário.
MattDavey

1
@ GlenH7, acredito que os comentários responderam principalmente a isso para mim. Eu tinha chegado à mesma conclusão, mas esperava que alguém tivesse uma ideia mais inteligente em mente. Em geral, as coisas são do jeito que são. Você pode fazer o possível para isolar partes do seu código, mas na maioria das vezes você precisará reescrever partes específicas do plataforma (como nos exemplos do ViewModel acima).
Bret Kuhns

1
@ GlenH7 Talvez a única maneira de manter o código do aplicativo consistente entre plataformas seja escrever sua própria camada de abstração de plataforma, mas essas camadas acabarão sendo o que eu estava tentando evitar em primeiro lugar. É simplesmente mudar o problema com uma abstração de camada para isolar as coisas. Talvez ajude, mas no final você ainda está fazendo o trabalho.
Bret Kuhns

1
Tentamos criar uma "bala de prata" para colar perfeitamente uma biblioteca C no Java no Android. Finalmente, ele poderia funcionar, depois de gastar mais de 10 vezes e usando técnicas de depuração exóticas (para solucionar o comportamento anormal na fronteira). Definitivamente, foi divertido.
Alex Cohn

Respostas:


8

IMHO (programador antigo; trabalho na Microsoft, mas esta é uma opinião pessoal): antes que eu possa responder a essa pergunta, você deve responder a outra pergunta:

Para onde o código está indo? Se você estiver usando uma única plataforma (neste caso, o WinRT), esteja próximo da plataforma - e isso significa usar as abstrações existentes. Por seu exemplo, seu código usaria Vector ^ para corresponder às necessidades do WinRT.

OTOH, se você estiver se mudando para outro lugar (o VMS é demais!), Então os padrões baseados fazem sentido.

Dado que as três maiores plataformas portáteis semelhantes a tablets do mercado usam linguagens diferentes para tarefas comuns de programação, mover o código pode não ser uma opção valiosa.


Concordo. Comecei o projeto visando o WinRT, mas saber que o Android / iOS seria uma plataforma atraente para se portar, o que levou a essa pergunta. Desde então, decidi escrever especificamente apenas contra o WinRT. Se o projeto em si atrai uma multidão, vou me preocupar em portar (ou melhor, reescrever para outra plataforma).
Bret Kuhns

Como @alexcohn apontou, se a funcionalidade principal for pesada o suficiente no momento em que eu decidir ir entre plataformas, valerá a pena agrupar o código portátil com camadas específicas da plataforma. Caso contrário, apenas reescreverei o código e usarei os conjuntos de testes para verificar o comportamento em diferentes plataformas (onde apropriado).
Bret Kuhns 14/10/12

0

Você não precisa usar C ++ / CX; em vez disso, pode usar o WRL ( Windows Runtime Library ), que é como os modelos ATL antigos, não o C ++ 'fingido' que é C ++ / CX. É a abordagem de "baixo nível" da MS para consumir objetos WinRT e é completamente C ++ padrão como o Grandad costumava escrever!

Pode não ser tão "legal" quanto o C ++ / CX, mas isso é uma questão de opinião - minha opinião pessoal é que o C ++ / CX é a terceira tentativa de um C ++ estendido e é uma terceira falha. Ignore-o e espere que seja da mesma maneira que as outras 2 encarnações.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.