कितने पैरामीटर बहुत अधिक हैं? [बन्द है]


228

रूटीन पैरामीटर हो सकते हैं, यह कोई खबर नहीं है। आप आवश्यकतानुसार कई मापदंडों को परिभाषित कर सकते हैं, लेकिन उनमें से बहुत से आपकी दिनचर्या को समझना और बनाए रखना मुश्किल हो जाएगा।

बेशक, आप एक वर्कअराउंड के रूप में एक संरचित चर का उपयोग कर सकते हैं: उन सभी चर को एक एकल संरचना में डालकर और इसे रूटीन में पास करें। वास्तव में, पैरामीटर सूचियों को सरल बनाने के लिए संरचनाओं का उपयोग करना कोड पूरा में स्टीव मैककोनेल द्वारा वर्णित तकनीकों में से एक है । लेकिन जैसा कि वह कहते हैं:

सावधानीपूर्वक प्रोग्रामर डेटा को बंडल करने से बचते हैं जो तार्किक रूप से आवश्यक है।

इसलिए यदि आपकी दिनचर्या में बहुत अधिक पैरामीटर हैं या आप एक बड़े पैरामीटर सूची को छिपाने के लिए एक संरचना का उपयोग करते हैं, तो आप शायद कुछ गलत कर रहे हैं। यही है, आप युग्मन को ढीला नहीं रख रहे हैं।

मेरा सवाल है, जब मैं एक पैरामीटर सूची को बहुत बड़ा मान सकता हूं? मुझे लगता है कि 5 से अधिक पैरामीटर, बहुत अधिक हैं। तुम क्या सोचते हो?


1
बस यहाँ इस प्रश्न का संदर्भ दिया जा रहा है, जो कि कितने मापदंडों के लिए एक व्यावहारिक उदाहरण है ...
गिदोन

5
जावास्क्रिप्ट में 65537 पैरामीटर बहुत अधिक हैं: jsfiddle.net/vhmgLkdm
Aadit M Shah

बस अपाचे http घटकों को देखो यह लगभग कुछ बाहर गतिशील बनाने के लिए असंभव है
एंड्रयू स्कॉट इवांस

जवाबों:


162

जब किसी चीज़ को इतना अश्लील माना जाता है कि उसे ऐसा कुछ कहा जा सकता है जिसे मुक्त भाषण के लिए 1 संशोधन की गारंटी के बावजूद विनियमित किया जा सकता है? जस्टिस पॉटर स्टीवर्ट के अनुसार, "जब मैं इसे देखता हूं तो मुझे पता है।" वही यहाँ धारण करता है।

मुझे इस तरह के कठिन और तेज़ नियम बनाने से नफरत है क्योंकि उत्तर न केवल आपकी परियोजना के आकार और दायरे के आधार पर बदलता है, बल्कि मुझे लगता है कि यह मॉड्यूल स्तर तक भी बदल जाता है। आपकी विधि क्या कर रही है, या कक्षा को क्या दर्शाया जाना चाहिए, इसके आधार पर, यह संभव है कि 2 तर्क बहुत अधिक हैं और बहुत अधिक युग्मन का लक्षण है।

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

अपने सहयोगियों को अपना काम दिखाने से कभी न डरें। यदि आप डरते हैं, तो शायद यह बड़ा संकेत है कि आपके कोड में कुछ गड़बड़ है, और यह कि आप पहले से ही जानते हैं


एक अच्छा नियम-आधारित अंगूठे सीपीयू रजिस्टरों की संख्या है, क्योंकि अब और संकलक को स्टैक पर उन्हें आवंटित करने के लिए मजबूर किया जाएगा।
माइकल

1
@ माइकल एंजेल 007 जिस उत्तर के बारे में आप टिप्पणी कर रहे हैं, आपको ऐसा नहीं कहना चाहिए, क्योंकि यह बताता है कि कोई नियम नहीं है। इसके अलावा, मापदंडों की संख्या पठनीयता का विषय है, प्रदर्शन नहीं।
क्लैंप 6r

1
@ clemp6r गलत - यह दोनों है । कंपाइलर लोगों को हर समय "रजिस्टर स्पिल" से निपटना पड़ता है। केवल आधिकारिक जवाब क्या आपके संकलक पैदा कर रहा है की विधानसभा का निरीक्षण करने के लिए है। रजिस्टरों की संख्या जादुई रूप से एक ही प्लेटफॉर्म पर नहीं बदलती है। en.wikipedia.org/wiki/Register_allocation
माइकल

