मुझे अपने C # प्रोजेक्ट के लिए एक श्रेणी पदानुक्रम डिजाइन करने की आवश्यकता है। मूल रूप से, वर्ग की कार्यक्षमताएं WinForms कक्षाओं के समान हैं तो आइए WinForms टूलकिट को एक उदाहरण के रूप में लेते हैं। (हालांकि, मैं WinForms या WPF का उपयोग नहीं कर सकता।)
कुछ मुख्य गुण और कार्य हैं जिन्हें हर वर्ग को प्रदान करने की आवश्यकता है। आयाम, स्थिति, रंग, दृश्यता (सही / गलत), ड्रा विधि, आदि।
मुझे डिजाइन सलाह की आवश्यकता है मैंने एक सार आधार वर्ग और इंटरफेस के साथ एक डिजाइन का उपयोग किया है जो वास्तव में प्रकार नहीं हैं, लेकिन व्यवहार की तरह अधिक हैं। क्या यह एक अच्छा डिज़ाइन है? यदि नहीं, तो बेहतर डिज़ाइन क्या होगा।
कोड इस तरह दिखता है:
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();
}
कुछ नियंत्रणों में अन्य नियंत्रण शामिल हो सकते हैं, कुछ केवल निहित (बच्चों के रूप में) हो सकते हैं इसलिए मैं इन कार्यात्मकताओं के लिए दो इंटरफेस बनाने की सोच रहा हूं:
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 प्रदर्शन पाठ को नियंत्रित करता है इसलिए यह इंटरफ़ेस में भी जाता है:
interface ITextHolder
{
string Text { get; set; }
int TextPositionX { get; set; }
int TextPositionY { get; set; }
int TextWidth { get; }
int TextHeight { get; }
void DrawText();
}
कुछ नियंत्रणों को उनके मूल नियंत्रण के अंदर डॉक किया जा सकता है:
enum Docking
{
None, Left, Right, Top, Bottom, Fill
}
interface IDockable
{
Docking Dock { get; set; }
}
... और अब कुछ ठोस वर्ग बनाते हैं:
class Panel : Control, IDockable, IContainer, IChild {}
class Label : Control, IDockable, IChild, ITextHolder {}
class Button : Control, IChild, ITextHolder, IDockable {}
class Window : Control, IContainer, IDockable {}
पहली "समस्या" मैं यहां सोच सकता हूं कि एक बार प्रकाशित होने के बाद इंटरफेस मूल रूप से पत्थर में सेट होते हैं। लेकिन मान लेते हैं कि मैं भविष्य में उन्हें परिवर्तन करने की आवश्यकता से बचने के लिए अपने इंटरफेस को अच्छा बनाने में सक्षम हूं।
इस डिजाइन में एक और मुद्दा यह है कि इन वर्गों में से प्रत्येक को इसे लागू करने की आवश्यकता होगी और कोड का दोहराव जल्दी होगा। उदाहरण के लिए लेबल और बटन में ड्राटेक्स्ट () विधि ITextHolder इंटरफ़ेस से या बच्चों के IContainer प्रबंधन से प्राप्त हर वर्ग से प्राप्त होती है।
इस मुद्दे के लिए मेरा समाधान इस "डुप्लिकेटेड" कार्यात्मकताओं को समर्पित एडेप्टर और उन्हें कॉल करने के लिए लागू करना है। तो लेबल और बटन दोनों में एक TextHolderAdapter सदस्य होता है जिसे ITextHolder इंटरफ़ेस से विरासत में मिली विधियों के अंदर कहा जाएगा।
मुझे लगता है कि इस डिज़ाइन से मुझे बेस क्लास में कई सामान्य कार्यात्मकताओं से बचना चाहिए जो कि आभासी तरीकों और अनावश्यक "शोर" के साथ जल्दी से फूला हुआ हो सकता है। व्यवहार के परिवर्तन का विस्तार एडेप्टर द्वारा किया जाएगा और नियंत्रण-व्युत्पन्न वर्ग से नहीं।
मुझे लगता है कि इसे "रणनीति" पैटर्न कहा जाता है और हालांकि उस विषय पर लाखों प्रश्न और उत्तर हैं, मैं आपसे आपकी राय पूछना चाहता हूं कि इस डिजाइन के लिए मैं क्या ध्यान रखता हूं और आप किन खामियों के बारे में सोच सकते हैं। मेरा दृष्टिकोण।
मुझे यह जोड़ना चाहिए कि लगभग 100% संभावना है कि भविष्य की आवश्यकताएं नई कक्षाओं और नई कार्यक्षमता के लिए कॉल करेंगी।
IChild
एक भयानक नाम की तरह लगता है।
System.ComponentModel.Component
याSystem.Windows.Forms.Control
या अन्य मौजूदा आधार वर्ग के किसी भी? आपको अपना खुद का नियंत्रण पदानुक्रम बनाने और खरोंच से इन सभी कार्यों को फिर से परिभाषित करने की आवश्यकता क्यों है?