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?

Bret Kuhns
fonte
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.

PESMITH_MSFT
fonte
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.

gbjbaanb
fonte