124

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

HWND CreateWindowEx
(
  DWORD dwExStyle,
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName,
  DWORD dwStyle,
  int x,
  int y,
  int nWidth,
  int nHeight,
  HWND hWndParent,
  HMENU hMenu,
  HINSTANCE hInstance,
  LPVOID lpParam
);

यह 12 पैरामीटर है (9 यदि आप x, y, w और h को एक आयत के रूप में बंडल करते हैं) और साथ ही साथ वर्ग नाम से व्युत्पन्न पैरामीटर भी हैं। आप इसे कैसे कम करेंगे? क्या आप संख्या को बिंदु तक कम करना चाहते हैं?

मापदंडों की संख्या को परेशान न होने दें, बस यह सुनिश्चित करें कि यह तार्किक और अच्छी तरह से प्रलेखित है और अंतर्मुखी * आपकी मदद करें।

* अन्य कोडिंग सहायक उपलब्ध हैं!


37
मैं इसे वोट कर रहा हूं। मैं "3" और "4" कहकर अन्य सभी उत्तरों से चकित हूं! सही उत्तर है: न्यूनतम आवश्यक, जो कभी-कभी काफी कम हो सकता है।
टोनी एंड्रयूज

16
अगर उस फंक्शन को आज डिजाइन किया जाता तो शायद यह थोड़ा अलग होता। x, y, nWidth और nHeight को आयत वस्तु में बांधा जा सकता है। शैली और xStyle को एनम या स्ट्रिंग्स के एक सेट में जोड़ा जा सकता है। अब आपके पास केवल 8 पैरामीटर हैं।
फाइननव

16
@finnw अगर उस फंक्शन को आज डिजाइन किया जाता? इसे पहले ही नया रूप दिया जा चुका है। फॉर्म एफ = नया फॉर्म (); 0 पैरामीटर है।
निक

36
यह C और winapi है। मैं इससे बदतर उदाहरण के बारे में नहीं सोच सकता।
L --o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e

17
नहीं नहीं। यह प्रक्रियात्मक शैली है। विंडोज ऑब्जेक्ट्स हैं, इसलिए यह अब ओबोसलेट है। आज, यह समेकित वर्गों के साथ हल किया जाएगा, मापदंडों के गुच्छा के साथ नहीं। अच्छे डिजाइन का सहज नियम है यदि आप एक साधारण वाक्य में फ़ंक्शन (मापदंडों सहित) का वर्णन नहीं कर सकते हैं, तो इसे खराब तरीके से डिज़ाइन किया गया है । मेरा मानना ​​है कि यह मामला है।
जन तुरो

106

में स्वच्छ कोड , रॉबर्ट सी मार्टिन विषय के लिए चार पृष्ठों समर्पित कर दिया। यहाँ है जिस्ट:

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


2
मुझे संदेह है कि इसमें "यह" शामिल है क्योंकि यह निष्पादन का संदर्भ है। कार्यात्मक प्रोग्रामिंग में, संदर्भ वैश्विक है और ऊप में, संदर्भ वह वस्तु है जिस पर आप विधि लागू कर रहे हैं। इसके अलावा, यदि आप पैरामीटर सूची में "इसे" शामिल करते हैं, तो 0 पैरा (आदर्श) होना असंभव होगा।
टॉम

1
नहीं, इसमें "यह" शामिल नहीं है।
पैट्रिक मैकेलेनै

20
इसके अलावा, मार्टिन को C ++ मानक समिति के साथ एक शब्द होना चाहिए। आधा <एल्गोरिथम> 3 से अधिक पैरामीटर लेता है, क्योंकि सिर्फ एक पुनरावृत्ति सीमा 2 पहले से ही है। यह सिर्फ iterators (यानी STL संग्रह के साथ सामान्य प्रोग्रामिंग) के साथ प्रोग्रामिंग की प्रकृति है।
स्टीव जेसोप

3
@SteveJessop: <एल्गोरिथम> का दोष यह है कि यह हमेशा एक स्लाइस पर काम करता है। यदि एल्गोरिथ्म और संग्रह को फिर से डिज़ाइन किया जाना था, तो मैं एल्गोरिदम को हमेशा एक संपूर्ण संग्रह बनाऊंगा, और आपको एल्गोरिदम को भागों पर काम करने की अनुमति देने के लिए संग्रह का एक दृश्य टुकड़ा करने का एक तरीका मिलेगा; वैकल्पिक रूप से मैं सामान्य मामले पर काम करना आसान बनाने के लिए एक शॉर्टहैंड ओवरराइड को परिभाषित करूंगा।
झूठ रेयान

