Ortak tuzaklardan bazılarına düşmüşsünüz gibi görünüyor, ama endişelenmeyin, düzeltilebilirler :)
Öncelikle uygulamanıza biraz farklı bakmanız ve onu parçalara ayırmaya başlamanız gerekir. Parçaları iki yöne bölebiliriz. Öncelikle kontrol mantığını (iş kuralları, veri erişim kodu, kullanıcı hakları kodu, her türlü şey) kullanıcı arayüzünden ayırabiliriz. İkinci olarak, UI kodunu parçalara ayırabiliriz.
Bu yüzden ilk önce UI'yi parçalara ayırarak ilk kısmı yapacağız. Bunu yapmanın en kolay yolu, kullanıcı arabiriminizi usercontrols ile oluşturduğunuz tek bir ana bilgisayar formuna sahip olmaktır. Her kullanıcı kontrolü formun bir bölgesinden sorumlu olacak. Uygulamanızın bir kullanıcı listesi olduğunu hayal edin ve bir kullanıcıya tıkladığınızda aşağıdaki metin kutusunu doldurun. Kullanıcı listesinin görüntüsünü yöneten bir kullanıcı kontrolüne, ikincisini ise kullanıcı ayrıntılarının görüntüsünü yöneten bir kullanıcı kontrolüne sahip olabilirsiniz.
Buradaki asıl püf nokta, kontroller arasındaki iletişimi nasıl yönettiğinizdir. Formdaki 30 kullanıcı kontrolünün tüm rasgele tutulan birbirlerine referanslar almasını ve bunlara çağrı yöntemlerini istemiyorsunuz.
Böylece her kontrol için bir arayüz yaratıyorsunuz. Arayüz kontrolün kabul edeceği işlemleri ve meydana getirdiği olayları içerir. Bu uygulamayı düşündüğünüzde, liste kutusu liste seçiminin değişip değişmemesi umrunda değil, yeni bir kullanıcının değişmiş olmasıyla ilgileniyorsunuz.
Bu nedenle, örnek uygulamamızı kullanarak, kullanıcıların liste kutusunu barındıran kontrol için ilk arayüz, bir kullanıcı nesnesini ileten UserChanged adlı bir olayı içerecektir.
Bu harika, çünkü artık liste kutusundan sıkılıyorsanız ve 3 boyutlu zoomlu sihirli göz kontrolü istiyorsanız, aynı arayüze kodlamanız ve takmanız yeterli :)
Tamam, bu yüzden ikinci kısım, UI mantığını etki alanı mantığından ayırarak. Bu iyi giyilmiş bir yol ve burada MVP şablonuna bakmanızı tavsiye ederim. Bu gerçekten basit.
Her kontrol şimdi bir Görünüm (MVP'de V) olarak adlandırılıyor ve yukarıda ihtiyaç duyulanın çoğunu zaten ele aldık. Bu durumda, kontrol ve bunun için bir arayüz.
Tek eklediğimiz model ve sunucu.
Model, uygulama durumunuzu yöneten mantığı içerir. Bunları biliyorsunuz, kullanıcıları almak, veritabanına gitmek, bir kullanıcı eklediğinizde veritabanına yazmak vb. Buradaki fikir, tüm bunları, her şeyden tamamen yalıtılmış bir şekilde test edebilmenizdir.
Sunucu açıklamak için biraz daha zor. Model ve Görünüm arasında oturan bir sınıftır. Bu görünüm tarafından yaratılır ve daha önce tartıştığımız arayüzü kullanarak görünüm kendisini sunucuya aktarır.
Sunucu kendi arayüzüne sahip olmak zorunda değildir, ancak yine de bir tane oluşturmayı seviyorum. Sunucunun açıkça ne yapmasını istediğinizi yapar.
Böylece sunum yapan kişi, View'ın kullanıcı listesini almak için kullanacağı ListOfAllUsers gibi metodları ortaya koyar, alternatif olarak, bir AddUser metodu olarak da bir Görünüm koyabilir ve sunum yapandan bunu çağırabilirsiniz. Ben ikincisini tercih ederim. Bu şekilde sunum yapan kişi istediği zaman listeye bir kullanıcı ekleyebilir.
Presenter, seçilen kullanıcı düzenlenebilirse true değerini döndürecek CanEditUser gibi özelliklere de sahiptir. Görünüm daha sonra bilmesi gereken her şeyi sorgulayacaktır. Düzenlenebilir olanları siyah olarak isteyebilir ve yalnızca Gri olanları okuyabilirsiniz. Teknik olarak, UI odaklı olduğu için, Görünüm için bir karar, kullanıcının ilk etapta düzenlenebilir olup olmadığı Presenter içindir. Sunucu, Modelle konuştuğu için biliyor.
Yani özet olarak, MVP'yi kullanın. Microsoft, tanımladığım şekilde MVP kullanan SCSF (Smart Client Software Factory) adlı bir şey sağlar. Başka birçok şey yapıyor. Oldukça karmaşık ve her şeyi yapma şeklini beğenmedim, ancak yardımcı olabilir.