WinRT สามารถใช้งานได้จริงในขอบเขตหรือไม่?


15

Microsoft (ส่วนใหญ่Herb Sutter ) แนะนำให้ใช้เมื่อใช้ WinRT กับ C ++ / CX เพื่อให้ WinRT อยู่ในขอบเขตของแอปพลิเคชันและเก็บแกนหลักของแอปพลิเคชันที่เขียนด้วย ISO C ++ มาตรฐาน

ฉันกำลังเขียนแอปพลิเคชันที่ฉันต้องการออกจากระบบพกพาดังนั้นฟังก์ชั่นหลักของฉันจึงถูกเขียนด้วยมาตรฐาน C ++ และตอนนี้ฉันกำลังพยายามเขียนส่วนหน้าแบบเมโทรโดยใช้ C ++ / CX อย่างไรก็ตามฉันมีปัญหาเล็กน้อยเกี่ยวกับวิธีการนี้ ตัวอย่างเช่นถ้าผมต้องการที่จะผลักดันเวกเตอร์ของผู้ใช้กำหนด c ++ ประเภทเพื่อการควบคุม XAML ListView ผมต้องห่อของฉันประเภทที่ผู้ใช้กำหนดใน WinRT ประเภทเตะ / Vector^ค่าให้มันถูกเก็บไว้ใน ด้วยวิธีการนี้ทำให้ฉันต้องทิ้งคลาส C ++ ส่วนใหญ่ไว้กับคลาส WinRT อย่างหลีกเลี่ยงไม่ได้

นี่เป็นครั้งแรกที่ฉันพยายามเขียนแอปพลิเคชันเนทีฟแบบพกพาใน C ++ การใช้ WinRT เป็นไปตามขอบเขตเช่นนี้จริงหรือไม่? แกนแบบพกพาประเภทนี้ที่มีขอบเขตเฉพาะแพลตฟอร์มจะจัดการได้อย่างไร


บางอย่างเช่น MVVM ซึ่งรุ่นคือมาตรฐาน C ++, V และ VM เป็นวัตถุการทำงานร่วมกันของ WinRT?
สูงสุด

5
"แต่ VM แต่ละเครื่องจะเปลี่ยนเป็นเสื้อคลุมรอบรุ่นมาตรฐานของฉันได้อย่างมีประสิทธิภาพ" - เป็นเรื่องธรรมดาสำหรับโมเดลการดูในทุกสถานการณ์
MattDavey

1
@ GlenH7 ฉันเชื่อว่าความคิดเห็นส่วนใหญ่ตอบกลับมาแล้วสำหรับฉัน ฉันได้ข้อสรุปเดียวกัน แต่หวังว่าจะมีใครบางคนมีความคิดที่ฉลาดกว่าอยู่ในใจ โดยทั่วไปสิ่งต่าง ๆ เป็นอย่างที่เป็นอยู่ คุณสามารถทำให้ดีที่สุดเพื่อแยกส่วนของรหัสของคุณ แต่ส่วนใหญ่คุณจะต้องเขียนส่วนเฉพาะของแพลตฟอร์มของรหัส (เช่นในตัวอย่าง ViewModel ด้านบน)
Bret Kuhns

1
@ GlenH7 บางทีวิธีเดียวที่จะทำให้รหัสแอปพลิเคชันของคุณสอดคล้องกันในหลายแพลตฟอร์มคือการเขียนเลเยอร์สิ่งที่เป็นนามธรรมของแพลตฟอร์มของคุณเอง แต่เลเยอร์เหล่านั้นจะเป็นสิ่งที่ฉันพยายามหลีกเลี่ยงตั้งแต่แรก มันเป็นเพียงการเคลื่อนย้ายปัญหารอบ ๆ ด้วยนามธรรม abstraction เพื่อแยกสิ่งต่าง ๆ อาจช่วยได้ แต่ในที่สุดคุณก็ยังทำงานอยู่
Bret Kuhns

