İş Hattı Uygulamasında MVVM'nin Değeri (ve Mevcut Geliştirme Uygulamalarının Bir Sırası)


9

2 yıl sonra, hala çalışma yazılımı üretmek için pratik bir yöntem olarak MVVM ile mücadele ediyorum. Bazı durumlarda harika. MVVM kavramları olmayan bir kabus olacak küçük bir montaj hattını kontrol eden çok iş parçacıklı bir uygulama yaptım. Fiziksel montaj hattından soyutlama neredeyse hiç beyinsizdi.

Bununla birlikte, kariyerim çoğunlukla bir iş faaliyetlerini resmileştirmek ve optimize etmek için dahili iş uygulamaları serisi etrafında dönmektedir. Bu tür uygulamalarda, genellikle CRUD ve bileşik operasyonlar etrafında dönen bir iş teir vardır. LOB'larda, görünüm modellerim, iş sınıfı yöntemlerinin bir satır sarma işlevinin çok basit bir koleksiyonudur ve sonunda bir mesaj kutusu göstermek veya bir pencere açmak gibi en basit görevleri karmaşık hale getirir. İnsanlar on yıllardır süren bir Window.ShowDialog çağrısı için "bağımlılık enjeksiyonu" ve "mesajlaşma sağlayıcıları" gibi uzun açıklamalara girdiğinde bunu hiç kimse garip bulmuyor mu? Yığın taşması konusunda, winformlarda son derece basit olan görevler için tavsiye isteyen başka kaç soru var?

Beni yanlış anlamayın - MVVM'yi ve küçültülmüş ve pazarlanan bir yazılım paketinin yatay gelişimini yapan büyük ekipler için nasıl paha biçilmez olabileceğini anladım. Görünüm modellerinin test edilmesi, kötü bir RTM hatasından kaçınarak milyonlarca tasarruf sağlayabilir ve özel kullanıcı arayüzü geliştiricileri zengin bir deneyim sunabilir. Ama yeniden dağıtım maliyeti minimum olduğunda ve tüm iş için ödeme umurunda basit çalışma yazılımı, iş mantığı zaten birim test olduğunda neden basit bir "sarıcı" vm test birim zaman harcamak gerekir? İşletme gerçekten sevimli animasyonlar ve renk şemaları için ne kadar zaman harcayacağım? Küçük bir geliştiricinin yapması gereken bir şey var mı ("Save_Click" e bakarken, bir kaydetme işlevinde bir hatayı takip etmek,

Kuşkusuz, WPF'nin veri tabanını gerçekten seviyorum. Bundan yararlanmak için veri bağlamını pencerenin kendisine, iş sınıfına ve diğer gözlemlenebilir özelliklere erişime ayarladım. Evet bunu yaparak neredeyse her MVVM "kuralını" kırarım. Ama en azından ben okumak kolay basit olay güdümlü kod var VE ben yeni veri bağlama ve doğrulama yararlanmak olsun. Sorun tasarımcılarda - ki o kadar çok kullanmıyorum ama 2012'de daha iyi entegre olmasını umuyorum - tasarımcı bir pencerenin ve temel sınıflarının sahip olduğu yüzlerce özelliği gösteriyor.

İlişkiler için beni kaynaklara, kitaplara, hatta sadece yutmayı kolaylaştıran perspektif değişikliklerine yönlendirebilirsin. MVVM'ye bir şans daha vereceğim, ancak son kez bağımlılık enjeksiyonundan endişe duyduğum için kendimi oldukça aptal hissettim, sadece bir VM'den bir mesaj kutusu göstermek için birim test etme niyetim yoktu. Birim testi yapmış olsam bile, gerçekten "sıkı bağlı" uygulamaların derleme zamanı hataları için işlem zamanı testi yaparak daha fazla kalite alıyor muyuz?

Bir cevabın sadece winformlarda kalmak olduğunu anlıyorum. Ancak WebForms'un son destekçilerinden biri olarak (web geliştirme trendinin aynı eleştirisine sahibim), Microsoft sertifikasyon parçalarında artık WebForms kalmadığını keşfettiğimde biraz dinozor gibi hissettim. Sevmeme rağmen tek seçenek ilerlemektir.


1
Ben teşvik etmese de, yine de olayları ve kodları olan bir WPF uygulaması WinForms tarzı yazmak hala mümkündür. Basit bir kerelik uygulamalar için bu büyük bir sorun değildir. Değer verdiğinize ve işletmeye neyin değer verdiğine bağlıdır. TDD ve MVVM'nin büyük bir hayranıyım, ama gerçekten değer sağlamıyorsa, yapma. Bu bir din değil. Kodun genellikle düşündüğümüzden çok daha uzun yaşadığını unutmayın.
Matt H

