Form kalıtımından kaçınılmalıdır?


9

VB4 öğrenmeyi ve bir forma bir düğmeyi sürüklemeyi, o düğmeyi çift tıklamayı ve sihirli bir şekilde kutsanmış olduğum olay işleyicisine kod yazmayı hatırlıyorum. QBASIC'ten gelince, "VB" de "V" ile heyecanlandım, görsel tasarımcı dilimlenmiş ekmekten beri tam anlamıyla en iyi şeydi.

Tabii ki tüm bunları programlı olarak yapabilirsiniz ama "V" nin büyüsü o kadar cazipti ki o düğmeyi sürüklemekten başka bir şey yapamazdınız. O rotayı izlemeye teşvik edildik.

Ama sonra birkaç yıl önce C # ve .net çerçevesi hakkında bilgi edinmeye başladım ve bildiğimi düşündüğüm her şeyin pencereden çıkmış olmasına hayran kaldım. VB6'da .net'te tamamen açığa çıkan çok fazla sihir var: InitializeComponentsörneğin yapıcıları ve yöntemi alın. İkincisinde, araç kutusundan sürüklediğiniz tüm kontrol örneklerini, kaydettiğiniz tüm etkinlikleri ve tasarımcıda ayarladığınız özellikleri bulacaksınız.

Ve bu iyi ... Sanırım. Sadece, neler olduğunu "sanmıyorum" gibi hissediyorum, sadece tasarımcı aracılığıyla değiştirebileceğim bu kod benden rahatsız oluyor. "Tamam" yazan bir düğmeyi bir formdan diğerine her kopyaladığınızda (bazen kardeşi "İptal" ile birlikte), kodu çoğaltırsınız ve bu bir günah değil mi? KURU, kendini tekrar etme, diyor Papa .

Dinler ve düşünce okulları bir yana, tüm nesnelliklerde, formları temel formlardan türetmemeliyiz ve "Tamam" düğmesi (ve tüm arkadaşları) temel formda mı yaşamalıdır? A ' FormBasedan türetilmiş bir şey DialogFormBase; tüm sınıflar kısa sürede yaratıldı ... kod yazarak. Düğmeler, sınıfın nasıl örneklendiğine bağlı olarak oluşturulur (yani bir yapıcı numaralandırma bağımsız değişkeni hangi düğmelerin oluşturulacağını belirler), denetimler, forma enjekte edilen bölünmüş paneller ve akış düzeni panellerinin bir düzenlemesi içine yerleştirilir.Contentana içerik paneline sığar. ASP.net'in ana sayfalar ve içerik yer tutucuları ile yaptığı bu değil mi? Yeni bir "kalıp sayfa" gerektiğinde bir form türetmek istiyorum, ancak bu yeni "kalıp sayfa" hala temel form sınıfından türetir, böylece görseller tüm uygulama boyunca tutarlı.

Bana göre bu WinForms tasarımcı ile şimdiye kadar yaptığım her şeyden çok daha fazla kod yeniden kullanımı, ve hatta zor değildi ve kod üzerinde hiçbir kontrolüm yok 200 satır yöntemi ile darmadağın değil, yapabilirim İstediğim yere yorumlar koyun, bir tasarımcı tarafından üzerine yazılmazlar. Sanırım bu sadece bir desen ve mimari meselesi, bu beni bu bağlantıya getiren şeydi: Ortak işlevsellikleri paylaşacak Windows formları için en iyi tasarım , oradaki cevap hariç, nerede olduğumu fark ettiğimi fark ettim. ancak tasarımcıyla ilgili düşünceler nedeniyle form kalıtımına karşı tavsiyede bulunur . Bu benim anlamadığım kısım .kod yapısı ile ilgili hususlar nedeniyle , özellikle form ve kontrol mirasıyla ilgili olarak , tasarımcının kırılmasından başka kaçınmak için hiçbir neden göremiyorum .

Hepimiz tembel olamayız, o zaman hangi kısmı kaçırıyorum?


Anlamıyorum. Görsel tasarımcıları kullanmamamız ve tüm GUI kodlarını elle yazmamamız gerektiğini mi ima ediyorsunuz?
Euphoric

Pre .NET form üzerinde sürüklenen tüm nesneleri kontrol kodu nerede?
Jeff