3
@ लिरियन: जबकि अगर मैं पुनः डिजाइन कर <algorithm>रहा होता तो मैं इसे एक रेंज ऑब्जेक्ट पर काम करता। संग्रह रेंज होंगे, लेकिन सभी रेंज संग्रह नहीं होंगे। और वास्तव में, बढ़ावा पहले से ही किया है। वैसे भी, मेरा कहना है कि बड़े पैमाने पर व्यापक रूप से उपयोग की जाने वाली लाइब्रेरी इस सलाह को अनदेखा करती है, इसलिए सबसे खराब कि आपके साथ ऐसा होने की गारंटी है , तो यह है कि आपके लाखों उपयोगकर्ता आपके इंटरफ़ेस में मामूली सरलीकरण के साथ छेड़छाड़ करेंगे ;-)
स्टीव जेसोप

79

कुछ कोड जो मैंने पहले इस्तेमाल किए गए वैश्विक चर के साथ काम किए हैं, बस बहुत सारे मापदंडों को पारित करने से बचने के लिए।

कृपया ऐसा मत करो!

(आमतौर पर।)


कुछ कोड मैं उसी चीज़ को प्राप्त करने के लिए इस्तेमाल किए गए क्लास सदस्यों पर काम कर रहा था। उस समय मैं एक सी प्रोग्रामर था और मैंने पूछा, इतने सारे वैश्विक चर क्यों हैं, इनपुट / आउटपुट स्पष्ट रूप से पैरामीटर क्यों नहीं हो सकते?
user3528438

38

यदि आप हस्ताक्षर में मापदंडों को मानसिक रूप से गिनना शुरू करते हैं और उन्हें कॉल से मिलाते हैं, तो यह रिफलेक्टर करने का समय है!


यह बहुत अच्छा जवाब है। यदि पैरामीटर तार्किक (x, y, w, h) व्यवस्थित हैं, तो उन सभी को सही क्रम में याद रखना आसान है। यह याद दिलाना मुश्किल है कि एफईसी पॉइंटर को जहां पीसी में रखा जाए (जिसमें केवल दो पैरामीटर हैं), खासकर जब से fprintf विपरीत है।
user877329

सबसे अच्छा जवाब। बहुत अच्छी तरह से कहा
अनवर

31

आपके सभी उत्तरों के लिए बहुत बहुत धन्यवाद:

  • उन लोगों को खोजना थोड़ा आश्चर्यजनक था जो यह भी सोचते हैं (जैसे मैं करता हूं) कि 5 पैरामीटर कोड की पवित्रता के लिए एक अच्छी सीमा है।

  • आम तौर पर, लोग इस बात से सहमत होते हैं कि 3 और 4 के बीच की सीमा अंगूठे का अच्छा नियम है। यह उचित है क्योंकि लोगों के पास आमतौर पर 4 से अधिक चीजों को गिनने का एक बुरा समय होता है।

  • मिलान बिंदुओं के रूप में , औसतन लोग एक समय में कम या ज्यादा 7 चीजें अपने सिर में रख सकते हैं। लेकिन मुझे लगता है कि आप इसे नहीं भूल सकते, जब आप एक रूटीन का अध्ययन / रख-रखाव कर रहे हैं / कर रहे हैं, तो आपको सिर्फ मापदंडों से ज्यादा चीजों को ध्यान में रखना होगा।

  • कुछ लोग मानते हैं कि एक दिनचर्या में उतने ही तर्क होने चाहिए जितने की जरूरत है। मैं सहमत हूं, लेकिन केवल कुछ विशिष्ट मामलों के लिए (ओएस एपीआई के लिए कॉल, दिनचर्या जहां अनुकूलन महत्वपूर्ण है, आदि)। मेरा सुझाव है कि जब भी संभव हो इन कॉल के ऊपर अमूर्त की एक परत जोड़कर इन दिनचर्या की जटिलता को छिपाने के लिए।

  • निक ने इस पर कुछ दिलचस्प विचार रखे । यदि आप उनकी टिप्पणियों को नहीं पढ़ना चाहते हैं, तो मैं आपके लिए संक्षेप में प्रस्तुत करता हूं: संक्षेप में, यह निर्भर करता है :

    मुझे इस तरह के कठिन और तेज़ नियम बनाने से नफरत है क्योंकि उत्तर न केवल आपकी परियोजना के आकार और दायरे के आधार पर बदलता है, बल्कि मुझे लगता है कि यह मॉड्यूल स्तर तक भी बदल जाता है। आपकी विधि क्या कर रही है, या कक्षा को क्या दर्शाया जाना चाहिए, इसके आधार पर, यह संभव है कि 2 तर्क बहुत अधिक हैं और बहुत अधिक युग्मन का लक्षण है।

    यहां नैतिक अपने साथियों को अपना कोड दिखाने से डरते नहीं हैं, उनके साथ चर्चा करें और "उन क्षेत्रों की पहचान करने का प्रयास करें जहां आपके पास कम सामंजस्य और तंग युग्मन है"

  • अंत में, मुझे लगता है कि wnoise ज्यादा निक के साथ सहमत हैं, और के साथ अपने व्यंग्य योगदान निष्कर्ष निकाला है इस काव्यगत दृष्टि प्रोग्रामिंग की कला के (नीचे टिप्पणी देखें):

    प्रोग्रामिंग इंजीनियरिंग नहीं है। संगठन का कोड एक कला है क्योंकि यह मानव कारकों पर निर्भर करता है, जो किसी भी कठिन नियम के संदर्भ में बहुत अधिक निर्भर करता है।


