¿Puede WinRT realmente usarse solo en los límites?

15

Microsoft (principalmente, Herb Sutter ) recomienda utilizar WinRT con C ++ / CX para mantener WinRT en los límites de la aplicación y mantener el núcleo de la aplicación escrito en ISO C ++ estándar.

He estado escribiendo una aplicación que me gustaría dejar portátil, por lo que mi funcionalidad principal se escribió en C ++ estándar, y ahora estoy intentando escribir un front-end de estilo Metro usando C ++ / CX. Sin embargo, he tenido un pequeño problema con este enfoque. Por ejemplo, si quiero insertar un vector de tipos C ++ definidos por el usuario en un control XAML ListView, tengo que ajustar mi tipo definido por el usuario en un tipo de valor / ref WinRT para que se almacene en un Vector^. Con este enfoque, inevitablemente me queda envolver una gran parte de mis clases de C ++ con las clases de WinRT.

Esta es la primera vez que intento escribir una aplicación nativa portátil en C ++. ¿Es realmente práctico mantener WinRT a lo largo de los límites como este? ¿De qué otra forma podría manejarse este tipo de núcleo portátil con un límite específico de plataforma?

Bret Kuhns
fuente
Algo así como MVVM, donde el Modelo es estándar C ++, V y VM son objetos de interoperabilidad WinRT?
Max
55
"pero cada VM se convierte efectivamente en un contenedor alrededor de mis modelos estándar". - Eso es bastante común para ver modelos en cualquier escenario.
MattDavey
1
@ GlenH7, creo que los comentarios me han respondido principalmente. Llegué a la misma conclusión, pero esperaba que alguien tuviera una idea más inteligente en mente. En general, las cosas son como son. Puede hacer todo lo posible para aislar porciones de su código, pero en su mayor parte terminará necesitando reescribir porciones específicas del código de la plataforma (como en los ejemplos de ViewModel anteriores).
Bret Kuhns
1
@ GlenH7 Quizás la única forma de mantener el código de su aplicación consistente en todas las plataformas es escribir su propia capa de abstracción de plataforma, pero esas capas terminarán siendo lo que estaba tratando de evitar en primer lugar. Simplemente está moviendo el problema con una abstracción de capa para aislar las cosas. Quizás ayude, pero al final todavía estás haciendo el trabajo.
Bret Kuhns
1
Una vez intentamos crear una "viñeta plateada" para pegar sin problemas una biblioteca C a Java en Android. Finalmente, podría funcionar, después de pasar ~ × 10 más tiempo y usar técnicas de depuración exóticas (para evitar el comportamiento anormal en la frontera). Definitivamente, fue divertido.
Alex Cohn

Respuestas:

8

En mi humilde opinión (antiguo programador; trabajo en Microsoft, pero esta es una opinión personal): antes de que pueda responder a esta pregunta, debe responder esta otra pregunta:

¿A dónde se mueve el código? Si se queda con una sola plataforma (en este caso, WinRT), entonces esté cerca de la plataforma, y ​​eso significa usar las abstracciones existentes. Según su ejemplo, su código usaría Vector ^ para coincidir con las necesidades de WinRT.

OTOH, si te mudas a otro lugar (¡VMS es genial!), Entonces los basados ​​en estándares tienen sentido.

Dado que las tres plataformas portátiles más grandes, similares a tabletas en el mercado, usan diferentes lenguajes para tareas de programación comunes, mover el código podría no ser una opción valiosa.

PESMITH_MSFT
fuente
Estoy de acuerdo. Comencé el proyecto dirigido a WinRT, pero sabiendo que Android / iOS serían plataformas atractivas para portar, lo que provocó esta pregunta. Desde entonces he decidido escribir específicamente contra WinRT solamente. Si el proyecto en sí mismo atrae a una multitud, me preocuparé por la portabilidad (o más bien, reescribir en otra plataforma) entonces.
Bret Kuhns
Como señaló @alexcohn, si la funcionalidad principal es lo suficientemente pesada en el momento en que decido ir multiplataforma, entonces valdrá la pena envolver el código portátil con capas específicas de la plataforma. De lo contrario, volveré a escribir el código y usaré suites de prueba para verificar el comportamiento en diferentes plataformas (cuando corresponda).
Bret Kuhns
0

No tiene que usar C ++ / CX, en su lugar puede usar la WRL ( Biblioteca de tiempo de ejecución de Windows ) que es como las plantillas ATL antiguas, no el C ++ 'simulado' que es C ++ / CX. ¡Es el enfoque de "bajo nivel" de MS para consumir objetos WinRT y es completamente estándar C ++ como solía escribir Grandad!

Puede que no sea tan "agradable" como C ++ / CX, pero eso es una cuestión de opinión: mi opinión personal es que C ++ / CX es el tercer intento en un C ++ extendido, y es un tercer fracaso. Ignóralo y espera que siga el mismo camino que las otras 2 encarnaciones.

gbjbaanb
fuente