2011-03-15 11 views
5

इनमें से कौन सा पसंदीदा होना चाहिए?बेस क्लास बनाम यूटिलिटी क्लास

कुछ तरीकों जो क्लास ए, बी और सी

द्वारा कहा जाता है उन तरीकों एक वर्ग डी (ए, बी और सी के आधार) में समाहित किया जाना चाहिए?

या

उन तरीकों एक वर्ग यू और अन्य वर्गों के creats यह के रूप में आवश्यक तरीकों का उपयोग करने के लिए वस्तु है में समाहित किया जाना चाहिए।

किस आधार पर निर्णय लिया जाना चाहिए?

धन्यवाद।

+4

कक्षा ए, बी, और सी के बीच कोई वैचारिक संबंध है? –

+0

एक इंटरफ़ेस बनाने और ए, बी, सी द्वारा कार्यान्वित करने के बारे में कैसे? –

+0

@p: केवल वे कक्षा डी द्वारा उपयोग किए गए डेटा का निर्माण करते हैं। ए को अन्य कक्षाओं की तुलना में अलग-अलग इनपुट की आवश्यकता होती है। @ श्रीनिवास: उन तरीकों का कार्यान्वयन ए, बी और सी – Azodious

उत्तर

9

आपको static उपयोगिता वर्ग बनाना चाहिए।

केवल विरासत का उपयोग करता है, तो यह वास्तव में सार्थक है — अगर A, B, और C वास्तव में एक D हैं।

+0

हाँ के लिए बिल्कुल समान है, मुझे लगता है। डी में विधियां हैं जो तीन प्रकार के कुछ एल्गोरिदम का आह्वान करती हैं। ए, बी और सी एल्गोरिदम के लिए विशिष्ट डेटा का निर्माण करते हैं और निष्पादन के लिए उन सामान्य तरीकों को कॉल करते हैं। – Azodious

+0

@Azo: विस्तार हमेशा मदद करता है। उस स्थिति में, शायद आपको 'ए',' बी' और 'सी' द्वारा ओवरराइड 'अमूर्त' विधि के साथ विरासत का उपयोग करना चाहिए। – SLaks

+0

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

2

जब तक कोई स्पष्ट एक संबंध है तो मैं विरासत से दूर रहूंगा। मुझे उपरोक्त आपके विवरण से संदेह है कि यह मामला नहीं है। मेरे वरीय समाधान होगा:

  1. अपने ए, बी, सी
  2. में एक उपयोगिता वर्ग का एक उदाहरण इंजेक्षन है ए, बी, सी का दृष्टांत उचित उपयोगिता वर्गों

लाभ कक्षा को इंजेक्शन देने का यह है कि आप विभिन्न कार्यान्वयन को तुच्छ रूप से प्रदान कर सकते हैं। यह परीक्षण के लिए विशेष रूप से उपयोगी है। स्थिर तरीकों वाले सिंगलेट या कक्षाएं इसी कारण से समस्याएं पैदा करती हैं - आप उन्हें आसानी से ओवरराइड या प्रतिस्थापित नहीं कर सकते हैं।

3

यदि वे कक्षाएं ए, बी और सी के लिए विशिष्ट चीजें कर रहे हैं तो मैं निर्णय लेता हूं कि वे क्या कर रहे हैं, तो वे बेस क्लास में होना चाहिए। यह कक्षा से संबंधित कार्यक्षमता को शेष सिस्टम से दूर छुपाकर, कोड को साफ रखने में मदद करता है। (बेशक, मुझे लगता है कि ए, बी और सी या तो पहले ही डी से प्राप्त होते हैं, या स्पष्ट रूप से संबंधित हैं)

यदि वे अन्य प्रकार के साथ चीजें कर रहे हैं, जो ए, बी और सी करते हैं, फिर पुन: उपयोग के अवसरों को अधिकतम करने के लिए वे एक उपयोगिता वर्ग में होना चाहिए।

यदि वे अन्य प्रकारों के साथ चीजें कर रहे हैं जो कि अन्य प्रकार के विशिष्ट हैं (उदाहरण के लिए एक समय-समय पर प्रिंटिंग) प्रकार के लिए उन्हें विस्तार विधियों को बनाने पर विचार करें।

+1

+1: आपने मुझे इसे हराया। जैसा कि स्लैक्स का उल्लेख है, ऐसा लगता है कि ओपी को स्थिर कार्यों के बारे में पता नहीं है। शायद उपयोगिता वर्ग के लिए भी उल्लेखनीय लायक है। –

0

बेस क्लास का उपयोग करें यदि आप केवल बेस क्लास के आधार पर कुछ तर्क लिखने जा रहे हैं - तो यह बेस क्लास बनाने के लिए समझ में आता है। उस स्थिति में आपकी व्युत्पन्न कक्षा आपकी बेस क्लास के लिए पूरी तरह से प्रतिस्थापन योग्य होनी चाहिए। व्युत्पन्न प्रकार की जांच करने और तदनुसार कार्य करने के लिए कोई स्विच तर्क नहीं होना चाहिए।Liskov प्रतिस्थापन सिद्धांत देखें: कुछ भाषाएं http://en.wikipedia.org/wiki/Liskov_substitution_principle

उपयोग उपयोगिता कक्षा सीमा यह है कि वे एक से अधिक भाग का समर्थन नहीं करते है। यदि आपके पास पहले से ही एक सार्थक आधार वर्ग है तो आपको उपयोगिता वर्ग के लिए जाना होगा। इसके अलावा, जब आप विरासत का उपयोग कर रहे हैं तो आप घिरे वर्ग से बेस क्लास के बीच तंग युग्मन बना रहे हैं।

यदि व्युत्पन्न वर्ग अपनी बेस क्लास के लिए स्वाभाविक रूप से प्रतिस्थापन योग्य है तो मैं बेस क्लास के लिए जाऊंगा। यदि उद्देश्य कक्षाओं के बीच कुछ पुन: प्रयोज्य कोड साझा करना है, तो यह उपयोगिता वर्ग के साथ जाने के लिए और अधिक समझ में आता है।