16

यह उत्तर एक ओओ भाषा मानता है। यदि आप एक का उपयोग नहीं कर रहे हैं - इस उत्तर को छोड़ दें (यह दूसरे शब्दों में एक भाषा-अज्ञेयवादी उत्तर नहीं है।

यदि आप 3 या अधिक मापदंडों (विशेष रूप से आंतरिक प्रकार / वस्तुओं) से गुजर रहे हैं, तो ऐसा नहीं है कि यह "बहुत अधिक" है, लेकिन आपको एक नई वस्तु बनाने का मौका याद आ रहा है।

उन मापदंडों के समूहों की तलाश करें जो एक से अधिक तरीकों से पारित हो जाते हैं - यहां तक ​​कि एक समूह भी दो तरीकों से पारित हो जाता है, लगभग गारंटी देता है कि आपके पास एक नई वस्तु होनी चाहिए।

तब आप अपनी नई वस्तु में कार्यशीलता को प्रतिबिंबित करते हैं और आपको विश्वास नहीं होता है कि यह आपके कोड और OO प्रोग्रामिंग की आपकी समझ दोनों में कितनी मदद करता है।


कृपया, ऐसी भाषा का नाम बताइए जिसमें न तो रूटीन का प्रयोग हो और न ही मापदंडों का। मैं एक के बारे में नहीं सोच सकता, यहां तक ​​कि विधानसभा को रूटीन (लेबल) माना जा सकता है।
अरोन

x86 असेंबली में निश्चित रूप से दिनचर्या (कॉल / रिटर्न) है। दूसरों को सीएमपी / जेएमपी कोम्बो की आवश्यकता हो सकती है।
ब्रायन नॉबलुच

क्षमा करें, "पुनः", "वापसी" नहीं। विलाप। बहुत दिन हो गए।
ब्रायन नोब्लुच

अस्पष्ट ऑरिंगोन के बारे में क्षमा करें, मुझे विश्वास है कि मैंने इसे ठीक कर दिया है। यह मेरा उत्तर था जो भाषा-विशेष का था, प्रश्न का नहीं।
बिल के

1
सभी भाषाएं पासिंग स्ट्रक्चर की अनुमति नहीं देती हैं। इसके अलावा, एक संरचना को पारित करने का अर्थ है कि प्राप्त करने की विधि में संरचना को संभालने के लिए कोड होना चाहिए और इसलिए, अधिक मापदंडों की आवश्यकता होगी। इसके अलावा, एक गैर-ओओ भाषा में, आपको आमतौर पर एक अतिरिक्त पैरामीटर की आवश्यकता होती है - सभी ओओ भाषाओं में "इस" का "हिडन" पैरामीटर होता है जिसे अन्यथा (या अधिक भयावह भाषा / डिज़ाइन में) पारित किया जाना चाहिए, विश्व स्तर पर हो सकता है सुलभ)
बिल K

