Bisakah WinRT benar-benar digunakan hanya pada batas?

15

Microsoft (terutama, Herb Sutter ) merekomendasikan ketika menggunakan WinRT dengan C ++ / CX untuk menjaga WinRT pada batas-batas aplikasi dan menjaga inti aplikasi ditulis dalam standar ISO C ++.

Saya telah menulis sebuah aplikasi yang ingin saya tinggalkan portabel, jadi fungsionalitas inti saya ditulis dalam standar C ++, dan saya sekarang mencoba untuk menulis front-style Metro untuk itu menggunakan C ++ / CX. Namun, saya punya sedikit masalah dengan pendekatan ini. Misalnya, jika saya ingin mendorong vektor tipe C ++ yang ditentukan pengguna ke kontrol XAML ListView, saya harus membungkus tipe yang ditentukan pengguna dalam tipe ref / nilai WinRT agar dapat disimpan dalam a Vector^. Dengan pendekatan ini, saya mau tidak mau membungkus sebagian besar kelas C ++ saya dengan kelas WinRT.

Ini adalah pertama kalinya saya mencoba menulis aplikasi asli portabel di C ++. Apakah benar-benar praktis untuk menjaga WinRT di sepanjang batas seperti ini? Bagaimana lagi jenis inti portabel ini dengan batasan platform khusus dapat ditangani?

Bruh Kuhns
sumber
Sesuatu seperti MVVM, di mana Model adalah standar C ++, V dan VM adalah objek interop WinRT?
Maks.
5
"tetapi setiap VM secara efektif berubah menjadi pembungkus di sekitar model standar saya." - itu cukup umum untuk model tampilan dalam skenario apa pun.
MattDavey
1
@ GlenH7, saya yakin komentar sebagian besar menjawab ini untuk saya. Saya telah mencapai kesimpulan yang sama, tetapi berharap seseorang memiliki ide yang lebih cerdas. Secara umum, hal-hal seperti itu adanya. Anda dapat melakukan yang terbaik untuk mengisolasi bagian-bagian kode Anda, tetapi untuk sebagian besar bagian Anda pada akhirnya perlu menulis ulang bagian-bagian platform yang spesifik dari kode (seperti dalam contoh-contoh ViewModel di atas).
Bret Kuhns
1
@ GlenH7 Mungkin satu-satunya cara untuk menjaga kode aplikasi Anda konsisten di seluruh platform adalah dengan menulis lapisan abstraksi platform Anda sendiri, tetapi lapisan-lapisan itu pada akhirnya akan menjadi apa yang saya coba hindari di tempat pertama. Ini hanya memindahkan masalah dengan abstraksi layer untuk mengisolasi sesuatu. Mungkin membantu, tetapi pada akhirnya Anda masih melakukan pekerjaan.
Bret Kuhns
1
Kami mencoba sekali untuk membuat "peluru perak" untuk merekatkan perpustakaan C ke Java di Android. Akhirnya bisa bekerja, setelah menghabiskan ~ × 10 lebih banyak waktu dan menggunakan teknik debugging eksotis (untuk mengatasi perilaku abnormal di perbatasan). Jelas, itu menyenangkan.
Alex Cohn

Jawaban:

8

IMHO (programmer lama; bekerja di Microsoft tetapi ini adalah pendapat pribadi): sebelum saya dapat menjawab pertanyaan ini, Anda harus menjawab pertanyaan lain ini:

Di mana kode dipindahkan? Jika Anda tetap menggunakan satu platform (dalam hal ini, WinRT), maka dekatlah dengan platform - dan itu berarti menggunakan abstraksi yang ada. Per contoh Anda, kode Anda kemudian akan menggunakan Vektor ^ agar sesuai dengan kebutuhan WinRT.

OTOH, jika Anda pindah ke tempat lain (VMS rocks!), Maka standar berdasarkan masuk akal.

Mengingat bahwa tiga platform portable, seperti tablet terbesar di pasar semuanya menggunakan bahasa yang berbeda untuk tugas pemrograman umum, memindahkan kode mungkin bukan opsi yang berharga.

PESMITH_MSFT
sumber
Saya setuju. Saya memulai proyek yang menargetkan WinRT, tetapi mengetahui Android / iOS akan menjadi platform yang menarik untuk ditelusuri, yang mendorong pertanyaan ini. Saya sejak itu memutuskan untuk menulis secara khusus terhadap WinRT saja. Jika proyek itu sendiri menarik banyak orang, saya akan khawatir tentang porting (atau lebih tepatnya, menulis ulang ke platform lain).
Bret Kuhns
Seperti @alexcohn tunjukkan, jika fungsionalitas inti cukup berat pada saat saya memutuskan untuk pergi lintas platform, maka itu akan layak untuk membungkus kode portabel dengan lapisan platform spesifik. Kalau tidak, saya hanya akan menulis ulang kode dan menggunakan test suites untuk memverifikasi perilaku di berbagai platform (jika perlu).
Bret Kuhns
0

Anda tidak harus menggunakan C ++ / CX, sebagai gantinya Anda dapat menggunakan WRL ( Windows Runtime Library ) yang seperti templat ATL lama, bukan C + / pura-pura 'yang merupakan C ++ / CX. Ini adalah pendekatan "tingkat rendah" dari MS untuk mengkonsumsi objek WinRT dan sepenuhnya standar C ++ seperti yang digunakan Grandad untuk menulis!

Mungkin tidak sebagus C ++ / CX tapi itu masalah pendapat - pendapat pribadi saya adalah bahwa C ++ / CX adalah upaya ke-3 pada perluasan C ++, dan merupakan kegagalan ke-3. Abaikan dan harap itu berjalan dengan cara yang sama seperti 2 inkarnasi lainnya.

gbjbaanb
sumber