क्या एक एनपीठ की जटिलता सोलह से अधिक अष्टकोणीय है? या मैंने उपकरण को तोड़ दिया है?


13

मैंने अभी PHPMD ( http://phpmd.org/ ) का उपयोग करके PHP कोड (1153 पंक्तियों) का एक बड़ा हिस्सा मापा है और यह बताता है कि कोड में 16244818757303403077832757824 का NPath जटिलता है।

यह मेरे लिए एक बड़ी संख्या की तरह दिखता है, यह सुझाव देता है कि शायद PHPMD किसी तरह से टूट गया है। क्या यह भी संभव है कि मनुष्यों द्वारा लिखे गए कोड के एक टुकड़े के लिए इतनी ऊंची एनपीथ जटिलता हो? चक्रीय जटिलता 351 है।

संभवतः दो महत्वपूर्ण विवरण -

  1. यह प्रक्रियात्मक कोड था, जिसे HTML में मिलाया गया था, और PHPMD केवल ऑब्जेक्ट-ओरिएंटेड कोड को मापेगा। इसके चारों ओर जाने के लिए, मैंने पूरी फ़ाइल को एक एकल फ़ंक्शन के साथ एक कक्षा में लपेट दिया - यह इस बात का प्रतिनिधि है कि इसका उपयोग कैसे किया जाता है।

  2. फ़ाइल में नेस्टेड स्विच स्टेटमेंट्स की एक श्रृंखला होती है, और इसके अंदर बहुत सारे if..else स्टेटमेंट होते हैं - इसलिए यह निश्चित रूप से बहुत जटिल है।

संपादित करें

मैं स्पष्ट करना चाहता हूं कि मैं यह नहीं पूछ रहा हूं कि क्या PHPMD मेरे लिए झूठ बोल रहा है। मुझे पता है कि कोड एक भयानक गड़बड़ है, मुझे आश्चर्य है कि क्या किसी भी कोड के लिए यह वास्तव में बुरा है। ऐसा लगता है कि उत्तर हां है, यह बहुत संभव है।


2
मुझे नहीं पता कि आपने टूल को तोड़ा है, लेकिन # 2 इंगित करता है कि कोड शायद थोड़ा सा रिफैक्ट होने के लिए खड़ा हो सकता है।
लिंडाजेन

1
@ लिंडाजेन मैं सहमत हूं। मैं बस के लिए उत्सुक हूँ कि यह कितना गड़बड़ है।
जाज

2
वर्डप्रेस की 2013 में 1.435 क्विंडसिलियन कीWP_Query::get_posts() एक एनपीथ जटिलता थी। यह आजकल और भी बदतर है ...
fuxia

@toscho यह मेरी नई पसंदीदा जानकारी है। धन्यवाद!
Jez

जवाबों:


24

यह पूरी तरह से संभव है। मान लें कि हमारे पास 10 मामलों में से प्रत्येक के 35 स्विच-केस निर्माण हैं, जो हमें 350 के लगभग एक चक्रवाती जटिलता देता है जब प्रत्येक स्विच एक के बाद एक होता है। पहला स्विच हमें 10 पथ देता है। दूसरा स्विच हमें एक और स्वतंत्र 10 रास्ते देता है, जिससे हमारे यहां तक ​​10 · 10 रास्ते हैं। तीसरे स्विच के साथ, हमें 10 · 10 · 10 = 10s पथ मिलते हैं, और इसी तरह जब तक हमें कुल 10 35 पथ नहीं मिलते ! यह 1.6 · 10 में अपने परिणाम की तुलना में भी अधिक है 28 एक अलग शाखाओं की वजह से पथ, जो शायद है, और नेस्टेड नियंत्रण प्रवाह बयान जो अपने कोड के माध्यम से पथ की संख्या को कम करने के कारण।

किसी दिए गए साइक्लोमैटिक जटिलता सी के लिए सबसे खराब स्थिति के रूप में, हमारे पास कोड के माध्यम से अधिकतम 2 सी एसाइक्लिक पथ हो सकते हैं (यहां: 2 351 = 4.6 · 10 105 )।

उपकरण का निर्णय स्पष्ट है: आप जिस कोड के साथ काम कर रहे हैं वह एक जटिल, असंगत, और अप्राप्य गड़बड़ है। इसे छोटे, स्वतंत्र कार्यों में विभाजित करने और पुनरावृत्ति को दूर करने पर विचार करें। उदाहरण के लिए, आप अपने PHP स्क्रिप्ट के मुख्य तर्क से HTML पीढ़ी को अलग कर सकते हैं।


14
विश्लेषण के लिए धन्यवाद। मुझे यह इंगित करने की आवश्यकता है कि यह मेरा कोड नहीं है ... लेकिन, जैसा कि अक्सर होता है, यह मेरी समस्या को प्रदर्शित करता है।
Jez

1
@ जेजे, यदि यह कोई सांत्वना है तो आप एक अद्वितीय स्थिति में नहीं हैं।
डैनियल हॉलिनरेके

5

इस विवरण के अनुसार , एनपीथ जटिलता साइक्लोमैटिक जटिलता में घातीय है।

केवल साधारण बयान लेने पर, यदि आपके पास इनमें से दो कथन हैं, तो अनिवार्य रूप से आपके कोड के माध्यम से 4 मार्ग हैं जो दो कथन शर्तों के लिए सही / गलत के चार संभावित संयोजनों के अनुरूप हैं। एक और जोड़ें यदि कथन और आपको 8 मिलते हैं।

दूसरे शब्दों में, यदि आपके सभी चक्रवाती और एनपीथ जटिलता बयानों की एक लंबी सूची से आ रहे थे, तो आपकी समानता होगी NPath = 2^cyclomatic। आपकी संख्या की तुलना में, 2 ^ 351 = 4.6 * 10 ^ 105, दूर, एनपीथ जटिलता की तुलना में कहीं अधिक है जो आपने रिपोर्ट किया था।

मुझे नहीं पता कि PHPMD गिनती के रास्तों से कितना दूर है जो वास्तव में असंभव हैं (उदाहरण के लिए दो पारस्परिक रूप से अनन्य सशर्त दोनों सच का मूल्यांकन)। संभवतः एक मैन्युअल विश्लेषण से पता चलता है कि वास्तव में बहुत सारे रास्ते असंभव हैं, इसलिए कोड को इस तरह से लिखा जाता है जो एनपीथ मीट्रिक को फुलाता है। उपरोक्त जारी रखने के लिए, यदि आपके पास बयानों के अनुसार 351 की सूची थी, लेकिन यह सत्यापित कर सकता है कि केवल एक ही वास्तव में दर्ज किया गया था, तो आप इसे एक श्रृंखला में बदल सकते हैं यदि ... और कथन, अपनी NPath जटिलता को 4.6 * 10 से नीचे कर सकते हैं ^ 105 से 353।

लेकिन आपके प्रश्न में केवल जानकारी के साथ, न जाने कितने प्रकार का सरलीकरण किया जा सकता है या पहले से ही PHPMD द्वारा किया जा रहा है, यह संख्या यथार्थवादी लगती है।

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