"İnsanlar bir pencere için 'bağımlılık enjeksiyonu' ve 'mesajlaşma sağlayıcıları' gibi uzun açıklamalara girdiklerinde hiç kimse garip bulmuyor mu? Onu sinir bozucu buluyorum, ama bunların hepsine giren (aslında bir şey yapmanın zararı için) her zaman alanın bir parçası olmuştur ve maalesef muhtemelen her zaman olacaktır. En iyi strateji onları olabildiğince görmezden gelmek / dikkatini dağıtmaktır.
user1172763

Yanıtlar:


10

Benim bakış açım Winforms ile yıllardır edindiğimiz deneyimlerden, "eski moda yol", olaylarla ve arkada kodla. Böylece, en basit uygulamaların ötesine geçtiğinizde, kodunuzun hızla büyük bir çamur topu haline geldiğini kesin olarak söyleyebilirim . Bu kaçınılmazdı, çünkü o zamanlar başvurular böyle yazıldı.

Web formları aynıdır, ancak vatansız bir sistem (web) üzerinde durumsal bir soyutlama olmanın ek komplikasyonunu da beraberinde getirir. Rob Conery'nin dediği gibi:

WebForms bir yalandır. Bu saptırma ve el çabukluğu ile dolu bir tabakta sunulan yalan sos kaplı aldatma sarılmış soyutlama. Webforms ile yaptığınız hiçbir şeyin web ile ilgisi yoktur - sizin için işi yapmasına izin vermiş olursunuz.

Bu, dynamicC # anahtar kelimesini ve sadece dört yüz satır kod kullanarak tamamen işlevsel bir nesne-ilişkisel eşleyici yazan adamdan . Bir şey hakkında otoriter olarak konuştuğu zaman dinliyorum.

Şu anda üzerinde çalıştığım uygulama, ana formda birkaç sekme bulunan bir Winforms uygulamasıdır. Sekmelerin her birine formları dinamik olarak yükleyebilirim. Ben MVVM veya MVP takip etmedi iken (Eğer gibi kütüphaneler ile yapabilirsiniz bu bir ), ben agresif kesinlikle formunu çalıştırmak için gerekli olan sadece bu kodu bırakarak dışarı ayrı montaj için elinden kodun her biti ittin. Formun kontrol tanımlarını, özelliklerini ve olay işleyicisi atamalarını içeren kısmi sınıfı saymadan, hala birkaç yüz kod satırı var, ancak forma yeni bir şey eklemem gerekmediği sürece ona tekrar dokunmam gerekmiyor.

Ben bir form ve Anahtar / Değer çiftleri koleksiyonları el statik bir yöntem var ve (Yansıma kullanarak) otomatik olarak formdaki alanlara tuşları eşleşecek ve formu koleksiyonun değerleri ile doldurur. Formun alanlarından bir Anahtar / Değer çifti koleksiyonu alarak, bunun tersini de yapabilirim. Her şey yaklaşık yirmi kod satırıdır, ancak her kullandığımda kendisi için ödeme yapar, çünkü bir formda kırk kontrol için kırk özel atama ifadesi yazmak zorunda değilim.

Bu Anahtar / Değer listesini alıp XML'ye serileştirebilirim, bir dosyaya devam etmeme izin verdim. Geleneksel bir DTO verebileceğim ve alanlarını forma eşleştirebileceğim başka formlarım var . Bunların hiçbiri Winforms'un "büyük çamur topu" tarzında pratik olmaz. Yeterli ayırma kullanıldığında neredeyse önemsizdir.

Bunlardan herhangi biri tanıdık geliyor mu? Olması gerekiyor; bu aslında fakir bir insanın veri bağlama şeklidir.

Kuşkusuz, WPF'nin veri tabanını gerçekten seviyorum. Bundan yararlanmak için veri bağlamını pencerenin kendisine, iş sınıfına ve diğer gözlemlenebilir özelliklere erişime ayarladım.

Aferin. MVVM uyumlu olması gerekmez. Ancak unutmayın, geliştiricilerin büyük sistemler oluşturmasına yardımcı olmak için MVVM gibi desenler oluşturuldu . Sadece bir iletişim kutusu görüntülemeniz gerekiyorsa, tüm bu tesisatlara ihtiyacınız olmayabilir.

