मैं इस बारे में एक प्रश्न पूछना चाहता हूं कि आप एक साधारण ऑब्जेक्ट-उन्मुख डिजाइन समस्या से कैसे संपर्क करेंगे। इस परिदृश्य से निपटने का सबसे अच्छा तरीका मेरे बारे में मेरे कुछ विचार हैं, लेकिन मुझे स्टैक ओवरफ्लो समुदाय से कुछ राय सुनने में दिलचस्पी होगी। प्रासंगिक ऑनलाइन लेखों के लिंक भी सराहना की जाती है। मैं सी # का उपयोग कर रहा हूं, लेकिन सवाल भाषा विशिष्ट नहीं है।ऑब्जेक्ट ओरिएंटेड बेस्ट प्रैक्टिस - विरासत बनाम बनाम इंटरफेस
मान लीजिए मैं एक वीडियो स्टोर आवेदन जिसका डेटाबेस एक Person
टेबल है, PersonId
, Name
, DateOfBirth
और Address
क्षेत्रों के साथ लिख रहा हूँ। इसमें Staff
तालिका भी है, जिसमें PersonId
का लिंक है, और Customer
तालिका है जो PersonId
से भी जुड़ी है।
class Person {
public int PersonId { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
class Customer : Person {
public int CustomerId { get; set; }
public DateTime JoinedDate { get; set; }
}
class Staff : Person {
public int StaffId { get; set; }
public string JobTitle { get; set; }
}
अब हम एक समारोह लिख सकते हैं का कहना है कि सभी ग्राहकों के लिए ईमेल भेजने के लिए:
एक साधारण वस्तु उन्मुख दृष्टिकोण कहना है कि एक Customer
Person
"एक" और इसलिए कक्षाएं इस तरह एक सा बनाने होगा :
static void SendEmailToCustomers(IEnumerable<Person> everyone) {
foreach(Person p in everyone)
if(p is Customer)
SendEmail(p);
}
यह प्रणाली तब तक ठीक काम करती है जब तक हमारे पास कोई ग्राहक न हो और कर्मचारी दोनों सदस्य हो। यह मानते हुए कि हम नहीं वास्तव में हमारे everyone
सूची एक बार एक Customer
के रूप में और एक बार एक Staff
के रूप में, दो बार में एक ही व्यक्ति के लिए चाहते हैं, हम के बीच स्वेच्छाचारी पसंद करते हैं:
class StaffCustomer : Customer { ...
और
class StaffCustomer : Staff { ...
स्पष्ट रूप से केवल इन दोनों में से पहला SendEmailToCustomers
फ़ंक्शन नहीं तोड़ देगा।
तो आप क्या करेंगे?
Person
वर्ग बनाओ एकStaffDetails
औरCustomerDetails
वर्ग के लिए वैकल्पिक संदर्भ है?- एक नई कक्षा बनाएं जिसमें
Person
, प्लस वैकल्पिकStaffDetails
औरCustomerDetails
शामिल है? - सबकुछ एक इंटरफ़ेस बनाएं (उदा।
IPerson
,IStaff
,ICustomer
) और उचित इंटरफेस लागू करने वाले तीन वर्ग बनाएं? - एक और पूरी तरह से अलग दृष्टिकोण ले लो?
हां, और अब आप एक कार्यान्वयन चुन सकते हैं और अन्य कोड तोड़ने के बाद बाद में अपना मन बदल सकते हैं। –