13

ऐसा लगता है कि मात्र संख्या की तुलना में अन्य विचार हैं, यहां कुछ ऐसे हैं जो दिमाग में आते हैं:

  1. फ़ंक्शन बनाम एक-बंद सेटिंग्स के प्राथमिक उद्देश्य के लिए तार्किक संबंध

  2. यदि वे सिर्फ पर्यावरण के झंडे हैं, तो बंडलिंग करना बहुत आसान हो सकता है


12

एलन पर्लीस के प्रसिद्ध प्रोग्रामिंग एपिग्राम (एसीएम सिगनलन नोटिस 17 (9), सितंबर, 1982 में एक) में कहा गया है कि "यदि आपके पास 10 मापदंडों के साथ एक प्रक्रिया है, तो आप शायद कुछ चूक गए हैं।"


11

कोड पूरा में स्टीव मैककोनेल के अनुसार , आपको चाहिए

एक रूटीन पैरामीटर की संख्या को लगभग सात तक सीमित करें


3
/: संख्या
बताती

9

मेरे लिए, जब सूची मेरे IDE पर एक पंक्ति को पार करती है, तो यह एक पैरामीटर बहुत अधिक है। मैं आंखों के संपर्क को तोड़ने के बिना सभी मापदंडों को एक पंक्ति में देखना चाहता हूं। लेकिन यह सिर्फ मेरी निजी पसंद है।


यह तब तक अच्छा है जब तक आप कुछ देवों के साथ फू करने की कोशिश करेंगे (उदाहरण के लिए, फ्लोट बी, स्ट्रिंग सी, डबल डी)। मुझे लगता है कि उनके साथ काम करने से बचने की कोशिश करने के लिए सबसे अच्छा है। : D
Rontologist

4
यदि किसी और व्यक्ति ने हास्यास्पद रूप से लंबे नाम दिए हैं तो मैं उस प्रभाव को नहीं होने दूंगा कि कैसे मैं अपनी दिनचर्या को परिभाषित या कॉल करूं।
फाइननव

9
क्या मैं आपको "गाड़ी वापसी" से मिलवा सकता हूँ?

3
जब सूची आपके IDE पर एक पंक्ति को पार कर जाती है, तो आपका मॉनिटर उस कोड के साथ उपयोग करने के लिए बहुत छोटा है और आपको स्पष्ट रूप से एक उच्च क्षैतिज रिज़ॉल्यूशन वाला मॉनिटर खरीदना चाहिए। एक लाइन ब्रेक या मापदंडों की स्मूद में कमी सिर्फ वर्कअराउंड हैं जो रूट समस्या को हल नहीं करते हैं जो यह है कि आपका मॉनिटर उस कोडबेस के लिए बहुत छोटा है!
कैसरलुडी

9

मैं आम तौर पर 5 से सहमत हूं, हालांकि, अगर कोई ऐसी स्थिति है जहां मुझे अधिक की आवश्यकता है और यह समस्या को हल करने का सबसे स्पष्ट तरीका है, तो मैं और अधिक उपयोग करूंगा।


8

शॉर्ट टर्म मेमोरी में सात चीजें?

  1. समारोह का नाम
  2. फ़ंक्शन का मान लौटाएं
  3. समारोह का उद्देश्य
  4. पैरामीटर 1
  5. पैरामीटर 2
  6. पैरामीटर 3
  7. पैरामीटर 4

कुंआ। यह अंगूठे का एक नियम है। जब आप किसी फंक्शन की बॉडी को कोड कर रहे होते हैं, तो आप इसके नाम की परवाह नहीं करते हैं, और रिटर्न वैल्यू और इसके पर्स का निकट संबंध होता है।
औरोन

7
8. मापदंडों का क्रम
ईवा

7

सबसे खराब 5 कोड स्निपेट्स में , दूसरे को जांचें, "क्या यह एक निर्माता है"। इसमें 37 ≈ 4 over 150 से अधिक पैरामीटर हैं:

यहाँ एक प्रोग्रामर ने इस कंस्ट्रक्टर को लिखा [... S] आप में से कुछ लोग सोच सकते हैं कि इसका एक बड़ा कंस्ट्रक्टर है, लेकिन उसने स्वचालित कोड जेनरेशन टूल्स का उपयोग किया है। निष्कर्ष निकालना कि यह निर्माण हाथ से लिखा गया था। (वैसे यह कंस्ट्रक्टर का केवल शीर्ष भाग है, इसका पूरा नहीं)।

