वर्ग विधियों की संख्या की सीमा क्या है?


22

विभिन्न डिज़ाइन पुस्तकों में जो मैं पढ़ता हूं, कभी-कभी बड़ा जोर उन तरीकों की संख्या पर लगाया जाता है जो एक वर्ग के पास होना चाहिए (उदाहरण के लिए, एक ओओ भाषा के रूप में, जावा या सी # के रूप में)। अक्सर उन पुस्तकों में रिपोर्ट किए गए उदाहरण बहुत साफ और सरल होते हैं, लेकिन शायद ही कभी वे "गंभीर" या जटिल मामले को कवर करते हैं।
हालाँकि रेंज 5 और 8 के बीच की लगती है।

एक परियोजना में मैंने एक वर्ग "नोट" विकसित किया, गुणों के रूप में इसके अट्रिब्यूशन के साथ: शीर्षक, विवरण, क्रिएटडेट, आदि।
फिर कुछ बुनियादी तरीके जैसे: getRelations (यदि नोट अलग-अलग दस्तावेजों को सौंपा गया है), getExpiratDate, ect।

हालाँकि, अनुप्रयोग के विकास में आगे बढ़ते हुए, अधिक कार्यक्षमता की आवश्यकता थी, और इसलिए, अधिक विधियाँ।

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

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


3
लगता है कि इंसानों के पास इनबिल्ट भूल रेंज है। एक बार जब आप पिछले सात विकल्पों को प्राप्त कर लेते हैं तो पहले कुछ को भूल जाना शुरू कर देते हैं। इसलिए प्रति इंटरफ़ेस 7 से अधिक लोगों को विकल्प न दें।
मार्टिन यॉर्क

+ 1 @ मार्टिन-
or

यह सीमा केवल अल्पकालिक स्मृति के लिए है। अन्यथा, हम संभवतः उन सभी विभिन्न अक्षरों और शब्दों को कैसे याद रख सकते हैं? गंभीरता से, यदि कक्षा का भारी उपयोग होने जा रहा है, तो आप इसे मिनी-भाषा के रूप में सोच सकते हैं, और आपके पास इसके साथ जो भी करना है, उसे व्यक्त करने के लिए कई तरीके हैं।
आर्टेम


जवाबों:


30

जितनी जरूरत हो उतने तरीके अपनाएं। मैं अगर संभव हो तो उस 5-8 नियम को सार्वजनिक तरीकों की संख्या को कम रखने की कोशिश करूंगा। ईमानदारी से, अधिकांश लोगों को इसके विपरीत समस्या होती है, जहां उनके पास पागल सुपर-विधियाँ होती हैं जिन्हें अधिक नहीं, कम करने की आवश्यकता होती है। यह वास्तव में कोई फर्क नहीं पड़ता कि आपके पास कितने निजी सहायक तरीके हैं। वास्तव में, यदि आप जावा में 8 विधियों से नीचे रहते हैं, तो आप एक वर्ग के साथ सीमा को मार सकते हैं जिसमें केवल एक निर्माता, एक स्ट्रिंग, और 3 गुणों के लिए गेट्टर / सेटर है ... जो वास्तव में एक मजबूत वर्ग नहीं है। लब्बोलुआब यह है कि, इस बारे में चिंता न करें कि आपकी कक्षा कितने तरीके की है। यह सुनिश्चित करने के बारे में चिंता करें कि आपकी कक्षा असंबंधित चिंताओं पर नहीं चलती है, और आपके पास एक उचित सार्वजनिक इंटरफ़ेस है जिसमें विधियों को समझना आसान है।


सही है, लेकिन अगर यह एक उपयोगिता वर्ग है, तो 10-15 तक ठीक है।
सिड

1
@SidCool - मैं यह नहीं कह रहा हूं कि मैं उनका कभी उपयोग नहीं करता, लेकिन उपयोगिता कक्षाएं वास्तव में शुरू करने के लिए सबसे अच्छा अभ्यास नहीं हैं। वे आम तौर पर सिर्फ एक मिनी भगवान वर्ग होते हैं जो एक साथ असंबंधित चिंताओं का एक गुच्छा डालते हैं। इसे ध्यान में रखते हुए, एक उपयोगिता वर्ग वास्तव में बिल्कुल मौजूद नहीं होना चाहिए, 15 विधियों के साथ बहुत कम।
मॉर्गन हेरलॉकर

1
मेरा वर्ग "नोट" एक उपयोगिता वर्ग नहीं है। यह एक व्यावसायिक वस्तु (एक नोट जो एक दस्तावेज़ में टिप्पणी और विवरण जोड़ सकता है) का प्रतिनिधित्व करता है। हालांकि मैं "उपयोगिता" वर्गों के खतरे के बारे में आयरनकोड से सहमत हूं। वे मदद में आते हैं जब हम अपनी डिलीवरी की समय सीमा के साथ जल्दी में होते हैं, लेकिन मुझे लगता है कि अक्सर उनके लिए एक बेहतर समाधान / डिजाइन होता है।
फ्रांसेस्को

13

उत्तर वास्तव में सरल है: एक कक्षा में वह सब कुछ रखें जो उसकी जिम्मेदारियों से संबंधित है, लेकिन जिम्मेदारियां सौंपते समय सावधान रहें।

कभी-कभी एक बड़ा वर्ग विभिन्न जिम्मेदारियों के साथ छोटी कक्षाओं का एक संयोजन होता है।

सामान्य तौर पर, मैं जिम्मेदारियों को छोटी कक्षाओं में विभाजित करने का प्रयास करता हूं जब वर्ग अपने उपयोग या रखरखाव में अनिर्दिष्ट हो जाता है। मेरे पास शायद ही कभी ऐसी कक्षाएं हैं जो 500 लाइनों से अधिक लंबी हैं। मेरी सबसे बड़ी कक्षाओं में सन्निकट 1.5k स्थान हैं।

आप बस एक सामान्य नियम नहीं बता सकते हैं, जैसे "एक वर्ग को n और m विधियों के बीच होना चाहिए"।


8

केवल इतने तरीकों के होने का कोई कारण (OO डिजाइन में) नहीं है। यह भी सच नहीं है कि कम विधियों वाला एक वर्ग बेहतर विघटित होता है।

उदाहरण के लिए java.lang.String वर्ग देखें। बहुत सारे तरीके, क्योंकि बहुत सारी चीजें हैं जो एक स्ट्रिंग के साथ कर सकते हैं। फिर भी दृढ़ता से युग्मित नहीं।

मुझे आश्चर्य है कि 15 जैसी एक जादू की संख्या अच्छे और बुरे डिजाइन को अलग क्यों कर सकती है। नहीं, यह इतना आसान नहीं है।


मैं सहमत हूं, 15 की संख्या सिर्फ उन डिजाइनिंग किताबों को पढ़ने से प्राप्त हुआ है, (उदाहरण के लिए स्टीवन मैककोनेल द्वारा "कोड कम्प्लीट"। वास्तव में स्ट्रिंग वर्ग में एक ही इकाई के लिए सभी तरीकों की मिरादाद है और सभी वास्तविक हैं।
फ्रांसेस्को

@ लुका: उन पुस्तकों में से कुछ के साथ समस्या यह है कि उदाहरण अक्सर विपरीत होते हैं और इसलिए कई वास्तविक दुनिया के उदाहरणों से छोटे होते हैं।
FrustratedWithFormsDesigner

वास्तव में ... संभवतः अवधारणाओं को सबसे अधिक स्पष्ट करने के लिए और खरीदारों के संभावित आधार को भी बड़ा करने के लिए ...
फ्रांसेस्को

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

6

PMD में, TooManyMethods नियम का डिफ़ॉल्ट व्यवहार संभावित त्रुटियों के रूप में 10 या अधिक विधियों के साथ कक्षाओं की पहचान करना और ध्वजांकित करना है। यह सिर्फ एक मनमाना संख्या है, हालांकि। यह आसानी से एक विन्यास में बदल गया है। यह संख्या चाहे जो भी हो, यह किसी डेवलपर के लिए एक वर्ग को देखने और देखने के लिए एक ध्वज है कि क्या कोई मुद्दा है, नहीं कि इसके साथ कोई समस्या है।

कुछ और जो थोड़ा अधिक ठोस है वह 7 प्लस / माइनस 2 नियम हो सकता है । यह बताता है कि मानव मन स्मृति में 5 और 9 "वस्तुओं" के बीच पकड़ और बना सकता है। जब किसी विशेष वर्ग को पढ़ते हैं, तो वस्तुएं उन कक्षाओं को बनाने के तरीकों और क्षेत्रों की सबसे अधिक संभावना होगी। हालांकि, कक्षाएं अक्सर, 9 से अधिक क्षेत्रों और तरीकों भले ही आप accessors, mutators और किसी भी मानक संचालन गिनती नहीं है (उदाहरण के लिए, toString(), hashCode(), और equals()जावा में)।

सबसे प्रासंगिक उपाय फैन-इन और फैन-आउट और युग्मन और सामंजस्य की चर्चा करना होगा । एकल जिम्मेदारी सिद्धांत और चिंताओं की जुदाई लागू किया जाना चाहिए - एक वर्ग या एक बात और अकेले एक बात का प्रतिनिधित्व करना चाहिए। ये डिज़ाइन या कार्यान्वयन का आकलन करते समय अधिकतम / न्यूनतम संख्याओं को संख्याएँ निर्दिष्ट करने की कोशिश करने से बेहतर हैं।


+1 - 7 + -2 नियम एक ऐसा नियम है जिसके द्वारा प्रयोज्यता का संबंध है।
मॉर्गन हेरलॉकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.