WinRT può davvero essere usato solo ai confini?


15

Microsoft (principalmente, Herb Sutter ) consiglia quando si utilizza WinRT con C ++ / CX per mantenere WinRT ai limiti dell'applicazione e mantenere il nucleo dell'applicazione scritto nello standard ISO C ++.

Sto scrivendo un'applicazione che vorrei lasciare portatile, quindi la mia funzionalità principale è stata scritta in C ++ standard e ora sto provando a scrivere un front-end in stile Metro usando C ++ / CX. Tuttavia, ho avuto un po 'di problemi con questo approccio. Ad esempio, se voglio trasferire un vettore di tipi C ++ definiti dall'utente in un controllo ListView XAML, devo racchiudere il mio tipo definito dall'utente in un tipo ref / value WinRT per poterlo archiviare in a Vector^. Con questo approccio, mi rimane inevitabilmente il wrapping di gran parte delle mie classi C ++ con classi WinRT.

Questa è la prima volta che ho provato a scrivere un'applicazione nativa portatile in C ++. È davvero pratico mantenere WinRT lungo i limiti in questo modo? In quale altro modo potrebbe essere gestito questo tipo di core portatile con un limite specifico della piattaforma?


Qualcosa come MVVM, dove Model è standard C ++, V e VM sono oggetti di interoperabilità WinRT?
Max

5
"ma ogni VM si trasforma effettivamente in un wrapper attorno ai miei modelli standard." - è abbastanza comune per visualizzare i modelli in qualsiasi scenario.
MattDavey,

1
@ GlenH7, credo che i commenti abbiano risposto principalmente a questo per me. Avevo raggiunto la stessa conclusione, ma speravo che qualcuno avesse in mente un'idea più intelligente. In generale, le cose sono come sono. Puoi fare del tuo meglio per isolare parti del codice, ma per la maggior parte finirai per dover riscrivere parti del codice specifiche della piattaforma (come negli esempi ViewModel sopra).
Bret Kuhns,

1
@ GlenH7 Forse l'unico modo per mantenere coerente il codice dell'applicazione su tutte le piattaforme è scrivere il proprio livello di astrazione della piattaforma, ma quei livelli finiranno per essere ciò che stavo cercando di evitare in primo luogo. Sta semplicemente spostando il problema con un'astrazione a strati per isolare le cose. Forse aiuta, ma alla fine stai ancora facendo il lavoro.
Bret Kuhns,

1
Abbiamo provato una volta a creare un "proiettile d'argento" per incollare senza problemi una libreria C su Java su Android. Finalmente potrebbe funzionare, dopo aver trascorso ~ × 10 più tempo e usando tecniche di debug esotiche (per aggirare il comportamento anomalo alla frontiera). Sicuramente è stato divertente.
Alex Cohn,

Risposte:


8

IMHO (vecchio programmatore; lavora in Microsoft ma questa è un'opinione personale): prima di poter rispondere a questa domanda, devi rispondere a questa altra domanda:

Dove si sposta il codice? Se stai attaccando con una singola piattaforma (in questo caso, WinRT), allora sii vicino alla piattaforma - e questo significa usare le astrazioni esistenti. Per il tuo esempio, il tuo codice userebbe Vector ^ per soddisfare le esigenze di WinRT.

OTOH, se ti stai spostando altrove (rocce VMS!), Allora gli standard basati hanno senso.

Dato che le tre più grandi piattaforme portatili e tablet sul mercato utilizzano tutti linguaggi diversi per attività di programmazione comuni, spostare il codice potrebbe non essere un'opzione preziosa.


Sono d'accordo. Ho iniziato il progetto con WinRT, ma sapere che Android / iOS sarebbe stata una piattaforma attraente da portare, il che ha portato a questa domanda. Da allora ho deciso di scrivere specificamente solo su WinRT. Se il progetto stesso attira una folla, mi preoccuperò del porting (o meglio della riscrittura su un'altra piattaforma).
Bret Kuhns,

Come ha sottolineato @alexcohn, se la funzionalità di base è abbastanza pesante al momento che decido di passare multipiattaforma, varrà la pena racchiudere il codice portatile con livelli specifici della piattaforma. Altrimenti, riscriverò semplicemente il codice e userò le suite di test per verificare il comportamento su piattaforme diverse (ove appropriato).
Bret Kuhns,

0

Non è necessario utilizzare C ++ / CX, ma è possibile utilizzare il WRL ( Windows Runtime Library ) che è come i vecchi modelli ATL, non il C ++ "fingere" che è C ++ / CX. È l'approccio "di basso livello" di MS al consumo di oggetti WinRT ed è completamente standard C ++ come scriveva Grandad!

Potrebbe non essere "bello" come C ++ / CX ma è una questione di opinione - la mia opinione personale è che C ++ / CX è il terzo tentativo di un C ++ esteso ed è un terzo fallimento. Ignoralo e spero che vada allo stesso modo delle altre 2 incarnazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.