1
@JeffO, ele aldığım eski koddan yola çıkarak, formda, ad-hoc inline SQL ve iş mantığı arasında bir yerde söyleyebilirim. Nokta WinForms olduğu bir net; tasarımcı bugünlerde "kötü kod" ve "kötü kodlama alışkanlıkları" gibi kokan şeylerle iyi çalışıyorsa ve bir şeyleri yapılandırmaya başladığınızda gerçekten kırılırsa, tasarımcıyı bırakın ve formlara oldukları gibi davranın (sınıflar!) .. ve C # 'daki bir UI katmanını kodlamak, ExtJS'de bir UI katmanını kodlamaktan ne kadar farklıdır? WinForms'da bunu yapmak "sıkıcı" çünkü "hey bir tasarımcı var" mı? Bir ExtJS kullanıcı arayüzü kodlamak sıkıcı mıdır?
Mathieu Guindon

Başka bir kullanıcı teklif edecek: CodeCaster; Bir olay işleyici, GUI'yi iş mantığınıza bağlamak içindir. Kullanıcının adını ve Ekle düğmesini girmek için bir metin kutunuz varsa, Ekle düğmesini tıklatmak yalnızca _userRepository.AddUser (UsernameTextbox.Text) öğesini çağırmalıdır. Olay işleyicilerinde iş mantığı istemezsiniz. stackoverflow.com/questions/8048196/…
Pieter B

@Pieter sunum katmanınıza DAL bağımlılığı koymuyor mu?
Mathieu Guindon

Yanıtlar:


9

Size farklı bir paradigma ile karşı çıkacağım: Kalıtım üzerine kompozisyonu tercih edin.

GUI kodunu elle yazmaya başladığınızda ve formlar arasında davranış ve görselleri paylaşmak için kalıtım kullandığınızda bile, normal OOP tasarımı ile aynı sorunu vurursunuz. Diyelim ki, Tamam / İptal düğmeleri olan DialogForm ve ızgarası olan GridForm. DialogForm'daki tüm iletişim kutularını ve GridForm'dan Grid içeren tüm formları türetirsiniz. Ve sonra her ikisiyle de form istediğinizi öğreneceksiniz. Nasıl çözersin? Form devralma kullanıyorsanız, bunu çözmenin bir yolu yoktur. Diğer tarafta, UserControls kullanıyorsanız, o zaman formunuza GridControl koymak ve onunla yapılabilir. Ve hala UserControls ile tasarımcı kullanabilirsiniz, bu yüzden sıkıcı GUI kodu yazarak zaman kaybetmenize gerek yok.


Temel formda Panel2 sabit bir SplitContainer vardır BottomPanelve ortak bir Ok / İptal / Uygula / Kapat davranışını barındıran ve barındıran bir FlowLayoutPanel içerir ; Panel1, Panel1 sabit (ortak "talimatlar" etiketini veya menüler, araç çubukları, üstte ne olursa olsun) barındırmak için SplitContainer ve korumalı bir Panel tutan Panel2 içerir MainContent; her bir gerçek uygulama, onu nasıl dolduracağınıza karar verir. Tüm içerik uygulama içine enjekte edilebilir ve evet, zaman, iyi bir noktadan tasarruf etmek için tasarımcı ile yapılan bir kullanıcı kontrolü olabilir .. ama formun kendisi ne olacak?
Mathieu Guindon

Buradaki sorun ölçek. 10 form ile başvuru yaptığınızda, tek bir ortak forma sahip olmak önemli değildir. Sorunlar, düzinelerce veya yüzlerce formla uygulamanız olduğunda başlar. Sonra, ortak parçaları olan, ancak asla temel form oluşturmak için yeterli olmayan formlara sahip olacaksınız. Sizin durumunuzda, farklı düzen veya farklı düğmeler kullanmak isteyebilirsiniz, ancak diğer her şeyi aynı tutun. Ve sorunlar başladığında.
Euphoric

2
Yarıya yakışır bir tasarımınız varsa 'ölçek sorunu' mevcut değil.Yüzlerce yüz formla çalıştığım bir projemiz var.Sıklık ve ortak işlevsellik sağlamak için form kalıtımını yoğun bir şekilde kullanıyoruz ve hiç problem yaşamadık onunla.
Mason Wheeler

