WinRT gerçekten sadece sınırlarda kullanılabilir mi?


15

Microsoft (başlıca Herb Herbter ) , WinRT'yi uygulamanın sınırlarında tutmak ve standart ISO C ++ ile yazılmış uygulamanın çekirdeğini tutmak için WinRT'yi C ++ / CX ile kullanmanızı önerir.

Taşınabilir bırakmak istediğim bir uygulama yazıyorum, bu yüzden temel işlevselliğim standart C ++ ile yazılmış ve şimdi C ++ / CX kullanarak bunun için Metro tarzı bir ön uç yazmaya çalışıyorum. Ancak bu yaklaşımla ilgili bir sorun yaşadım. Örneğin, kullanıcı tanımlı C ++ türlerinin bir vektörünü XAML ListView denetimine iletmek istiyorsam, kullanıcı tanımlı türümü bir WinRT ref / değer türünde a Vector^. Bu yaklaşımla, kaçınılmaz olarak C ++ sınıflarımın büyük bir bölümünü WinRT sınıflarıyla sarmakla kaldım.

Bu ilk kez C ++ taşınabilir bir yerel uygulama yazmaya çalıştım. WinRT'yi böyle sınırlar boyunca tutmak gerçekten pratik mi? Platforma özgü bir sınıra sahip bu tür taşınabilir çekirdek başka nasıl ele alınabilir?


MVVM gibi bir şey, burada Model standart C ++, V ve VM WinRT birlikte çalışma nesneleri?
Max

5
"ancak her VM etkili bir şekilde standart modellerimin etrafına sarılır." - bu, herhangi bir senaryoda görüntüleme modelleri için oldukça yaygındır.
MattDavey

1
@ GlenH7, yorumların benim için çoğunlukla yanıt verdiğine inanıyorum. Aynı sonuca vardı, ama birisinin daha akılcı bir fikri olduğunu umuyordum. Genel olarak, işler oldukları gibi olur. Kodunuzun bölümlerini ayırmak için elinizden geleni yapabilirsiniz, ancak çoğunlukla kodun platforma özgü bölümlerini yeniden yazmanız gerekir (yukarıdaki ViewModel örneklerinde olduğu gibi).
Bret Kuhns

1
@ GlenH7 Belki de uygulama kodunuzu platformlar arasında tutarlı tutmanın tek yolu kendi platform soyutlama katmanınızı yazmaktır, ancak bu katmanlar ilk etapta kaçınmaya çalıştığım şey olacak. Sadece problemleri bir şeyleri izole etmek için bir katman soyutlamasıyla hareket ettiriyor. Belki yardımcı olur, ama sonunda hala işi yapıyorsun.
Bret Kuhns

1
Bir kez bir C kütüphanesini Android'de Java'ya sorunsuz bir şekilde yapıştırmak için bir "gümüş kurşun" oluşturmaya çalıştık. Son olarak, ~ 10 daha fazla zaman harcadıktan ve egzotik hata ayıklama tekniklerini kullandıktan sonra (sınırdaki anormal davranışlar üzerinde çalışmak için) işe yarayabilir. Kesinlikle, eğlenceliydi.
Alex Cohn

Yanıtlar:


8

IMHO (eski programcı; Microsoft'ta çalışmak, ancak bu kişisel bir görüştür): Bu soruya cevap vermeden önce, bu diğer soruyu cevaplamalısınız:

Kod nereye taşınıyor? Tek bir platforma bağlı kalırsanız (bu durumda, WinRT), platforma yakın olun - ve bu, mevcut soyutlamaları kullanmak anlamına gelir. Örneğin, kodunuz WinRT gereksinimlerini karşılamak için Vector ^ kullanır.

OTOH, başka bir yere taşınıyorsanız (VMS kayalar!), O zaman standartlara dayalı mantıklı.

Piyasadaki en büyük üç taşınabilir, tablet benzeri platformun ortak programlama görevleri için farklı diller kullandığı göz önüne alındığında, kodun taşınması değerli bir seçenek olmayabilir.


Katılıyorum. WinRT'yi hedefleyen projeye başladım, ancak Android / iOS'un bağlantı noktasına çekici platformlar olacağını bilmek, bu soruyu yöneltti. O zamandan beri sadece WinRT'ye karşı yazmaya karar verdim. Projenin kendisi bir kalabalık çekerse, o zaman taşıma (veya daha ziyade başka bir platforma yeniden yazma) konusunda endişelenirim.
Bret Kuhns

@Alexcohn'un işaret ettiği gibi, çekirdek işlevselliği çapraz platforma gitmeye karar verdiğim zaman yeterince ağırsa, portatif kodu platforma özgü katmanlarla sarmaya değer. Aksi takdirde, kodu yeniden yazacağım ve farklı platformlardaki (uygun olduğunda) davranışı doğrulamak için test paketleri kullanacağım.
Bret Kuhns

0

C ++ / CX kullanmak zorunda değilsiniz, bunun yerine eski ATL şablonları gibi olan WRL'yi ( Windows Çalışma Zamanı Kitaplığı ) kullanabilirsiniz, C ++ / CX olan 'taklit' C ++ kullanamazsınız. MS'den WinRT nesnelerini tüketmeye "düşük seviye" yaklaşımı ve yazmak için kullanılan Grandad gibi tamamen standart C ++!

C ++ / CX kadar "hoş" olmayabilir ama bu bir fikir meselesidir - benim kişisel görüşüm, C ++ / CX'in genişletilmiş C ++ 'da 3. deneme olması ve 3. hata olmasıdır. Yoksay ve umarım diğer 2 enkarnasyonla aynı şekilde olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.