oop - कौन सा वर्ग डिजाइन बेहतर है?




class-design (8)

कौन सा वर्ग डिजाइन बेहतर है और क्यों?

public class User
{
    public String UserName;
    public String Password;
    public String FirstName;
    public String LastName;
}

public class Employee : User
{
    public String EmployeeId;
    public String EmployeeCode;
    public String DepartmentId;
}

public class Member : User
{
    public String MemberId;
    public String JoinDate;
    public String ExpiryDate;
}

या

public class User
{
    public String UserId;
    public String UserName;
    public String Password;
    public String FirstName;
    public String LastName;
}

public class Employee
{
    public User UserInfo;
    public String EmployeeId;
    public String EmployeeCode;
    public String DepartmentId;
}

public class Member
{
    public User UserInfo;
    public String MemberId;
    public String JoinDate;
    public String ExpiryDate;
}

अपनी आवश्यकता बताते हुए / कल्पना 'सर्वश्रेष्ठ डिजाइन' पर पहुंचने में मदद कर सकता है।
आपका प्रश्न इस समय 'विषय-से-वाचक-व्याख्या' भी है।


अपने आप से निम्न प्रश्न पूछें:

  • क्या आप एक कर्मचारी को मॉडल बनाना चाहते हैं? यदि हां, तो विरासत चुना
  • क्या आप मॉडल के लिए एक कर्मचारी की जानकारी चाहते हैं? यदि हां, तो संरचना का उपयोग करें
  • क्या उपयोगकर्ता (सूचना) और कर्मचारी के बीच आभासी कार्य होते हैं? यदि हां, तो विरासत का उपयोग करें
  • क्या किसी कर्मचारी में उपयोगकर्ता (सूचना) के कई उदाहरण हैं? यदि हां, तो संरचना का उपयोग करें
  • क्या यह एक कर्मचारी वस्तु को उपयोगकर्ता (सूचना) ऑब्जेक्ट को असाइन करने का अर्थ रखता है? यदि हां, तो विरासत का उपयोग करें

सामान्य तौर पर, वास्तविकता को तैयार करने का प्रयास करें, जो आपके कार्यक्रम को अनुकरण करता है, कोड जटिलता की बाधाओं और आवश्यक दक्षता के तहत।


न तो एक अच्छा है बहुत अस्थिर राज्य आप उस श्रेणी का एक उदाहरण बनाने में सक्षम नहीं होना चाहिए जो एक अमान्य या आंशिक रूप से आरंभिक स्थिति में है।

उस ने कहा, दूसरा एक बेहतर है क्योंकि यह विरासत पर रचना का समर्थन करता है।


मुझे नहीं लगता कि संरचना हमेशा विरासत से बेहतर है (बस सामान्यतः)। अगर कर्मचारी और सदस्य वास्तव में उपयोगकर्ता हैं, और वे पारस्परिक रूप से अनन्य हैं, तो पहले डिजाइन बेहतर है उस परिदृश्य पर विचार करें जहां आपको किसी कर्मचारी का उपयोगकर्ता नाम एक्सेस करना है। आपके पास दूसरी डिज़ाइन का उपयोग करना होगा:

myEmployee.UserInfo.UserName

जो खराब है (डीमैटर का कानून), ताकि आप इसे पुनः लेंगे:

myEmployee.UserName

जिसके लिए कर्मचारी को उपयोगकर्ता वस्तु पर नियुक्त करने के लिए एक छोटी सी विधि की आवश्यकता होती है इनमें से सभी को पहले डिज़ाइन से बचा है।


यहाँ एक ऐसा परिदृश्य है जिसे आप के बारे में सोचना चाहिए:

संरचना (दूसरा उदाहरण) बेहतर है अगर समान उपयोगकर्ता एक कर्मचारी और सदस्य दोनों हो सकता है। क्यूं कर? क्योंकि दो उदाहरणों (कर्मचारी और सदस्य) के लिए जो एक ही उपयोगकर्ता का प्रतिनिधित्व करते हैं, यदि उपयोगकर्ता डेटा बदलता है, तो आपको इसे दो स्थानों में अपडेट नहीं करना पड़ता है केवल यूज़र इंस्टेंस में सभी यूजर सूचनाएं हैं, और केवल इसे अपडेट करना है। चूंकि कर्मचारी और सदस्य दोनों वर्गों में एक ही उपयोगकर्ता उदाहरण मौजूद है, इसलिए वे स्वचालित रूप से अपडेट की गई जानकारी शामिल करेंगे।


सवाल केवल उस उत्तराधिकारी मॉडल को "आईएस-ए" रिश्ते को पहचानकर उत्तर दिया जाता है, जबकि सदस्यता मॉडल "एचएएस-ए" रिश्ते

  • एक कर्मचारी आईएस एक उपयोगकर्ता है
  • एक कर्मचारी है एक userinfo

कौनसा सही है? यह आपका उत्तर है


आप यूजर (व्यक्ति) की भूमिका के रूप में कर्मचारी के बारे में भी सोच सकते हैं। एक उपयोगकर्ता की भूमिका समय में बदल सकती है (उपयोगकर्ता बेरोजगार बन सकता है) या उपयोगकर्ता एक ही समय में कई भूमिकाएं कर सकता है।

विरासत बहुत बेहतर है जब असली "एक" संबंध है, उदाहरण के लिए एप्पल - फल लेकिन बहुत सावधान रहें: सर्किल - अंडाकार वास्तविक नहीं है "एक" संबंध है, क्योंकि बिल्लियों की कमता "अंडाकार" की तुलना में कम है (सर्कल अंडाकार की अवस्था है) - देखें: सर्किल अंडाकार समस्या


अच्छा सवाल हालांकि सही और गलत के बारे में विकर्षणों से बचने के लिए मैं प्रत्येक दृष्टिकोण के पेशेवरों और विपक्षों के लिए पूछने पर विचार करता हूं - मुझे लगता है कि आप जो मतलब करते हैं वह बेहतर या बुरा है और क्यों वैसे भी ....

पहला दृष्टिकोण उर्फ ​​विरासत

पेशेवरों:

  • बहुलोफिक व्यवहार की अनुमति देता है
  • प्रारंभ में सरल और सुविधाजनक है

विपक्ष:

  • यदि अधिक व्यवहार और संबंध जोड़े जाते हैं तो समय के साथ जटिल या अनाड़ी बन सकता है।

दूसरा दृष्टिकोण उर्फ ​​रचना

पेशेवरों:

  • गैर-ऊप परिस्थितियों में अच्छी तरह से मानचित्र जैसे रिलेशनल टेबल, संरचित प्रोग्रामिंग, आदि
  • सीधा (यदि जरुरी सुविधाजनक नहीं है) संबंधों और व्यवहार को बढ़ाना है

विपक्ष:

  • कोई बहुरूपता इसलिए संबंधित सूचना और व्यवहार का उपयोग करने के लिए कम सुविधाजनक है

इन की तरह सूचियों + प्रश्न जॉन लिमपैप ने आपको निर्णय लेने और आरंभ करने में मदद करने के बारे में बताया - तो आप सही उत्तर क्या हो सकते हैं ;-)





class-design