Geçmişte, uygulamamda Windows formlarının uzantısına izin vermek için kalıtım kullandım. Tüm formlarımın ortak denetimleri, resimleri ve işlevleri varsa, ortak denetimleri ve işlevleri uygulayan bir temel form oluşturur ve sonra diğer denetimlerin bu temel formdan devralmasına izin veririm. Ancak, bu tasarımla ilgili birkaç sorunla karşılaştım.
Kontroller aynı anda yalnızca bir kapta olabilir, bu nedenle sahip olduğunuz statik kontroller zor olacaktır. Örneğin: Bu sınıfın diğer (türetilmiş) tüm örneklerinin aynı TreeView'i değiştirebilmesi ve görüntüleyebilmesi için korumalı ve statik hale getirdiğiniz bir TreeView içeren BaseForm adında bir temel formunuz olduğunu varsayalım. Bu, BaseView'den devralınan birden çok sınıf için işe yaramaz, çünkü TreeView her seferinde yalnızca bir kapta olabilir. Başlatılan son formda olabilir. Her örnek denetimi düzenleyebilse de, belirli bir zamanda yalnızca bir tanesinde görüntülenir. Tabii ki, geçici çözümler var, ama hepsi çirkin. (Bu benim için gerçekten kötü bir tasarım gibi görünüyor. Neden birden fazla kap işaretçileri aynı nesneye depolayamıyor? Her neyse, bu ne.)
Formlar arasındaki durum, yani düğme durumları, etiket metni vb. Yükler için genel değişkenler kullanmalı ve durumları sıfırlamalıyım.
Bu, Visual Studio'nun tasarımcısı tarafından gerçekten iyi desteklenmiyor.
Kullanılacak daha iyi, ancak yine de kolayca bakım yapılabilen bir tasarım var mı? Yoksa form mirası hala en iyi yaklaşım mı?
Güncelleme Ben MVC bakarak MVP gözlemci desen olay desen gitti. Şu an için düşündüğüm şey, lütfen eleştir:
BaseForm sınıfım yalnızca denetimleri ve bu denetimlere bağlı olayları içerir. Bunları işlemek için herhangi bir mantık gerektiren tüm olaylar derhal BaseFormPresenter sınıfına iletilir. Bu sınıf kullanıcı arabirimindeki verileri işleyecek, mantıksal işlemleri gerçekleştirecek ve daha sonra BaseFormModel'i güncelleyecektir. Model, eyalet değişiklikleri üzerine tetiklenecek olayları abone olacağı (veya gözlemleyeceği) Presenter sınıfına gösterecektir. Presenter olay bildirimini aldığında, herhangi bir mantık gerçekleştirecek ve daha sonra Presenter, Görünümü buna göre değiştirecektir.
Bellekte her Model sınıfından yalnızca biri olacaktır, ancak muhtemelen BaseForm ve dolayısıyla BaseFormPresenter'ın birçok örneği olabilir. Bu, her BaseForm örneğini aynı veri modeline eşitleme sorunumu çözecektir.
Sorular:
Formlar arasında kullanıcı için (bir CSS menüsünde olduğu gibi) vurgulanmaya devam edebilmem için son basılan düğme gibi hangi katmanı depolamalıyım?
Lütfen bu tasarımı eleştirin. Yardımın için teşekkürler!