150 से अधिक मापदंडों के साथ कंस्ट्रक्टर


यह बहुत दुख की बात है ... "रिकॉर्ड्स" या "स्ट्रक्चर्स" या "वैल्यू ऑब्जेक्ट्स" के बारे में नहीं जानना, जो कई मूल्यों को एक साथ जोड़ते हैं और उन्हें एक सामान्य नाम देते हैं ताकि आप पठन तरीके से उनमें से बहुत से का प्रतिनिधित्व कर सकें। साल के लिए unlaced क्योंकि कोई भी कभी तुमसे कहा था तुम भी है कि 🙈 कर सकता है जूते के साथ
Yeoman

6

आवश्यकता से अधिक एक। मुझे ग्लिब होने का मतलब नहीं है, लेकिन कुछ कार्य ऐसे हैं जो आवश्यक रूप से काफी कुछ विकल्पों की आवश्यकता है। उदाहरण के लिए:

void *
mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t offset);

6 तर्क हैं, और उनमें से हर एक आवश्यक है। इसके अलावा, बंडलिंग को सही ठहराने के लिए उनके बीच कोई सामान्य लिंक नहीं है। हो सकता है कि आप "संरचित mmapargs" को परिभाषित कर सकते हैं, लेकिन यह बदतर होगा।


खैर, protऔर flagsएक साथ लुढ़का जा सकता था अगर यह डिजाइनर द्वारा महसूस किया गया था कि 5 किसी भी तरह से एक जादू की संख्या थी जो 6. की तुलना में बहुत बेहतर है open। सभी अन्य विविध झंडे के साथ रीड / राइट मोड को जोड़ती है। और शायद आप यहoffset निर्दिष्ट करके छुटकारा पा सकते हैं कि मैप की गई धारा वर्तमान की स्थिति में शुरू होती है filedes। मुझे नहीं पता कि ऐसी कोई परिस्थितियां हैं या नहीं, जहां आप mmapऐसा क्षेत्र बना सकते हैं, जहां आप प्रवेश करने में सक्षम नहीं हैं lseek, लेकिन यदि ऐसा नहीं है तो यह कड़ाई से आवश्यक नहीं है।
स्टीव जेसोप

... इसलिए मुझे लगता mmapहै कि इस तथ्य का एक अच्छा चित्रण है कि कुछ डिजाइनर और उपयोगकर्ता मापदंडों की एक बड़ी लंबी सूची पसंद करते हैं, जबकि अन्य कॉल करने से पहले कम संख्या में मापदंडों को तैयार करना पसंद करते हैं।
स्टीव जेसोप

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

5

पर्ल बेस्ट प्रैक्टिसेज के अनुसार , 3 ठीक है, 4 बहुत अधिक है। यह सिर्फ एक दिशानिर्देश है, लेकिन हमारी दुकान में यही है कि हम किस चीज से चिपके रहते हैं।


5

मैं स्वयं 5 मापदंडों पर सार्वजनिक कार्यों के लिए सीमा खींचता हूँ।

IMHO, लंबी पैरामीटर सूचियाँ केवल निजी / स्थानीय सहायक कार्यों में स्वीकार्य हैं जो केवल कोड में कुछ विशिष्ट स्थानों से बुलाए जाने के लिए हैं। उन मामलों में, आपको बहुत सी राज्य जानकारी पास करने की आवश्यकता हो सकती है, लेकिन पठनीयता केवल आपके (या कोई ऐसा व्यक्ति जो आपके कोड को बनाए रखेगा और आपके मॉड्यूल के मूल सिद्धांतों को समझना चाहिए) के बारे में बहुत चिंता करने की आवश्यकता नहीं है। उस फ़ंक्शन को कॉल कर रहा है।


जो वास्तव में क्यों इस बिंदु पर बहुत सारे लोग सब कुछ कर देंगे जो एक वास्तविक तर्क नहीं है, लेकिन राज्य चारों ओर ले गया, बस खेतों के रूप में एक वस्तु की स्थिति (सदस्य चर)। उस वस्तु को एक वर्ग के रूप में दर्शाया जाएगा। यह एक बार या हर उपयोग के लिए तत्काल किया जाएगा। कभी-कभी इस तरह की वस्तु में केवल एक पैकेज निजी या सार्वजनिक पद्धति होगी, जो तब कुछ तर्कों के साथ निजी विधियों को काम सौंपती है। कुछ तर्क अब संभव हैं क्योंकि कॉन्फ़िगरेशन और राज्य में अब एक उचित स्थान है :)
योमन

