Neden en az kullanıcı / el yazısıyla kodunuz var ve XAML'de her şeyi yapıyorsunuz?


12

MVVM topluluğu 90'lı yıllarda OO programcıları gibi aşırı hevesli hissediyorum - bu yanlış bir MVVM hiçbir kod ile eşanlamlı. Benim itibaren kapalı StackOverflow soru :

Birçok kez burada arkasında kod yerine XAML eşdeğerini yapmaya çalışan biri hakkında mesajlar rastlamak. Onların tek nedeni kodlarını 'temiz' tutmak istiyorlar. Yanılıyorsam beni düzeltin, ancak durum böyle değil:

XAML de derlendi - BAML içine - o zaman çalışma zamanında yine de koda ayrıştırılmalıdır. Derleyici tarafından derleme zamanında - yanlış yazımlardan - alınmayacakları için XAML'nin daha fazla çalışma zamanı hatası olabilir, bu hataların hata ayıklaması da zordur. Zaten arkasında kod var - beğen ya da beğenme InitializeComponent (); çalıştırılması gerekir ve içindeki .gics dosyası gizli olsa da bir grup kod içerir. Tamamen psikolojik mi? Bir web arka plan gelen ve kodlama aksine biçimlendirme gibi geliştiriciler olduğundan şüpheleniyorum.

DÜZENLEME: Ben XAML yerine arkasında kod önermiyorum - her ikisini de kullanın - ben de XAML bağımı yapmayı tercih - Ben sadece bir WPF app esp arkasında kod yazmaktan kaçınmak için her türlü çabaya karşıyım - bir füzyon olmalıdır her ikisinden de en iyi şekilde yararlanmak için.

GÜNCELLEME: Microsoft'un fikri bile değil, MSDN'deki her örnek bunu her ikisinde de nasıl yapabileceğinizi gösteriyor.

Yanıtlar:


9

XAML'ye her şeyi koymayı öneren birini hiç duymadım.

Aslında, bu korkunç bir fikir olurdu, IMO.

Sorun, tarihsel olarak, arkasında olmayan kodlarında mantığı olan Winforms uygulamalarından geldi, çünkü mantıktı . VM'nin önemi buradan geliyor. Görünümü Modele bağlayan parçaları izole etmenizi sağlar.

Bu nedenle, Görünüm yalnızca en iyi olanı (yani UI) işlemek için bırakılmıştır.

Şimdi, kullanıcı arayüzünüzün kod gerektirdiği durumlarınız varsa, elbette bunun için gidin ve kodunuza koyun. Ancak, orada senaryoların% 95'i için, büyük olasılıkla UI'yi biçimlendirme dosyasında bırakmaktan daha iyi olacağınızı söyleyebilirim ve arkasında bir koda ihtiyacınız varsa, muhtemelen yazmaya çalıştığınız bir mantık Görünüm Modeline daha uygun bir şekilde bırakılır. Bunun istisnaları Davranışlar gibi şeylerdir, ancak tamamen ayrı hayvanlardır ve özel bir yer gerektirirler (yani arkadaki kodunuzda değil).


"Kod yok ... şimdiye kadar" bir kuraldır ... kurallar doğru durumlarda
çiğnenmek içindir

1

Sorunuzu doğrudan yanıtlamak ve her durumda özel olarak arka plan koduna (görsel kontrol sınıfındaki kod) atıfta bulunduğunuzu "kod" dediğinde bunun nedeni, kullanıcı arayüzünüzün tamamen uygulanabilmesidir. ve yalnızca tek bir teknoloji kullanarak Blend'te manipüle edildi. Varsayım, UX tasarımcılarınızın geliştirici olmadığı ve kod içinde çalışmak istemediği ve kodlama uzmanlarının aksine düzen ve XAML uzmanları olduklarıdır. Her şeyi arka planda kod olmadan uygularsanız, bu tür tasarımcılara tamamen kendi dillerinde çalışmak için ihtiyaç duydukları araçları verebilirsiniz.

Zorunlu programlama ve bildirimsel tasarım arasında temiz bir ayrım sağlar.

Bu, Silverlight ve WPF'de "davranışların" varlığının itici nedenidir - bir kodun arkasındaki koda gömülmek yerine, davranışı kendi küçük yeniden kullanılabilir modülü haline getirir. Bunu yaparsanız, Blend size kelimenin tam anlamıyla bir kontrole sürükleyip bırakabilme avantajı sağlar. Şimdi, bir kereye mahsus hareketli bir parçayı aksi halde hepsi bir arada XAML kontrolüne sahip olmak yerine, hareketli parçaları tasarımcı araçları kullanarak manipüle edilebilecek güzel bir kaba soyutladınız.


1

Deneyimlerime göre, bu genellikle XAML tetikleyicilerinde karmaşık mantığı kullanmaya çalışmaktır, daha iyi, daha basit bir yaklaşım bu mantığı ikisine de koymak olduğunda - görünümde -model.


