C # projem için bir sınıf hiyerarşisi tasarlamam gerekiyor. Temel olarak, sınıfın işlevleri WinForms sınıflarına benzer, bu yüzden örnek olarak WinForms araç setini ele alalım. (Ancak, WinForms veya WPF kullanamıyorum.)
Her sınıfın sağlaması gereken bazı temel özellikler ve işlevler vardır. Boyutlar, konum, renk, görünürlük (doğru / yanlış), Çizim yöntemi vb.
Tasarım tavsiyesine ihtiyacım var Soyut bir temel sınıf ve gerçekten tipte değil, daha çok davranışa benzer arayüzlere sahip bir tasarım kullandım. Bu iyi bir tasarım mı? Değilse, daha iyi bir tasarım ne olurdu.
Kod şöyle görünür:
abstract class Control
{
public int Width { get; set; }
public int Height { get; set; }
public int BackColor { get; set; }
public int X { get; set; }
public int Y { get; set; }
public int BorderWidth { get; set; }
public int BorderColor { get; set; }
public bool Visible { get; set; }
public Rectangle ClipRectange { get; protected set; }
abstract public void Draw();
}
Bazı Kontroller başka Kontroller içerebilir, bazıları sadece çocuk olarak bulunabilir (bu yüzden bu işlevler için iki arayüz yapmayı düşünüyorum:
interface IChild
{
IContainer Parent { get; set; }
}
internal interface IContainer
{
void AddChild<T>(T child) where T : IChild;
void RemoveChild<T>(T child) where T : IChild;
IChild GetChild(int index);
}
WinForms ekran metnini kontrol eder, böylece bu arayüze de girer:
interface ITextHolder
{
string Text { get; set; }
int TextPositionX { get; set; }
int TextPositionY { get; set; }
int TextWidth { get; }
int TextHeight { get; }
void DrawText();
}
Bazı Kontroller ana Kontrolleri içine yerleştirilebilir, böylece:
enum Docking
{
None, Left, Right, Top, Bottom, Fill
}
interface IDockable
{
Docking Dock { get; set; }
}
... ve şimdi somut sınıflar oluşturalım:
class Panel : Control, IDockable, IContainer, IChild {}
class Label : Control, IDockable, IChild, ITextHolder {}
class Button : Control, IChild, ITextHolder, IDockable {}
class Window : Control, IContainer, IDockable {}
Burada aklıma gelen ilk "sorun", arayüzlerin yayınlandıktan sonra temelde taşa yerleştirilmiş olmasıdır. Ancak diyelim ki gelecekte arayüzlerde değişiklik yapma ihtiyacını ortadan kaldıracak şekilde arayüzlerimi yeterince iyi hale getirebiliyorum.
Bu tasarımda gördüğüm bir başka sorun, bu sınıfların her birinin arayüzlerini uygulaması gerekeceği ve kodun çoğaltılması hızlı bir şekilde gerçekleşecek. Örneğin, Etiket ve Düğme'de DrawText () yöntemi ITextHolder arabiriminden veya çocukların IContainer yönetiminden türetilen her sınıftan türetilir.
Bu konudaki çözümüm, bu "çoğaltılmış" işlevleri özel bağdaştırıcılara uygulamak ve çağrıları yönlendirmektir. Dolayısıyla, Label ve Button öğelerinin her ikisi de ITextHolder arabiriminden devralınan yöntemlerin içinde çağrılacak bir TextHolderAdapter üyesine sahip olacaktır.
Bu tasarım beni temel sınıfta sanal yöntemler ve gereksiz "gürültü kodu" ile şişirilebilecek birçok ortak işleve sahip olmaktan kurtarmalıdır. Davranış değişiklikleri, Control türevi sınıfları değil, bağdaştırıcıları genişleterek gerçekleştirilebilir.
Bence buna "Strateji" kalıbı deniyor ve bu konuda milyonlarca soru ve cevap olmasına rağmen, bu tasarım için neleri dikkate aldığımı ve hangi kusurları düşünebileceğinizi düşünmek istiyorum. benim yaklaşımım.
Şunu da eklemeliyim ki, gelecekteki gereksinimler yeni sınıflar ve yeni işlevler gerektirecek neredeyse% 100 şansı var.
IChild
korkunç bir isim gibi görünüyor.
System.ComponentModel.Component
veyaSystem.Windows.Forms.Control
veya diğer mevcut baz sınıfların herhangi? Neden kendi kontrol hiyerarşinizi oluşturmanız ve tüm bu işlevleri tekrar sıfırdan tanımlamanız gerekiyor?