5

एक संबंधित प्रश्न जिस पर आपको विचार करना चाहिए कि दिनचर्या कितनी सम्वेदनशील है। बड़ी संख्या में पैरामीटर एक गंध हो सकते हैं जो आपको बता रहे हैं कि दिनचर्या खुद बहुत अधिक करने की कोशिश कर रही है और इसलिए यह सामंजस्य संदिग्ध है। मैं मानता हूं कि मापदंडों की एक कठिन और तेज संख्या शायद असंभव है, लेकिन मुझे लगता है कि एक उच्च सामंजस्य दिनचर्या मापदंडों की एक कम संख्या होगी।



4

मैं अंगूठे के सामान्य नियम के रूप में तीन मापदंडों पर रुकता हूं। किसी भी अधिक और इसके बजाय एक सरणी पैरामीटर या कॉन्फ़िगरेशन ऑब्जेक्ट पास करने का समय है, जो एपीआई को बदले बिना भविष्य के मापदंडों को भी जोड़ने की अनुमति देता है।


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

हालाँकि, अगर आपको किनारे के मामले को कॉन्फ़िगर करने के लिए एक और पैरामीटर की आवश्यकता है, तो इसे एपीआई
एरन गैल्परिन

4

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


4

एक बात मैं एक प्रदर्शन के दृष्टिकोण से इंगित करता हूं कि आप किसी विधि को कैसे पास करते हैं, इस पर निर्भर करता है कि मान द्वारा बहुत सारे मापदंडों को पारित करने से कार्यक्रम धीमा हो जाएगा क्योंकि प्रत्येक पैरामीटर को कॉपी करना होगा और फिर स्टैक पर रखा जाएगा।

सभी मापदंडों को शामिल करने के लिए एक एकल वर्ग का उपयोग करना बेहतर होगा क्योंकि संदर्भ द्वारा पारित एक एकल पैरामीटर सुरुचिपूर्ण और क्लीनर, और तेज होगा!


मैं इसका उत्तर +1 दे रहा हूं क्योंकि इसका एकमात्र कोड-स्वच्छता या मनमानी सीमाओं के अलावा किसी भी चीज पर चर्चा करता है, जो दोनों व्यक्तिपरक हैं। कुछ लोग इस बारे में नहीं सोच सकते हैं कि जब आप एक लूप में होते हैं तो स्टैक पर क्या कर रहे होते हैं और स्टैक पर और बाहर दर्जनों तर्क देते हैं। यदि यह एक लूप में है, तो आपको एबीआई में पंजीकृत होने वाले तर्कों की संख्या का उपयोग करने पर विचार करना चाहिए, जिनके लिए आप संकलन कर रहे हैं। उदाहरण के लिए, MS x64 ABI में, अधिकतम आर्गु थ्रू रजिस्टरों को पारित किया जाता है। 4. "सिस्टम V" ABI (नॉन-विंडोज OS द्वारा प्रयुक्त) अधिक रजिस्टरों का उपयोग करता है, इसलिए 4 args सुंदर पोर्टेबल का उपयोग कर रहा है
Lake

3

मेरे अनुसार ऐसे मामले हो सकते हैं जहाँ आप 4 या कुछ निश्चित संख्या से अधिक होंगे। तलाश करने वाली चीजें हो सकती हैं

  1. आपका तरीका बहुत अधिक है और आपको रिफ्लेक्टर की आवश्यकता है।
  2. आप किसी संग्रह या कुछ डेटा संरचना का उपयोग करने पर विचार कर सकते हैं।
  3. अपने वर्ग के डिजाइन को रीथिंक करें, हो सकता है कि कुछ चीजों को पास करने की आवश्यकता न हो।

उपयोग में आसानी या कोड पढ़ने में आसानी के कोण से, मुझे लगता है कि जब आपको अपनी पद्धति हस्ताक्षर "टाइप" करने की आवश्यकता होती है, तो आपको रोकना चाहिए और सोचना चाहिए, जब तक आप असहाय महसूस नहीं करते हैं और हस्ताक्षर को छोटा करने के सभी प्रयास कोई परिणाम नही। अतीत और वर्तमान में कुछ बहुत अच्छे पुस्तकालय 4-5 से अधिक प्रैम का उपयोग करते हैं।


