Kann WinRT wirklich nur an den Grenzen eingesetzt werden?


15

Microsoft (hauptsächlich Herb Sutter ) empfiehlt bei Verwendung von WinRT mit C ++ / CX, WinRT an den Grenzen der Anwendung zu belassen und den Kern der Anwendung in Standard-ISO-C ++ zu belassen.

Ich habe eine Anwendung geschrieben, die ich portabel lassen möchte, daher wurde meine Kernfunktionalität in Standard-C ++ geschrieben, und ich versuche jetzt, ein Metro-ähnliches Front-End dafür mit C ++ / CX zu schreiben. Ich hatte jedoch ein kleines Problem mit diesem Ansatz. Wenn ich zum Beispiel einen Vektor mit benutzerdefinierten C ++ - Typen in ein XAML-ListView-Steuerelement verschieben möchte, muss ich meinen benutzerdefinierten Typ in einen WinRT-Referenz- / Werttyp einschließen, damit er in einem gespeichert wird Vector^. Bei diesem Ansatz muss ich zwangsläufig einen großen Teil meiner C ++ - Klassen mit WinRT-Klassen umbrechen.

Dies ist das erste Mal, dass ich versucht habe, eine portable native Anwendung in C ++ zu schreiben. Ist es wirklich praktisch, WinRT an diesen Grenzen zu halten? Wie sonst könnte ein solcher tragbarer Kern mit einer plattformspezifischen Grenze gehandhabt werden?


Sowas wie MVVM, wo Model Standard C ++ ist, V und VM WinRT-Interop-Objekte sind?
Max

5
"Aber jede VM verwandelt sich in einen Wrapper um meine Standardmodelle." - Das ist für Ansichtsmodelle in jedem Szenario ziemlich üblich.
MattDavey

1
@GlenH7, ich glaube Kommentare haben dies für mich meistens beantwortet. Ich war zu demselben Schluss gekommen, hoffte aber, dass jemand eine klügere Idee hatte. Im Allgemeinen sind die Dinge so, wie sie sind. Sie können Ihr Bestes tun, um Teile Ihres Codes zu isolieren. In den meisten Fällen müssen Sie jedoch plattformspezifische Teile des Codes neu schreiben (wie in den obigen ViewModel-Beispielen).
Bret Kuhns

1
@ GlenH7 Die einzige Möglichkeit, Ihren Anwendungscode plattformübergreifend konsistent zu halten, besteht darin, eine eigene Plattformabstraktionsschicht zu erstellen. Diese Schichten sollten jedoch das sein, was ich ursprünglich vermeiden wollte. Es bewegt einfach das Problem mit einer Ebenenabstraktion, um Dinge zu isolieren. Vielleicht hilft es, aber am Ende erledigen Sie immer noch die Arbeit.
Bret Kuhns

1
Wir haben einmal versucht, eine "Silberkugel" zu erstellen, um eine C-Bibliothek unter Android nahtlos mit Java zu verbinden. Endlich könnte es funktionieren, nachdem Sie ~ × 10 mehr Zeit aufgewendet und exotische Debugging-Techniken verwendet haben (um das abnormale Verhalten an der Grenze zu umgehen). Auf jeden Fall hat es Spaß gemacht.
Alex Cohn

Antworten:


8

IMHO (alter Programmierer; arbeite bei Microsoft, aber dies ist eine persönliche Meinung): Bevor ich diese Frage beantworten kann, musst du diese andere Frage beantworten:

Wohin bewegt sich der Code? Wenn Sie an einer einzelnen Plattform (in diesem Fall WinRT) festhalten, müssen Sie sich in der Nähe der Plattform befinden - und das bedeutet, dass Sie die vorhandenen Abstraktionen verwenden. In Ihrem Beispiel würde Ihr Code dann Vector ^ verwenden, um die WinRT-Anforderungen zu erfüllen.

OTOH, wenn Sie woanders hinziehen (VMS rockt!), Dann ist standardbasiert sinnvoll.

Angesichts der Tatsache, dass die drei größten portablen, Tablet-ähnlichen Plattformen auf dem Markt unterschiedliche Sprachen für allgemeine Programmieraufgaben verwenden, ist das Verschieben des Codes möglicherweise keine sinnvolle Option.


Genau. Ich habe das Projekt für WinRT gestartet, aber zu wissen, dass Android / iOS attraktive Plattformen sind, auf die portiert werden kann, hat diese Frage aufgeworfen. Ich habe mich seitdem entschlossen, speziell nur gegen WinRT zu schreiben. Wenn das Projekt selbst eine Menschenmenge anzieht, kümmere ich mich dann um die Portierung (oder besser um das Umschreiben auf eine andere Plattform).
Bret Kuhns

Wie @alexcohn betonte, ist es empfehlenswert, portablen Code mit plattformspezifischen Layern zu versehen, wenn die Kernfunktionalität zum Zeitpunkt meiner Entscheidung plattformübergreifend ist. Ansonsten schreibe ich einfach den Code um und verwende Testsuiten, um das Verhalten auf verschiedenen Plattformen zu überprüfen (sofern zutreffend).
Bret Kuhns

0

Sie müssen C ++ / CX nicht verwenden, stattdessen können Sie die WRL ( Windows Runtime Library ) verwenden, die den alten ATL-Vorlagen ähnelt, und nicht C ++, das C ++ / CX ist. Es ist der "Low-Level" -Ansatz von MS, WinRT-Objekte zu konsumieren, und es ist vollständig Standard-C ++, wie Grandad es zum Schreiben verwendet hat!

Es ist vielleicht nicht so "nett" wie C ++ / CX, aber das ist Ansichtssache - meine persönliche Meinung ist, dass C ++ / CX der dritte Versuch eines erweiterten C ++ ist und ein dritter Fehler. Ignoriere es und hoffe, es geht genauso wie die anderen 2 Inkarnationen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.