2
@MasonWheeler Tam tersi bir deneyim yaşadım. Uygulamalarımızdan birinde form kalıtımını kullanmaya çalıştık ve temel formlarda çok az değişiklik yaptığımızda, her şey bozuldu ve diğer tüm formları manuel olarak düzeltmek zorunda kaldık. Ayrıca, kalıtsal formla çalışırken tasarımcı garip davranır.
Euphoric

1
@Euphoric: Hangi tasarımcı? Delphi kullanıyoruz ve tasarımcısı kalıtsal formlarla gayet iyi çalışıyor. Ve yine, iyi bir tasarımınız varsa bu sorunlarınız olmaz . Bir şey planlamıyorsanız, elbette hepsi kırılgan olacak ve dokunduğunuzda kırılacak, ancak bu diğer kodlardan farklı değil.
Mason Wheeler

2

Bunların çoğu tercih edilen teknoloji yığınına bağlıdır.

WinForms ve WPF'nin her ikisi de .NET UI çerçeveleri olabilir, ancak nihai hedefe ulaşma biçiminizde büyük farklılıklar gösterir. Bazı paradigmalar teknolojiler arasında gayet iyi hareket eder, ancak diğerleri bunu yapmaz ve bir paradigmayı sadece her çerçevede var olması gerektiğini düşündüğünüz için zorlamaya çalışmamalısınız. MVVM'nin WPF / SL'de kullanılmasının bir nedeni vardır ve MVC, ASP.NET'te WebForms'tan vb. Ayrı bir kavramdır. Bazı teknolojiler belirli paradigmalarla daha iyi çalışır.

Oluşturulan kodun genellikle KURU endişelerinizden kaldırılması gerektiğini unutmayın . Bazı durumlarda uygulanabilir olsa da, göz ardı edilmemelidir. KURU kavramlar kesinlikle Sunum katmanınızın dışında bir odak olarak kalmalıdır, ancak Sunum katmanında oluşturulan kod, çalıştığınız çerçevenin bir yan ürününden daha sık değildir. Bu, KURU ilkelerini yaklaşımınıza uygulayamayacağınız anlamına gelmez, ancak kalır temkinli. Bir temel Form oluşturup süresiz olarak devralabilir misiniz? Evet. Bileşenleri her seferinde yeni bir Form üzerinde sürükleyip bırakabilir misiniz? Evet. Seçtiğiniz teknoloji yığınının sınırları dahilinde çalışırken, olası kusurlardan kaçınarak, akış aşağıyı yeniden düzenlemeyi ve ölçeklenebilirliği kolaylaştırarak nihai hedefe odaklanmaya devam edin.


0

Sen edebilirsiniz doğru bir şekilde alanları kapsamak ve buna göre doldurmak sağlayan kalıtım kullanın. Kalıtım kullanmaya hevesli olsaydınız benim önerim, temel forma ve bu forma karşılık gelen bir Modele sahip olmak ve her türetme için hem formu hem de Modeli türetmek olurdu.

Daha iyi bir alternatif, ilgili kontrolleri bir veya daha fazla UserControl kontrolünde gruplandırmak olacaktır. İlgili verileri içine koymak için biraz mantığa ihtiyacınız var.


0

Mason Wheeler'a tamamen katılıyorum, ancak üç yıl içinde belki de fikrini değiştirmişti.

Delphi yürütülebilir dosyalarından WEB'e geçmek için alternatifler aramaya çalışıyorum.

Şimdiye kadar UNIGUI için kendime karar verdim, çünkü hala form mirasını kullanabilirim. Delphi'nin Dart gibi Mixins'e sahip olmasını istiyorum, çünkü daha az form atalarım var. Ancak insanların MVC'de Visual Form Mirasından çok daha fazla kod yazdığını hissediyorum, çünkü navigasyonun çoğu, veri modülündeki doğrulama kurallarına (uygulamada), sql filtreleme ölçütlerine, istemci veri kümesinde arama yapıyor, her şey belki 5 Atalar oluşturun.

Hatta "MVC ile Delphi'yi Özellikte bırakmanız daha kolay olacak" benim için bir argüman olarak çalışmıyor, çünkü insanlar OOP'u davet etti, her şey sınıflar, özellikler, yöntemler. Yani ihtiyacım olan tek şey bir çevirmen. Gerçekten çok daha az karmaşık ama Günlük bazda değişiklik web siteleri için herhangi bir avantaj bulamadı.

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.