3

अंगूठे का मेरा नियम है कि मुझे एक कॉल को देखने के लिए मापदंडों को याद करने में सक्षम होना चाहिए और यह बताता है कि यह क्या करता है। इसलिए अगर मैं विधि को नहीं देख सकता हूं और फिर किसी विधि के कॉल पर फ्लिप कर सकता हूं और याद रख सकता हूं कि कौन सा पैरामीटर क्या करता है तो बहुत सारे हैं।

मेरे लिए यह लगभग 5 के बराबर है, लेकिन मैं उतना उज्ज्वल नहीं हूं। आपकी माइलेज भिन्न हो सकती है।

आप पैरामीटर रखने के लिए गुणों के साथ एक ऑब्जेक्ट बना सकते हैं और पास कर सकते हैं यदि आप जो भी सीमा निर्धारित करते हैं उससे अधिक है। मार्टिन फाउलर की रिफैक्टिंग पुस्तक और विधि कॉल को सरल बनाने के अध्याय को देखें।


1

यह उस वातावरण पर बहुत निर्भर करता है जिसमें आप काम कर रहे हैं। उदाहरण के लिए जावास्क्रिप्ट लें। जावास्क्रिप्ट में पैरामीटर्स में पास होने का सबसे अच्छा तरीका है किज / वैल्यू पेयर के साथ ऑब्जेक्ट्स का उपयोग करना, जिसका मतलब है कि आपके पास केवल एक पैरामीटर है। अन्य प्रणालियों में मीठा स्थान तीन या चार पर होगा।

अंत में, यह सभी व्यक्तिगत स्वाद के लिए उबालता है।


1

मैं 3 के साथ सहमत हूँ ठीक है, 4 एक दिशानिर्देश के रूप में बहुत अधिक है। अधिक 3 मापदंडों के साथ, आप अनिवार्य रूप से एक कार्य कर रहे हैं। फिर एक कार्य को अलग-अलग तरीकों से विभाजित किया जाना चाहिए।

हालाँकि, यदि मैंने उस नवीनतम परियोजना को देखा है जिस पर मैंने काम किया है, तो अपवाद कम हो जाएंगे और अधिकांश मामलों में 3 मापदंडों तक नीचे जाना मुश्किल होगा।


1

अगर मेरे पास एक रूटीन में 7-10 पैरामीटर हैं, तो मैं उन्हें एक नए वर्ग में बाँधता हुआ देखता हूँ, लेकिन यह नहीं कि अगर क्लास कुछ नहीं होगी, लेकिन गेटर्स और सेटर के साथ खेतों का एक गुच्छा - नई कक्षा में फेरबदल मूल्यों के अलावा कुछ और करना होगा (और बाहर। अन्यथा मैं लंबे पैरामीटर सूची के साथ रखा था।


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

1

यह एक ज्ञात तथ्य है कि, लोग औसतन एक बार में 7 +/- 2 चीजें अपने सिर में रख सकते हैं। मैं मापदंडों के साथ उस सिद्धांत का उपयोग करना पसंद करता हूं। यह मानते हुए कि प्रोग्रामर सभी औसत से ऊपर के बुद्धिमान लोग हैं, मैं कहूंगा कि सब कुछ 10+ बहुत अधिक है।

BTW, अगर पैरामीटर किसी भी तरह से समान हैं, तो मैं उन्हें एक सदिश या वर्ग के बजाय एक वेक्टर या सूची में डालूँगा।


1

मैं अपना उत्तर इस आधार पर दूंगा कि फ़ंक्शन को कितनी बार कहा जाता है।

यदि यह एक init फंक्शन है जिसे केवल एक बार ही कॉल किया जाता है तो इसे 10 parms या उससे अधिक का ले जाने दें, जो परवाह करता है।

यदि इसे प्रति फ्रेम समय का एक गुच्छा कहा जाता है, तो मैं एक संरचना बनाने के लिए जाता हूं और बस इसे एक पॉइंटर पास कर देता हूं क्योंकि यह तेज हो जाता है (यह मानते हुए कि आप हर बार भी संरचना का पुनर्निर्माण नहीं कर रहे हैं)।


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