Чи можна реально використовувати WinRT лише на межах?


15

Microsoft (головним чином, Herb Sutter ) рекомендує при використанні WinRT з C ++ / CX тримати WinRT на межах програми та зберігати ядро ​​програми, написане в стандарті ISO C ++.

Я писав програму, яку хотів би залишити портативною, тому основна функціональність була написана на стандартній мові C ++, і я зараз намагаюся написати передній кінець в стилі метро за допомогою C ++ / CX. Однак у мене з цим підходом були певні проблеми. Наприклад, якщо я хочу перенести вектор визначених користувачем типів C ++ до елемента керування XAML ListView, я повинен загортати визначений користувачем тип у тип refR / значення WinRT, щоб він міг зберігатись у Vector^. При такому підході мені неминуче залишається обгортання значної частини моїх C ++ класів з класами WinRT.

Це перший раз, коли я намагався написати портативну нативну програму на C ++. Чи реально тримати WinRT уздовж таких меж? Як інакше можна було б обробляти цей тип переносного сердечника з певною платформою?


Щось на зразок MVVM, де Model є стандартним C ++, V і VM - це об'єкти WinRT interop?
Макс

5
"але кожен VM ефективно перетворюється на обгортку навколо моїх стандартних моделей." - це досить часто для перегляду моделей у будь-якому сценарії.
MattDavey

1
@ GlenH7, я вважаю, що коментарі здебільшого відповіли на мене. Я дійшов такого ж висновку, але сподівався, що хтось має на увазі розумнішу думку. Загалом, все відбувається саме так, як є. Ви можете зробити все можливе, щоб ізолювати частини свого коду, але здебільшого вам знадобиться переписати окремі для платформи частини коду (наприклад, у прикладах ViewModel вище).
Bret Kuhns

1
@ GlenH7 Мабуть, єдиним способом збереження коду програми на всіх платформах є написання власного шару абстракції платформи, але ці шари в кінцевому підсумку стануть тим, чого я намагався уникнути. Це просто переміщення проблеми навколо абстрагування шару для ізоляції речей. Можливо, допомагає, але врешті-решт ти все-таки робиш роботу.
Брет Кунз

1
Один раз ми намагалися створити «срібну кулю», щоб легко склеїти бібліотеку С на Java на Android. Нарешті, це може спрацювати, витративши ~ × 10 більше часу та використовуючи екзотичні методи налагодження (щоб подолати ненормальну поведінку на кордоні). Однозначно, було весело.
Алекс Кон

Відповіді:


8

IMHO (старий програміст; працюйте в Microsoft, але це особиста думка): перш ніж я зможу відповісти на це запитання, ви повинні відповісти на це інше питання:

Куди рухається код? Якщо ви дотримуєтесь однієї платформи (у цьому випадку WinRT), то будьте близько до платформи - а це означає використовувати існуючі абстракції. Згідно з вашим прикладом, ваш код використовує вектор ^ для того, щоб відповідати потребам WinRT.

ОТО, якщо ви переїжджаєте кудись інше (VMS скелі!), То стандарти, що базуються, мають сенс.

Враховуючи, що три найбільші портативні платформи, подібні до планшетів на ринку, всі використовують різні мови для поширених завдань програмування, переміщення коду може бути не цінним варіантом.


Я згоден. Я розпочав проект, орієнтований на WinRT, але знання Android / iOS було б привабливою платформою для порту, що і спонукало це питання. З того часу я вирішив писати спеціально лише для WinRT. Якщо сам проект залучає натовп, то я переживаю за перенесення (а точніше, переписування на іншу платформу).
Bret Kuhns

Як зазначав @alexcohn, якщо функціональність ядра досить важка на той момент, коли я вирішу перейти на крос-платформу, тоді варто обернути переносний код з певними шарами платформи. В іншому випадку я просто перепишу код і використовую тестові набори для перевірки поведінки на різних платформах (де це доречно).
Брет Кунс

0

Вам не доведеться використовувати C ++ / CX, натомість ви можете використовувати WRL ( Бібліотека часу виконання Windows ), яка подібна до старих шаблонів ATL, а не "прикидається" C ++, що є C ++ / CX. Це "низький рівень" підходу від MS до споживання об'єктів WinRT і цілком стандартний C ++, як Grandad використовував для написання!

Це може бути не настільки «приємно», як C ++ / CX, але це питання думки - моя особиста думка полягає в тому, що C ++ / CX є 3-ю спробою розширеного C ++ і є 3-ю недоліком. Ігноруйте це і сподівайтеся, що він піде так само, як і інші два втілення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.