1
เราพยายามหนึ่งครั้งเพื่อสร้าง "กระสุนเงิน" เพื่อประสานไลบรารี C กับ Java บน Android ได้อย่างราบรื่น ในที่สุดมันก็สามารถทำงานได้หลังจากใช้เวลามากขึ้น ~ 10 เท่าและใช้เทคนิคการดีบักที่แปลกใหม่ แน่นอนมันสนุก
Alex Cohn

คำตอบ:


8

IMHO (โปรแกรมเมอร์เก่าทำงานที่ Microsoft แต่นี่เป็นความเห็นส่วนตัว): ก่อนที่ฉันจะตอบคำถามนี้ได้คุณต้องถามคำถามอื่นก่อน:

รหัสย้ายไปอยู่ที่ไหน หากคุณติดอยู่กับแพลตฟอร์มเดียว (ในกรณีนี้คือ WinRT) ให้อยู่ใกล้กับแพลตฟอร์ม - และนั่นหมายถึงการใช้ abstractions ที่มีอยู่ ตามตัวอย่างของคุณรหัสของคุณจะใช้ Vector ^ เพื่อให้ตรงกับความต้องการของ WinRT

OTOH ถ้าคุณกำลังย้ายไปที่อื่น (VMS หิน!) แล้วตามมาตรฐานทำให้รู้สึก

เนื่องจากแพลตฟอร์มแท็บเล็ตที่ใหญ่ที่สุดทั้งสามแบบพกพาในตลาดใช้ภาษาต่าง ๆ สำหรับงานเขียนโปรแกรมทั่วไปการย้ายรหัสอาจไม่ใช่ตัวเลือกที่มีค่า


ฉันเห็นด้วย. ฉันเริ่มต้นโครงการที่กำหนดเป้าหมาย WinRT แต่การรู้ว่า Android / iOS เป็นแพลตฟอร์มที่น่าดึงดูดสำหรับพอร์ต ฉันตัดสินใจที่จะเขียนเฉพาะกับ WinRT เท่านั้น หากโครงการดึงดูดผู้คนจำนวนมากฉันจะกังวลเกี่ยวกับการย้ายพอร์ต (หรือมากกว่านั้นเขียนใหม่ไปยังแพลตฟอร์มอื่น)
Bret Kuhns

@alexcohn ชี้ให้เห็นว่าถ้าฟังก์ชั่นหลักหนักพอในเวลาที่ฉันตัดสินใจที่จะข้ามแพลตฟอร์มมันจะคุ้มค่าที่จะห่อโค้ดแบบพกพาด้วยเลเยอร์เฉพาะแพลตฟอร์ม มิฉะนั้นฉันจะเขียนรหัสใหม่และใช้ชุดทดสอบเพื่อตรวจสอบพฤติกรรมบนแพลตฟอร์มต่างๆ (ตามความเหมาะสม)
Bret Kuhns

0

คุณไม่จำเป็นต้องใช้ C ++ / CX แต่คุณสามารถใช้ WRL ( Windows Runtime Library ) ซึ่งเหมือนกับเทมเพลต ATL แบบเก่าไม่ใช่ C ++ / CX แกล้งทำเป็น 'แกล้ง' มันใช้วิธี "ระดับต่ำ" จาก MS ไปจนถึงการใช้วัตถุ WinRT และเป็นมาตรฐาน C ++ อย่างสมบูรณ์เช่น Grandad ที่ใช้ในการเขียน!

มันอาจจะไม่ "ดี" เป็น C ++ / CX แต่นั่นเป็นเรื่องของความเห็น - ความเห็นส่วนตัวของฉันคือ C ++ / CX เป็นความพยายามครั้งที่ 3 ที่ขยาย C ++ และเป็นความล้มเหลวครั้งที่สาม ไม่ต้องสนใจและหวังว่ามันจะเป็นเช่นเดียวกับอีก 2 แปลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.