WPF gibi sistemlerin karmaşıklığının bir kısmı, belirli bir sorunu genelleştirilmiş bir şekilde çözmeye çalışan tüm programcı kütüphanelerinde doğaldır. Bunu yapmak için, bir programcının kütüphanenizi kullanabileceği her pratik yolu hesaba katmanız gerekir. Bu karmaşıklık katar, ancak kütüphanelerini iyi tasarlayanlar için, tablolara işleri düzgün ve tutarlı bir şekilde yapma felsefesini de getirir.

John Resig'in jQuery kütüphanesini düşünün: tutarlı bir tasarımın özüdür ve DOM hakkında birçok garip ayrıntıyı ve tarayıcıların işleyiş şeklindeki değişiklikleri gizler . Sadece birkaç satır Javascript yazmak daha mı basit? Ara sıra. Ancak jQuery kodunu tutarlı, tek tip bir API'ye yazmanın avantajı, birlikte gelen bir sonraki kişinin ne yaptığınızı anlamasını ve gerekirse bu kodu korumasını kolaylaştırır.

"Büyük uygulama" modelleri ile gerçek deneyimim ASP.NET MVC kullanmaktır. Winforms WPF olduğu gibi ASP.NET ASP.NET MVC içindir. ASP.NET'te çalıştığımda, bunu her zaman kendi isteğime bükmek için mücadele ettim. ASP.NET MVC size eğilir. Kullanmak bir zevktir; net ve düzenli bir sistem yapısı üretir ve uygulamanız ve işaretlemeniz üzerinde tam kontrol sahibi olmanızı sağlar. Javascript, jQuery ve CSS'yi bolca kullanabilirsiniz ve ASP.NET MVC önünüze çıkmaz.

Tek engelim buna alışmak ve kendi şartlarıyla tanımaktı.

RobC Conery ile MVC Öğrenmelisiniz Daha Fazla Okuma


Gerçekten düşünceli yanıt büyük çamur topu için teşekkür ederim - Ben kesinlikle klasik asp ve spagetti kod günlerinde bu şekilde hissettim. Vb6 / mts ile 3 katmanlı tasarım bunun büyük bir kısmını düzeltti ve sonra .net'in serbest bırakılması hepsini bir araya getirdi. Ama şimdi ek kalıpların getirilerinin hızla demin edici olduğunu hissediyorsanız - çeyrek mil sürenizden 1 sn uzakta 1 milyon dolar harcamak gibi. "Agresif bir şekilde her bir kod parçasını ayrı bir montaja gönderdim."
b_levitt

3
don't you find that this gives an incredibly fractured development experience - constantly jumping from file to file to read two lines?- Hayır, tam tersi. Bunun gibi başka bir derleme yapmak, zihninizi, her sınıf ve yönteme, kendi küçük kara kutusu gibi kendi terimlerine odaklanmak için serbest bırakır. Büyük bir çamur topu ile yapmak çok zor. MVC aynı prensipte çalışır: ince kontrolörler, yağ modeli, kesinlikle gerekli olmadıkça görünümde kod yok.
Robert Harvey

3
Yagni yalnızca kodu kendiniz yazarken geçerlidir. Farklı ihtiyaçları olan geniş bir kitleyi karşılaması gereken genelleştirilmiş bir kütüphane yazıyorsanız, buna ihtiyacınız olacaktır.
Robert Harvey

1
Bu arada ASP.NET yaşam döngüsüne karşı hiçbir şeyim yok; İnsanların mükemmel etki için kullandıklarını gördüm. Ben sadece karşı-sezgisel buluyorum, hepsi bu. ASP.NET MVC, istemiyorsanız herhangi bir istemci tarafı geliştirme yapmaya zorlamaz; "aptal" görünümleri kullanabilirsiniz ve mükemmel çalışıyor. Dikkate değer: bu tür şeylerin çoğu kod üretilebilir (tıpkı bir Windows formu gibi), bu yüzden tüm kodu kendiniz yazıyor gibi değilsiniz. Bunun XAML ile uğraşmanız gereken WPF için daha az doğru olduğunu anlıyorum ve orada iyileştirme için yer olduğunu düşünüyorum.
Robert Harvey

2
dozens of lines of plumbing to replace Window.Show- Bu biraz fazla basit. Pencerenin verilere ihtiyacı varsa, bu verileri pencerenin kontrollerine almak için her zaman bir tür sıhhi tesisat olacaktır ve bunun tersi de geçerlidir. Bu yinelenen kodu, oluşturduğunuz her form için tekrar tekrar yazabilir veya veri bağlama gibi bir tür genelleştirilmiş çözüm kullanabilirsiniz.
Robert Harvey
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.