1

Xaml'de yapabileceğiniz her şeyi yapmanın en büyük avantajlarından biri, tüm davranışları tek bir yerde tutmasıdır. Geliştiricinin xaml ve kod arasında her atlaması gerektiğinde bunu anlamak daha zor hale gelir.

Arka planda kodların azaltılmasını öncelik haline getirmeyen bir WPF ekibindeyim. Bazı olay işleyici kontrolü manipüle ettiği ve davranış iki dosyaya dağıtıldığı için hemen görülmediği için hata ayıklamanın çok daha zor olduğu birkaç kez oldu.

Bununla birlikte, bazen tasarım ilkesinden ödün vermekten daha iyi olduğunuzu düşünmeye haklı olduğuna inanıyorum. Bazı şeyleri xaml'de yapmak çok zordur. Ben arkada kod kullanarak çok daha az zamanda yapmış olabilir xaml çalışmak için bir davranış almaya çalışırken saat hatta gün geçirdim. Kod-arkasında son çare olarak tedavi etmek için geldim, ama asla birilerine asla kullanmaması gerektiğini söyleyemem. İyi bir mühendisin anlaması gereken başka bir ödünleşim.

edit: Yorumumdan benim mesaj xaml karşı savunarak olarak yorumlanıyor gibi geliyor. Amacım bunun tersini tartışmaktı. Saf xaml her zaman tercih edilir, çünkü tüm davranışları tek bir yerde tutar. Bir xaml ve arkada kod karışımı karışabilir, bu nedenle arka planda kodun en aza indirilmesi idealdir. Xaml, birçok nedenden ötürü saf kod arkasına tercih edilir. WPF ve Silverlight xaml ile yazılmak üzere tasarlanmıştır.


2
Bu mantığa göre, her şeyi tekrar düz kodda da uygulayabiliriz.
Steven Jeuris

@ Steven Jeuris Bazı şekillerde dağınık bir xaml ve kod karışımına tercih edilir. Tamamen kod ve iş yaptım gördüm.
Drew

Saf bir programcı bakış açısından, katılıyorum. Ancak mesele XAML, tasarımcılar tarafından koddan tamamen ayrı olarak kullanılabilecek araçların kolay geliştirilmesine izin veriyor.
Steven Jeuris

@Steven Jeuris: Tamamen katılıyorum. Yapabildiğim her şeyi xaml'de yapıyorum. Dediğimde, "Kod arkaya son çare olarak davranmaya geldim" dedim. Daha az kod arkasında neredeyse her zaman daha iyi olduğunu iddia etmeye çalışıyorum. Amacım saf xaml'ın en iyisi olduğunu söylemekti, ancak çoğu tasarım prensibi gibi nadir durumlarda uzlaşma ve kod arkasına girme tamam.
Drew

1

Sadece çok yüzeysel XAML bilgim var, ama derleyicinin yazım hatalarını algılamaması beni şaşırtıyor.

Temel fark, XAML'nin bildirimsel olması , örneğin C #'ın zorunlu olmasıdır.

Basit ifadeyle:

Pane p = new Pane(200, 100);
Button foo = new Button("foo");
Button bar = new Button("bar");
p.addChild(foo);
p.addChild(bar);

vs.

<Pane width="200" height="100">
    <Button label="foo"/>
    <Button label="bar"/>
<Pane>

Üst kod gerçekten yan etkilerle bir hiyerarşi yaratırken, alt kod basitçe bildirir. Ayrıca, örneğin addChildyöntemin yeniden adlandırılabilmesine rağmen, çocuk-ebeveyn ilişkisinin semantik modelin merkezinde olduğunu ve bildirim snippet'inde olduğu gibi temsil edildiğini belirtmek gerekir . Tamamen şeffaf bir şekilde tembel örnekleme gibi altında çok fazla optimizasyona izin veren uygulamadan çok uzak.
Deklaratif programlamanın birçok avantajı vardır. Daha özlü, etkileyici ve modelinize çok yakın. Ben tercih edilir olduğu kadar gitmek istiyorum.

Ancak bu, her şeyi XAML'ye yumruklamaya çalışmanız gerektiği anlamına gelmez. C #, bildirimsel bir stile izin veren birçok üst düzey yapıya sahiptir.

Sonunda, kodunuzun kısa ve okunması kolay olmasını istiyorsunuz. Aynı şeyi C # 'da XAML' den daha az kodla başarabilirseniz, C # kullanmak mantıklıdır. Bununla birlikte, XAML kodunun, kullanılan bileşenlerdeki değişikliklere karşı çok daha az savunmasız olduğu, .NET çerçevesini uzaklaştırarak (örneğin, bağların nasıl uygulandığına dair ayrıntılar) daha fazla "taşınabilir" olduğunu unutmayın.

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.