Czy WinRT można naprawdę używać tylko na granicy?

15

Microsoft (głównie Herb Sutter ) zaleca używanie WinRT z C ++ / CX, aby utrzymać WinRT na granicy aplikacji i zachować rdzeń aplikacji napisany w standardowym ISO C ++.

Piszę aplikację, którą chciałbym pozostawić przenośną, więc moja podstawowa funkcjonalność została napisana w standardowym C ++, a teraz próbuję napisać dla niej interfejs w stylu Metro przy użyciu C ++ / CX. Miałem jednak pewien problem z tym podejściem. Na przykład, jeśli chcę wcisnąć wektor typów C ++ zdefiniowanych przez użytkownika do kontrolki XAML ListView, muszę zawinąć mój typ zdefiniowany przez użytkownika w typ wartości referencyjnej / wartości WinRT, aby mógł zostać zapisany w pliku Vector^. Dzięki takiemu podejściu nieuchronnie pozostawiam owijanie dużej części moich klas C ++ klasami WinRT.

Po raz pierwszy próbuję napisać przenośną natywną aplikację w C ++. Czy naprawdę praktyczne jest utrzymywanie WinRT wzdłuż takich granic? Jak inaczej można poradzić sobie z tym rodzajem przenośnego rdzenia z granicami specyficznymi dla platformy?

Bret Kuhns
źródło
Coś w stylu MVVM, gdzie Model jest standardem C ++, V i VM to obiekty międzyoperacyjne WinRT?
Maks.
5
„ale każda maszyna wirtualna skutecznie zamienia się w opakowanie wokół moich standardowych modeli”. - jest to dość powszechne w przypadku modeli widoku w dowolnym scenariuszu.
MattDavey,
1
@ GlenH7, myślę, że komentarze w większości odpowiedziały na to dla mnie. Doszedłem do tego samego wniosku, ale miałem nadzieję, że ktoś wpadnie na pomysł. Ogólnie rzecz biorąc, rzeczy są po prostu takie, jakie są. Możesz dołożyć wszelkich starań, aby wyizolować fragmenty kodu, ale w większości przypadków będziesz musiał przepisać fragmenty kodu specyficzne dla platformy (na przykład w powyższych przykładach ViewModel).
Bret Kuhns,
1
@ GlenH7 Być może jedynym sposobem na zachowanie spójności kodu aplikacji na różnych platformach jest napisanie własnej warstwy abstrakcji platformy, ale te warstwy ostatecznie będą tym, czego starałem się uniknąć. To po prostu przenoszenie problemu z abstrakcją warstwy w celu odizolowania rzeczy. Być może pomaga, ale w końcu nadal pracujesz.
Bret Kuhns,
1
Próbowaliśmy kiedyś stworzyć „srebrną kulę”, aby bezproblemowo przykleić bibliotekę C do Javy na Androidzie. Wreszcie może działać, po spędzeniu ~ 10 razy więcej czasu i zastosowaniu egzotycznych technik debugowania (aby obejść nieprawidłowe zachowanie na granicy). Zdecydowanie było fajnie.
Alex Cohn

Odpowiedzi:

8

IMHO (stary programista; pracuj w firmie Microsoft, ale to jest osobista opinia): zanim będę mógł odpowiedzieć na to pytanie, musisz odpowiedzieć na inne pytanie:

Dokąd przenosi się kod? Jeśli trzymasz się jednej platformy (w tym przypadku WinRT), bądź blisko niej - a to oznacza używanie istniejących abstrakcji. Na przykład Twój kod użyłby Vector ^ w celu dopasowania do potrzeb WinRT.

OTOH, jeśli przeprowadzasz się gdzieś indziej (VMS rock!), To oparte na standardach ma sens.

Biorąc pod uwagę, że trzy największe przenośne platformy typu tablet na rynku używają różnych języków do typowych zadań programistycznych, przeniesienie kodu może nie być cenną opcją.

PESMITH_MSFT
źródło
Zgadzam się. Rozpocząłem projekt ukierunkowany na WinRT, ale znajomość Androida / iOS byłaby atrakcyjną platformą do przeniesienia, co skłoniło to pytanie. Od tamtej pory postanowiłem pisać tylko przeciwko WinRT. Jeśli sam projekt przyciągnie tłum, będę się martwił o przeniesienie (a raczej przepisanie na inną platformę).
Bret Kuhns
Jak wskazał @alexcohn, jeśli podstawowa funkcjonalność jest wystarczająco duża w momencie, gdy zdecyduję się przejść na inną platformę, warto opakowac przenośny kod warstwami specyficznymi dla platformy. W przeciwnym razie po prostu przepiszę kod i użyję pakietów testowych, aby zweryfikować zachowanie na różnych platformach (w stosownych przypadkach).
Bret Kuhns
0

Nie musisz używać C ++ / CX, zamiast tego możesz użyć WRL ( Windows Runtime Library ), która przypomina stare szablony ATL, a nie „udawać” C ++, czyli C ++ / CX. Jest to podejście „niskiego poziomu” od MS do używania obiektów WinRT i jest całkowicie standardowym C ++, jak pisał Grandad!

To może nie być tak „ładne” jak C ++ / CX, ale to kwestia opinii - moim osobistym zdaniem jest to, że C ++ / CX jest trzecią próbą rozszerzonego C ++ i jest trzecią porażką. Zignoruj ​​to i miej nadzieję, że pójdzie tak samo, jak pozostałe 2 inkarnacje.

gbjbaanb
źródło