साइक्लोमेटिक कम्पलेक्सिटी: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 10: Line 10:
==विवरण==
==विवरण==
===परिभाषा===
===परिभाषा===
[[Image:control flow graph of function with loop and an if statement without loop back.svg|thumb|250px|right|एक साधारण प्रोग्राम का कंट्रोल-फ्लो ग्राफ़। प्रोग्राम लाल नोड पर निष्पादित होना शुरू होता है, फिर एक लूप में प्रवेश करता है (लाल नोड के ठीक नीचे तीन नोड्स का समूह)। लूप से बाहर निकलने पर, एक कंडीशनल विवरण (लूप के नीचे समूह) होता है, और अंत में प्रोग्राम नीले नोड पर बाहर निकलता है। इस ग्राफ़ में 9 एज, 8 नोड्स और 1 [[जुड़ा हुआ घटक (ग्राफ़ सिद्धांत)]] है, इसलिए प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी है {{math|1=9 − 8 + 2×1 = 3}}.]]स्रोत कोड के एक अनुभाग की साईक्लोमैटिक कम्पलेक्सिटी इसके समाविष्ट [[रैखिक रूप से स्वतंत्र|रैखिक रूप से इंडिपेंडेंट]] [[पथ (ग्राफ सिद्धांत)|पाथ (ग्राफ सिद्धांत)]] की संख्या है - पाथ्स का एक सेट रैखिक रूप से निर्भर होता है यदि एक या अधिक पाथ्स का एक उपसमूह होता है जहां उनके एज सेट का [[सममित अंतर]] रिक्त होता है। उदाहरण के लिए, यदि स्रोत कोड में कोई कंट्रोल फ्लो (कंडीशनल या डिसीज़न पॉइंट) नहीं है, तो कम्पलेक्सिटी 1 होगी, क्योंकि कोड के माध्यम से केवल एक ही पाथ होता है। यदि कोड में एक एकल-स्थिति IF कथन है, तो कोड के माध्यम से दो पाथ होंगे: एक जहां IF कथन TRUE का मूल्यांकन करता है और दूसरा जहां यह FALSE का मूल्यांकन करता है, इसलिए कम्पलेक्सिटी 2 होगी, दो नेस्टेड एकल-स्थिति IF, या दो शर्तों वाला एक IF, 3 की कम्पलेक्सिटी उत्पन्न करता है।
[[Image:control flow graph of function with loop and an if statement without loop back.svg|thumb|250px|right|एक साधारण प्रोग्राम का कंट्रोल-फ्लो ग्राफ़। प्रोग्राम लाल नोड पर निष्पादित होना शुरू होता है, फिर एक लूप में एंट्री करता है (लाल नोड के सही नीचे तीन नोड्स का समूह)। लूप से बाहर निकलने पर, एक कंडीशनल विवरण (लूप के नीचे समूह) होता है, और अंत में प्रोग्राम नीले नोड पर बाहर निकलता है। इस ग्राफ़ में 9 एज, 8 नोड्स और 1 [[जुड़ा हुआ घटक (ग्राफ़ सिद्धांत)]] है, इसलिए प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी है {{math|1=9 − 8 + 2×1 = 3}}.]]स्रोत कोड के एक अनुभाग की साईक्लोमैटिक कम्पलेक्सिटी इसके समाविष्ट [[रैखिक रूप से स्वतंत्र|रैखिक रूप से इंडिपेंडेंट]] [[पथ (ग्राफ सिद्धांत)|पाथ (ग्राफ सिद्धांत)]] की संख्या है - पाथ्स का एक सेट रैखिक रूप से निर्भर होता है यदि एक या अधिक पाथ्स का एक उपसमूह होता है जहां उनके एज सेट का [[सममित अंतर]] रिक्त होता है। उदाहरण के लिए, यदि स्रोत कोड में कोई कंट्रोल फ्लो (कंडीशनल या डिसीज़न पॉइंट) नहीं है, तो कम्पलेक्सिटी 1 होगी, क्योंकि कोड के माध्यम से केवल एक ही पाथ होता है। यदि कोड में एक एकल-स्थिति IF कथन है, तो कोड के माध्यम से दो पाथ होंगे: एक जहां IF कथन TRUE का मूल्यांकन करता है और दूसरा जहां यह FALSE का मूल्यांकन करता है, इसलिए कम्पलेक्सिटी 2 होगी, दो नेस्टेड एकल-स्थिति IF, या दो शर्तों वाला एक IF, 3 की कम्पलेक्सिटी उत्पन्न करता है।


गणितीय रूप से, [[संरचित प्रोग्रामिंग]] की साईक्लोमैटिक कम्पलेक्सिटी{{efn|1=Here "structured" means in particular "with a single exit ([[return statement]]) per function".}} के प्रोग्राम को कंट्रोल-फ्लो ग्राफ के संदर्भ में परिभाषित किया गया है, एक डायरेक्टेड ग्राफ जिसमें प्रोग्राम के [[बुनियादी ब्लॉक]] होते हैं, दो बुनियादी ब्लॉकों के बीच एक एज के साथ यदि कंट्रोल पहले से दूसरे तक जा सकता है। कम्पलेक्सिटी {{mvar|M}} को इसलिए परिभाषित किया गया है<ref name="mccabe76">{{cite journal| last=McCabe|date=December 1976| journal=IEEE Transactions on Software Engineering|issue=4| pages=308–320| title=एक जटिलता उपाय| volume=SE-2| doi=10.1109/tse.1976.233837|s2cid=9116234}}</ref><math display="block">M = E - N + 2P,</math>कहाँ
गणितीय रूप से, [[संरचित प्रोग्रामिंग|स्ट्रक्चर्ड प्रोग्रामिंग]] की साईक्लोमैटिक कम्पलेक्सिटी{{efn|1=Here "structured" means in particular "with a single exit ([[return statement]]) per function".}} के प्रोग्राम को कंट्रोल-फ्लो ग्राफ के संदर्भ में परिभाषित किया गया है, एक डायरेक्टेड ग्राफ जिसमें प्रोग्राम के [[बुनियादी ब्लॉक|बेसिक ब्लॉक]] होते हैं, दो बेसिक ब्लॉकों के बीच एक एज के साथ यदि कंट्रोल पहले से दूसरे तक जा सकता है। कम्पलेक्सिटी {{mvar|M}} को इसलिए परिभाषित किया गया है:<ref name="mccabe76">{{cite journal| last=McCabe|date=December 1976| journal=IEEE Transactions on Software Engineering|issue=4| pages=308–320| title=एक जटिलता उपाय| volume=SE-2| doi=10.1109/tse.1976.233837|s2cid=9116234}}</ref><math display="block">M = E - N + 2P,</math>जहाँ
*{{mvar|E}} = ग्राफ़ के किनारों की संख्या.
*{{mvar|E}} = ग्राफ़ के एजेस की संख्या
*{{mvar|N}} = ग्राफ़ के नोड्स की संख्या।
*{{mvar|N}} = ग्राफ़ के नोड्स की संख्या
*{{mvar|P}} = जुड़े हुए घटक की संख्या (ग्राफ़ सिद्धांत)
*{{mvar|P}} = कनेक्टेड कम्पोनेंट्स की संख्या (ग्राफ़ सिद्धांत)
 
[[Image:control flow graph of function with loop and an if statement.svg|thumb|250px|ऊपर जैसा ही कार्य, वैकल्पिक फॉर्मूलेशन का उपयोग करके दर्शाया गया है, जहां प्रत्येक एग्जिट पॉइंट दोबारा एंट्री पॉइंट से जुड़ा हुआ है। इस ग्राफ़ में 10 एज, 8 नोड्स और 1 जुड़ा हुआ घटक (ग्राफ़ सिद्धांत) है, जिसके परिणामस्वरूप वैकल्पिक फॉर्मूलेशन का उपयोग करके 3 की साइक्लोमैटिक कम्पलेक्सिटी भी उत्पन्न होती है ({{math|1=10 − 8 + 1 = 3}}).]] एक वैकल्पिक सूत्रीकरण एक ग्राफ़ का उपयोग करना है जिसमें प्रत्येक एग्जिट पॉइंट दोबारा एंट्री पॉइंट से जुड़ा होता है। इस स्थिति में, ग्राफस्ट्रॉन्ग्ली कनेक्टेड होता है, और प्रोग्राम की साइक्लोमैटिक कम्पलेक्सिटी इसके ग्राफ की [[चक्रीय संख्या|साईक्लोमैटिक संख्या]] के समतुल्य है (जिसे ग्राफ सिद्धांत में पहली बेट्टी संख्या), जिसे इस प्रकार परिभाषित किया गया है<ref name="mccabe76" /><math display="block">M = E - N + P.</math>इसे ग्राफ़ में उपस्थित [[रैखिक रूप से स्वतंत्र चक्र|रैखिक रूप से इंडिपेंडेंट]] [[साइकल्स]] की संख्या की कंप्यूटेड रूप में देखा जा सकता है, अर्थात वे साइकल्स जिनके समाविष्ट अन्य साइकल्स सम्मिलित नहीं हैं। ध्यान दें कि क्योंकि प्रत्येक एग्जिट पॉइंट एंट्री पॉइंट पर दोबारा लूप करता है, प्रत्येक एग्जिट पॉइंट के लिए कम से कम एक ऐसी साईकल जरूर होती है।


[[Image:control flow graph of function with loop and an if statement.svg|thumb|250px|ऊपर जैसा ही कार्य, वैकल्पिक फॉर्मूलेशन का उपयोग करके दर्शाया गया है, जहां प्रत्येक निकास पॉइंट वापस प्रवेश पॉइंट से जुड़ा हुआ है। इस ग्राफ़ में 10 एज, 8 नोड्स और 1 जुड़ा हुआ घटक (ग्राफ़ सिद्धांत) है, जिसके परिणामस्वरूप वैकल्पिक फॉर्मूलेशन का उपयोग करके 3 की साइक्लोमैटिक कम्पलेक्सिटी भी उत्पन्न होती है ({{math|1=10 − 8 + 1 = 3}}).]] एक वैकल्पिक सूत्रीकरण एक ग्राफ़ का उपयोग करना है जिसमें प्रत्येक निकास पॉइंट वापस प्रवेश पॉइंट से जुड़ा होता है। इस स्थिति में, ग्राफ दृढ़ता से जुड़ा हुआ है, और प्रोग्राम की साइक्लोमैटिक कम्पलेक्सिटी इसके ग्राफ की [[चक्रीय संख्या|साईक्लोमैटिक संख्या]] के समतुल्य है (जिसे बेट्टी संख्या # उदाहरण 2 के रूप में भी जाना जाता है: ग्राफ सिद्धांत में पहली बेट्टी संख्या), जिसे इस प्रकार परिभाषित किया गया है<ref name="mccabe76" /><math display="block">M = E - N + P.</math>इसे ग्राफ़ में मौजूद [[रैखिक रूप से स्वतंत्र चक्र|रैखिक रूप से इंडिपेंडेंट चक्र]]ों की संख्या की कंप्यूटेड के रूप में देखा जा सकता है, यानी वे चक्र जिनके समाविष्ट अन्य चक्र शामिल नहीं हैं। ध्यान दें कि क्योंकि प्रत्येक निकास पॉइंट प्रवेश पॉइंट पर वापस लूप करता है, प्रत्येक निकास पॉइंट के लिए कम से कम एक ऐसा चक्र होता है।
एकल प्रोग्राम (या सबरूटीन या मेथड्स) के लिए, {{mvar|P}} हमेशा 1 के समतुल्य होता है। इसलिए एकल सबरूटीन के लिए एक सरल सूत्र है<ref name="Laplante2007">{{cite book|author=Philip A. Laplante|title=सॉफ्टवेयर इंजीनियरिंग के बारे में प्रत्येक इंजीनियर को क्या पता होना चाहिए|date=25 April 2007|publisher=CRC Press|isbn=978-1-4200-0674-2|page=176}}</ref><math display="block">M = E - N + 2.</math>
एकल प्रोग्राम (या सबरूटीन या मेथड्स) के लिए, {{mvar|P}} हमेशा 1 के समतुल्य होता है। इसलिए एकल सबरूटीन के लिए एक सरल सूत्र है<ref name="Laplante2007">{{cite book|author=Philip A. Laplante|title=सॉफ्टवेयर इंजीनियरिंग के बारे में प्रत्येक इंजीनियर को क्या पता होना चाहिए|date=25 April 2007|publisher=CRC Press|isbn=978-1-4200-0674-2|page=176}}</ref><math display="block">M = E - N + 2.</math>
हालाँकि, साइक्लोमैटिक कम्पलेक्सिटी को एक ही समय में ऐसे कई प्रोग्रामों या उपप्रोग्रामों पर लागू किया जा सकता है (उदाहरण के लिए, एक क्लासेस के सभी तरीकों पर), और इन स्थितियों में {{mvar|P}} विचाराधीन प्रोग्रामों की संख्या के समतुल्य होगा, क्योंकि प्रत्येक उपप्रोग्राम ग्राफ़ के डिस्कनेक्ट किए गए सबसेट के रूप में दिखाई देगा।
चूँकि, साइक्लोमैटिक कम्पलेक्सिटी को एक ही समय में ऐसे कई प्रोग्रामों या सबप्रोग्रामों पर लागू किया जा सकता है (उदाहरण के लिए, एक क्लासेस के सभी विधियों पर), और इन स्थितियों में {{mvar|P}} विचाराधीन प्रोग्रामों की संख्या के समतुल्य होगा, क्योंकि प्रत्येक सबप्रोग्राम ग्राफ़ के डिस्कनेक्ट किए गए सबसेट के रूप में दिखाई देता है।


मैककेबे ने दिखाया कि केवल एक प्रवेश पॉइंट और एक निकास पॉइंट के साथ किसी भी संरचित प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी उस प्रोग्राम में निहित डिसीज़न पॉइंटओं (यानी, यदि कथन या कंडीशनल लूप) की संख्या प्लस एक के समतुल्य है। हालाँकि, यह केवल निम्नतम, मशीन-स्तर के निर्देशों पर गिने जाने वाले डिसीज़न पॉइंटओं के लिए सच है।<ref>{{cite web|
मैककेबे ने दिखाया कि केवल एक एंट्री पॉइंट और एक एग्जिट पॉइंट के साथ किसी भी स्ट्रक्चर्ड प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी उस प्रोग्राम में निहित डिसीज़न पॉइंटओं (अर्थात, यदि कथन या कंडीशनल लूप) की संख्या प्लस एक के समतुल्य है। चूँकि, यह केवल निम्नतम, मशीन-स्तर के निर्देशों पर गिने जाने वाले डिसीज़न पॉइंटओं के लिए ट्रू है।<ref>{{cite web|
url=https://www.froglogic.com/blog/tip-of-the-week/what-is-cyclomatic-complexity/| title=What exactly is cyclomatic complexity?|quote=To compute a graph representation of code, we can simply disassemble its assembly code and create a graph following the rules:&nbsp;... |first=Sébastien|last=Fricker|date=April 2018|website=froglogic GmbH|access-date=October 27, 2018}}</ref> यौगिक विधेय से जुड़े डिसीज़न जैसे उच्च-स्तरीय भाषाओं में पाए जाते हैं <code>IF cond1 AND cond2 THEN ...</code> शामिल विधेय चर के संदर्भ में गिना जाना चाहिए, यानी इस उदाहरण में किसी को दो डिसीज़न पॉइंट गिनने चाहिए, क्योंकि मशीन स्तर पर यह समतुल्य है <code>IF cond1 THEN IF cond2 THEN ...</code>.<ref name="mccabe76"/><ref name="ecst">{{cite book|
url=https://www.froglogic.com/blog/tip-of-the-week/what-is-cyclomatic-complexity/| title=What exactly is cyclomatic complexity?|quote=To compute a graph representation of code, we can simply disassemble its assembly code and create a graph following the rules:&nbsp;... |first=Sébastien|last=Fricker|date=April 2018|website=froglogic GmbH|access-date=October 27, 2018}}</ref> यौगिक विधेय से जुड़े डिसीज़न जैसे उच्च-स्तरीय लैंगुएजेस में पाए जाते हैं <code>IF cond1 AND cond2 THEN ...</code> सम्मिलित विधेय चर के संदर्भ में गिना जाना चाहिए, अर्थात इस उदाहरण में किसी को दो डिसीज़न पॉइंट गिनने चाहिए, क्योंकि <code>IF cond1 THEN IF cond2 THEN ...</code> मशीन स्तर पर यह समतुल्य है।<ref name="mccabe76" /><ref name="ecst">{{cite book|
title=Encyclopedia of Computer Science and Technology|
title=Encyclopedia of Computer Science and Technology|
author1=J. Belzer |author2=A. Kent |author3=A. G. Holzman |author4=J. G. Williams|
author1=J. Belzer |author2=A. Kent |author3=A. G. Holzman |author4=J. G. Williams|
Line 28: Line 29:
pages=367–368}}</ref>
pages=367–368}}</ref>


साइक्लोमैटिक कम्पलेक्सिटी को कई निकास पॉइंटओं वाले प्रोग्राम तक बढ़ाया जा सकता है; इस स्थिति में यह समतुल्य है<math display="block">\pi - s + 2,</math>कहाँ <math>\pi</math> प्रोग्राम में डिसीज़न पॉइंटओं की संख्या है, और {{mvar|s}} निकास पॉइंटओं की संख्या है।<ref name="ecst" /><ref name="harrison">{{cite journal | journal=Software: Practice and Experience | title=मैकाबे की जटिलता माप को बहु-निकास कार्यक्रमों पर लागू करना| author=Harrison | date=October 1984 | doi=10.1002/spe.4380141009 | volume=14 | issue=10 | pages=1004–1007 | s2cid=62422337}}</ref>
साइक्लोमैटिक कम्पलेक्सिटी को कई एग्जिट पॉइंटओं वाले प्रोग्राम तक बढ़ाया जा सकता है; इस स्थिति में यह समतुल्य है<math display="block">\pi - s + 2,</math>जहाँ <math>\pi</math> प्रोग्राम में डिसीज़न पॉइंटओं की संख्या है, और {{mvar|s}} एग्जिट पॉइंटओं की संख्या है।<ref name="ecst" /><ref name="harrison">{{cite journal | journal=Software: Practice and Experience | title=मैकाबे की जटिलता माप को बहु-निकास कार्यक्रमों पर लागू करना| author=Harrison | date=October 1984 | doi=10.1002/spe.4380141009 | volume=14 | issue=10 | pages=1004–1007 | s2cid=62422337}}</ref>


===बीजगणितीय टोपोलॉजी के संदर्भ में स्पष्टीकरण===
===बीजगणितीय टोपोलॉजी के संदर्भ में स्पष्टीकरण===
ग्राफ़ का एक सम उपसमूह (जिसे [[यूलेरियन पथ|यूलेरियन पाथ]] के रूप में भी जाना जाता है) वह है जहां प्रत्येक शीर्ष (ग्राफ़ सिद्धांत) किनारों की सम संख्या के साथ घटना है; ऐसे उपसमूह चक्रों और पृथक शीर्षों के संघ हैं। निम्नलिखित में, सम सबग्राफ को उनके एज सेट के साथ पहचाना जाएगा, जो केवल उन सम सबग्राफ पर विचार करने के समतुल्य है जिसमें पूर्ण ग्राफ के सभी शीर्ष शामिल हैं।
ग्राफ़ का एक सम उपसमूह (जिसे [[यूलेरियन पथ|यूलेरियन पाथ]] के रूप में भी जाना जाता है) वह है जहां प्रत्येक शीर्ष (ग्राफ़ सिद्धांत) एजेस की सम संख्या के साथ घटना है; ऐसे उपसमूह साइकल्स और पृथक शीर्षों के संघ हैं। निम्नलिखित में, सम सबग्राफ को उनके एज सेट के साथ पहचाना जाएगा, जो केवल उन सम सबग्राफ पर विचार करने के समतुल्य है जिसमें पूर्ण ग्राफ के सभी शीर्ष सम्मिलित हैं।


ग्राफ के सभी सम उपग्राफों का सेट सममित अंतर के तहत बंद है, और इस प्रकार इसे जीएफ (2) पर एक वेक्टर स्थान के रूप में देखा जा सकता है; इस सदिश समष्टि को ग्राफ़ का चक्र समष्टि कहा जाता है। ग्राफ़ की साईक्लोमैटिक संख्या को इस स्थान के आयाम के रूप में परिभाषित किया गया है। चूँकि [[GF(2)]] में दो तत्व हैं और चक्र स्थान आवश्यक रूप से परिमित है, चक्रवाती संख्या भी चक्र स्थान में तत्वों की संख्या के 2-लघुगणक के समतुल्य है।
ग्राफ के सभी सम उपग्राफों का सेट सममित अंतर के तहत बंद है, और इस प्रकार इसे जीएफ (2) पर एक वेक्टर समष्टि के रूप में देखा जा सकता है; इस सदिश समष्टि को ग्राफ़ का साइकल्स समष्टि कहा जाता है। ग्राफ़ की साईक्लोमैटिक संख्या को इस समष्टि के आयाम के रूप में परिभाषित किया गया है। चूँकि [[GF(2)|जीएफ(2)]] में दो तत्व हैं और साइकल्स समष्टि एसेंशियल रूप से परिमित है, साइकल्स संख्या भी साइकल्स समष्टि में तत्वों की संख्या के 2-लघुगणक के समतुल्य है।


चक्र स्थान के लिए एक आधार आसानी से ग्राफ सिद्धांत # ग्राफ के पेड़ों की शब्दावली को ठीक करके बनाया जा सकता है, और फिर जंगल में नहीं एक एज से बने चक्रों और उस एज के अंतिम पॉइंटओं को जोड़ने वाले जंगल में पाथ पर विचार किया जा सकता है; ये चक्र चक्र स्थान के लिए आधार बनाते हैं। इसलिए, साइक्लोमैटिक संख्या ग्राफ़ के अधिकतम फैले हुए जंगल में नहीं किनारों की संख्या के समतुल्य होती है। चूँकि ग्राफ़ के अधिकतम फैले हुए जंगल में किनारों की संख्या शीर्षों की संख्या घटा घटकों की संख्या के समतुल्य होती है, सूत्र <math>E-N+P</math> साईक्लोमैटिक संख्या के लिए ऊपर इस प्रकार है।<ref>{{cite book
साइकल्स समष्टि के लिए एक आधार सरलता से ग्राफ सिद्धांत के ट्री की लाइब्रेरी को सही करके बनाया जा सकता है, और फिर फॉरेस्ट में नहीं एक एज से बने साइकल्स और उस एज के अंतिम पॉइंटओं को जोड़ने वाले फॉरेस्ट में पाथ पर विचार किया जा सकता है; ये साइकल्स साइकल्स समष्टि के लिए आधार बनाते हैं। इसलिए, साइक्लोमैटिक संख्या ग्राफ़ के अधिकतम फैले हुए फॉरेस्ट में नहीं एजेस की संख्या के समतुल्य होती है। चूँकि ग्राफ़ के अधिकतम फैले हुए फॉरेस्ट में एजेस की संख्या शीर्षों की संख्या घटा घटकों की संख्या के समतुल्य होती है, सूत्र <math>E-N+P</math> साईक्लोमैटिक संख्या के लिए ऊपर इस प्रकार है।<ref>{{cite book
|last=Diestel
|last=Diestel
|first=Reinhard
|first=Reinhard
Line 46: Line 47:
|isbn=978-0-387-98976-1
|isbn=978-0-387-98976-1
}}</ref>
}}</ref>
अधिक टोपोलॉजिकली झुकाव के लिए, साइक्लोमैटिक कम्पलेक्सिटी को वैकल्पिक रूप से एक सापेक्ष बेट्टी संख्या, एक सापेक्ष होमोलॉजी समूह के आकार के रूप में परिभाषित किया जा सकता है:
 
अधिक टोपोलॉजिकली इंक्लाइनड के लिए, साइक्लोमैटिक कम्पलेक्सिटी को वैकल्पिक रूप से एक सापेक्ष बेट्टी संख्या, एक सापेक्ष होमोलॉजी समूह के आकार के रूप में परिभाषित किया जा सकता है:
<math display="block">M := b_1(G,t) := \operatorname{rank}H_1(G,t),</math>
<math display="block">M := b_1(G,t) := \operatorname{rank}H_1(G,t),</math>
जिसे टर्मिनल नोड्स टी के सापेक्ष ग्राफ़ जी के पहले होमोलॉजी समूह की रैंक के रूप में पढ़ा जाता है। यह एक प्रवेश से निकास तक फ्लो ग्राफ के माध्यम से रैखिक रूप से इंडिपेंडेंट पाथ्स की संख्या कहने का एक तकनीकी तरीका है, जहां:
जिसे टर्मिनल नोड्स टी के सापेक्ष ग्राफ़ जी के पहले होमोलॉजी समूह की रैंक के रूप में पढ़ा जाता है। यह एक एंट्री से एग्जिट तक फ्लो ग्राफ के माध्यम से रैखिक रूप से इंडिपेंडेंट पाथ्स की संख्या कहने का एक तकनीकी विधि है, जहां:
* रैखिक रूप से इंडिपेंडेंट समरूपता से मेल खाता है, और इसका मतलब है कि कोई बैकट्रैकिंग को दोगुना नहीं करता है;
* रैखिक रूप से इंडिपेंडेंट समरूपता से मेल खाता है, और इसका अर्थ है कि कोई बैकट्रैकिंग को दोगुना नहीं करता है;
* पाथ प्रथम समरूपता से मेल खाते हैं: पाथ एक 1-आयामी वस्तु है;
* पाथ प्रथम समरूपता से मेल खाते हैं: पाथ एक 1-आयामी वस्तु है;
* सापेक्ष का अर्थ है कि पाथ किसी प्रवेश या निकास पॉइंट पर शुरू और समाप्त होना चाहिए।
* सापेक्ष का अर्थ है कि पाथ किसी एंट्री या एग्जिट पॉइंट पर स्टार्ट और फ़िनिश होनी चाहिए।


यह साईक्लोमैटिक कम्पलेक्सिटी की सहज धारणा से मेल खाता है, और ऊपर बताए अनुसार कंप्यूटेड की जा सकती है।
यह साईक्लोमैटिक कम्पलेक्सिटी की सहज धारणा से मेल खाता है, और ऊपर बताए अनुसार कंप्यूटेड की जा सकती है।


वैकल्पिक रूप से, कोई किसी दिए गए घटक पर सभी टर्मिनल नोड्स की पहचान करके (एक साथ चिपकाकर) पूर्ण बेट्टी संख्या (पूर्ण समरूपता - सापेक्ष नहीं) के माध्यम से इसकी कंप्यूटेड कर सकता है (या समकक्ष, प्रवेश द्वार से निकास को जोड़ने वाले पाथ बनाएं), जिस स्थिति में (नए, संवर्धित ग्राफ को कॉल करना) <math>\tilde G</math>, जो है ), एक प्राप्त होता है
वैकल्पिक रूप से, कोई किसी दिए गए घटक पर सभी टर्मिनल नोड्स की पहचान करके (एक साथ चिपकाकर) पूर्ण बेट्टी संख्या (पूर्ण समरूपता - सापेक्ष नहीं) के माध्यम से इसकी कंप्यूटेड कर सकता है (या समकक्ष, एंट्री द्वार से एग्जिट को जोड़ने वाले पाथ बनाएं), जिस स्थिति में (नए, संवर्धित ग्राफ को कॉल करना) <math>\tilde G</math>, जो है ), एक प्राप्त होता है
<math display="block">M = b_1(\tilde G) = \operatorname{rank}H_1(\tilde G).</math>
<math display="block">M = b_1(\tilde G) = \operatorname{rank}H_1(\tilde G).</math>
इसकी कंप्यूटेड [[होमोटॉपी]] के माध्यम से भी की जा सकती है। यदि कोई (जुड़े हुए) कंट्रोल-फ्लो ग्राफ को 1-आयामी [[सीडब्ल्यू कॉम्प्लेक्स]] मानता है, तो इसे कहा जाता है <math>X</math>, फिर का [[मौलिक समूह]] <math>X</math> होगा <math>\pi_1(X) \cong \Z^{*n}</math>. का मान है <math>n+1</math> साईक्लोमैटिक कम्पलेक्सिटी है. मौलिक समूह कंप्यूटेड करता है कि होमोटॉपी तक ग्राफ़ के माध्यम से कितने लूप हैं, और इसलिए हम सहज रूप से जो अपेक्षा करते हैं उसके साथ संरेखित होता है।
इसकी कंप्यूटेड [[होमोटॉपी]] के माध्यम से भी की जा सकती है। यदि कोई (जुड़े हुए) कंट्रोल-फ्लो ग्राफ को 1-आयामी [[सीडब्ल्यू कॉम्प्लेक्स]] मानता है, तो इसे कहा जाता है <math>X</math>, फिर का [[मौलिक समूह]] <math>X</math> होगा <math>\pi_1(X) \cong \Z^{*n}</math>. का मान है <math>n+1</math> साईक्लोमैटिक कम्पलेक्सिटी है. मौलिक समूह कंप्यूटेड करता है कि होमोटॉपी तक ग्राफ़ के माध्यम से कितने लूप हैं, और इसलिए हम सहज रूप से जो अपेक्षा करते हैं उसके साथ संरेखित होता है।
Line 71: Line 73:
==अनुप्रयोग==
==अनुप्रयोग==


===विकास के दौरान कम्पलेक्सिटी को सीमित करना===
===विकास के समय कम्पलेक्सिटी को सीमित करना===
मैककेबे के मूल अनुप्रयोगों में से एक प्रोग्राम विकास के दौरान दिनचर्या की कम्पलेक्सिटी को सीमित करना था; उन्होंने सुझाव दिया कि प्रोग्रामर्स को अपने द्वारा विकसित किए जा रहे मॉड्यूल की कम्पलेक्सिटी की कंप्यूटेड करनी चाहिए, और जब भी मॉड्यूल की साइक्लोमैटिक कम्पलेक्सिटी 10 से अधिक हो तो उन्हें छोटे मॉड्यूल में विभाजित करना चाहिए।<ref name="mccabe76" />इस अभ्यास को [[एनआईएसटी]] संरचित टैस्टिंग पद्धति द्वारा अपनाया गया था, इस अवलोकन के साथ कि मैककेबे के मूल प्रकाशन के बाद से, 10 के आंकड़े को पर्याप्त पुष्ट साक्ष्य प्राप्त हुए थे, लेकिन कुछ परिस्थितियों में प्रतिबंध में ढील देना और 15 तक की कम्पलेक्सिटी वाले मॉड्यूल को अनुमति देना उचित हो सकता है। चूंकि पद्धति ने स्वीकार किया कि सहमति-सीमा से परे जाने के लिए कभी-कभी कारण थे, इसने अपनी सिफारिश को प्रत्येक मॉड्यूल के लिए, या तो साइक्लोमैटिक कम्पलेक्सिटी को [सहमत-सीमा] तक सीमित कर दिया या एक प्रदान किया। सीमा क्यों पार की गई इसका लिखित स्पष्टीकरण।<ref name="nist">{{cite web|
मैककेबे के मूल अनुप्रयोगों में से एक प्रोग्राम विकास के समय दिनचर्या की कम्पलेक्सिटी को सीमित करना था; उन्होंने सुझाव दिया कि प्रोग्रामर्स को अपने द्वारा विकसित किए जा रहे मॉड्यूल की कम्पलेक्सिटी की कंप्यूटेड करनी चाहिए, और जब भी मॉड्यूल की साइक्लोमैटिक कम्पलेक्सिटी 10 से अधिक हो तो उन्हें छोटे मॉड्यूल में विभाजित करना चाहिए,<ref name="mccabe76" /> इस अभ्यास को [[एनआईएसटी]] स्ट्रक्चर्ड टैस्टिंग पद्धति द्वारा अपनाया गया था, इस अवलोकन के साथ कि मैककेबे के मूल प्रकाशन के पश्चात से, 10 के आंकड़े को पर्याप्त पुष्ट साक्ष्य प्राप्त हुए थे, लेकिन कुछ परिस्थितियों में प्रतिबंध में छोड़ देना और 15 तक की कम्पलेक्सिटी वाले मॉड्यूल को अनुमति देना उचित हो सकता है। चूंकि पद्धति ने स्वीकार किया कि सहमति-सीमा से परे जाने के लिए कभी-कभी कारण थे, इसने अपनी सिफारिश को प्रत्येक मॉड्यूल के लिए, या तो साइक्लोमैटिक कम्पलेक्सिटी को [सहमत-सीमा] तक सीमित कर दिया या एक प्रदान किया गया है। सीमा क्यों पार की गई इसका लिखित स्पष्टीकरण भी सम्मिलित होता है।<ref name="nist">{{cite web|
url=http://www.mccabe.com/pdf/mccabe-nist235r.pdf| title=Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric|author1=Arthur H. Watson |author2=Thomas J. McCabe | year=1996|publisher=NIST Special Publication 500-235}}</ref>
url=http://www.mccabe.com/pdf/mccabe-nist235r.pdf| title=Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric|author1=Arthur H. Watson |author2=Thomas J. McCabe | year=1996|publisher=NIST Special Publication 500-235}}</ref>
===किसी प्रोग्राम की संरचना को मापना===
===किसी प्रोग्राम की संरचना को मापना===
{{Main|Essential complexity (numerical measure of "structuredness")}} मैककेबे के 1976 के पेपर का खंड VI यह निर्धारित करने से संबंधित है कि गैर-संरचित प्रोग्रामिंग के कंट्रोल-फ्लो ग्राफ़ (सीएफजी) उनके सबग्राफ के संदर्भ में कैसा दिखते हैं, जिसे मैककेबे पहचानते हैं। (उस भाग के विवरण के लिए [[संरचित कार्यक्रम प्रमेय|संरचित प्रोग्राम प्रमेय]] देखें।) मैककेबे ने उस खंड को एक संख्यात्मक माप का प्रस्ताव देकर समाप्त किया है कि कोई दिया गया प्रोग्राम संरचित प्रोग्रामिंग आदर्श के कितना करीब है, यानी मैककेबे के नवशास्त्रवाद का उपयोग करके इसकी संरचितता। मैककेबे ने इस उद्देश्य के लिए जो माप तैयार किया, उसे आवश्यक कम्पलेक्सिटी (संरचितता का संख्यात्मक माप) कहा।<ref name="mccabe76" />
{{Main|एसेंशियल कम्पलेक्सिटी ("संरचितता" का संख्यात्मक माप)}}
 
मैककेबे के 1976 के पेपर का खंड VI यह निर्धारित करने से संबंधित है कि नॉन-स्ट्रक्चर्ड प्रोग्रामिंग के कंट्रोल-फ्लो ग्राफ़ (सीएफजी) उनके सबग्राफ के संदर्भ में कैसा दिखते हैं, जिसे मैककेबे पहचानते हैं। (उस भाग के विवरण के लिए [[संरचित कार्यक्रम प्रमेय|स्ट्रक्चर्ड प्रोग्राम प्रमेय]] देखें।) मैककेबे ने उस खंड को एक संख्यात्मक माप का प्रस्ताव देकर समाप्त किया है कि कोई दिया गया प्रोग्राम स्ट्रक्चर्ड प्रोग्रामिंग आदर्श के कितना निकट है, अर्थात मैककेबे के नवशास्त्रवाद का उपयोग करके इसकी स्ट्रक्चर्डता मैककेबे ने इस उद्देश्य के लिए जो माप तैयार किया, उसे एसेंशियल कम्पलेक्सिटी (स्ट्रक्चर्डता का संख्यात्मक माप) कहा जाता है।<ref name="mccabe76" />


इस माप की कंप्यूटेड करने के लिए, मूल सीएफजी को एकल-प्रविष्टि और एकल-निकास पॉइंट वाले सबग्राफ की पहचान करके पुनरावृत्त रूप से कम किया जाता है, जिन्हें फिर एक नोड द्वारा प्रतिस्थापित किया जाता है। यह कटौती इस बात से मेल खाती है कि यदि कोई इंसान कोड के बड़े हिस्से से एक सबरूटीन निकालता है तो वह क्या करेगा। (आजकल ऐसी प्रक्रिया [[पुनर्रचना]] के छत्र शब्द के अंतर्गत आती है।) मैककेबे की कटौती मेथड्स को बाद में कुछ पाठ्यपुस्तकों में संक्षेपण कहा गया, क्योंकि इसे संक्षेपण (ग्राफ सिद्धांत) के सामान्यीकरण के रूप में देखा गया था।<ref>{{cite book|author=Paul C. Jorgensen|title=Software Testing: A Craftsman's Approach, Second Edition|url=https://books.google.com/books?id=Yph_AwAAQBAJ&pg=PA150|year=2002|publisher=CRC Press|isbn=978-0-8493-0809-3|pages=150–153|edition=2nd}}</ref> यदि कोई प्रोग्राम संरचित है, तो मैककेबे की कमी/संक्षेपण प्रक्रिया इसे एकल सीएफजी नोड में कम कर देती है। इसके विपरीत, यदि प्रोग्राम संरचित नहीं है, तो पुनरावृत्त प्रक्रिया अपरिवर्तनीय भाग की पहचान करेगी। मैककेबे द्वारा परिभाषित आवश्यक कम्पलेक्सिटी माप केवल इस अपरिवर्तनीय ग्राफ की साईक्लोमैटिक कम्पलेक्सिटी है, इसलिए यह सभी संरचित प्रोग्रामों के लिए सटीक रूप से 1 होगा, लेकिन गैर-संरचित प्रोग्रामों के लिए एक से अधिक होगा।<ref name="nist"/>{{rp|80}}
इस माप की कंप्यूटेड करने के लिए, मूल सीएफजी को एकल-प्रविष्टि और एकल-एग्जिट पॉइंट वाले सबग्राफ की पहचान करके पुनरावृत्त रूप से कम किया जाता है, जिन्हें फिर एक नोड द्वारा प्रतिस्थापित किया जाता है। यह कटौती इस बात से मेल खाती है कि यदि कोई इंसान कोड के बड़े हिस्से से एक सबरूटीन निकालता है तो वह क्या करेगा, (आजकल ऐसी प्रक्रिया [[पुनर्रचना]] के छत्र शब्द के अंतर्गत आती है।) मैककेबे की कटौती मेथड्स को पश्चात में कुछ पाठ्यपुस्तकों में संक्षेपण कहा गया, क्योंकि इसे संक्षेपण (ग्राफ सिद्धांत) के सामान्यीकरण के रूप में देखा गया था।<ref>{{cite book|author=Paul C. Jorgensen|title=Software Testing: A Craftsman's Approach, Second Edition|url=https://books.google.com/books?id=Yph_AwAAQBAJ&pg=PA150|year=2002|publisher=CRC Press|isbn=978-0-8493-0809-3|pages=150–153|edition=2nd}}</ref> यदि कोई प्रोग्राम स्ट्रक्चर्ड है, तो मैककेबे की कमी/संक्षेपण प्रक्रिया इसे एकल सीएफजी नोड में कम कर देती है। इसके विपरीत, यदि प्रोग्राम स्ट्रक्चर्ड नहीं है, तो पुनरावृत्त प्रक्रिया अपरिवर्तनीय भाग की पहचान करेगी। मैककेबे द्वारा परिभाषित एसेंशियल कम्पलेक्सिटी माप केवल इस अपरिवर्तनीय ग्राफ की साईक्लोमैटिक कम्पलेक्सिटी है, इसलिए यह सभी स्ट्रक्चर्ड प्रोग्रामों के लिए सटीक रूप से 1 होगा, लेकिन नॉन-स्ट्रक्चर्ड प्रोग्रामों के लिए एक से अधिक होता है।<ref name="nist"/>{{rp|80}}
===सॉफ़्टवेयर टैस्टिंग के लिए निहितार्थ===
===सॉफ़्टवेयर टैस्टिंग के लिए निहितार्थ===
साइक्लोमैटिक कम्पलेक्सिटी का एक अन्य अनुप्रयोग उन टैस्टिंग स्थितियों की संख्या निर्धारित करना है जो किसी विशेष मॉड्यूल के संपूर्ण टैस्टिंग कवरेज को प्राप्त करने के लिए आवश्यक हैं।
साइक्लोमैटिक कम्पलेक्सिटी का एक अन्य अनुप्रयोग उन टैस्टिंग स्थितियों की संख्या निर्धारित करना है जो किसी विशेष मॉड्यूल के संपूर्ण टैस्टिंग कवरेज को प्राप्त करने के लिए एसेंशियल हैं।


यह साईक्लोमैटिक कम्पलेक्सिटी के दो गुणों के कारण उपयोगी है, {{mvar|M}}, एक विशिष्ट मॉड्यूल के लिए:
यह साईक्लोमैटिक कम्पलेक्सिटी के दो गुणों के कारण उपयोगी है, {{mvar|M}}, एक विशिष्ट मॉड्यूल के लिए:
* {{mvar|M}} पूर्ण [[शाखा कवरेज]] प्राप्त करने के लिए आवश्यक टैस्टिंग स्थितियों की संख्या के लिए ऊपरी सीमा है।
* {{mvar|M}} पूर्ण [[शाखा कवरेज|ब्रांच कवरेज]] प्राप्त करने के लिए एसेंशियल टैस्टिंग स्थितियों की संख्या के लिए ऊपरी सीमा है।
* {{mvar|M}} कंट्रोल-फ्लो ग्राफ़ (सीएफजी) के माध्यम से पाथ्स की संख्या के लिए निचली सीमा है। यह मानते हुए कि प्रत्येक टैस्टिंग मामला एक पाथ लेता है, [[पथ कवरेज|पाथ कवरेज]] प्राप्त करने के लिए आवश्यक स्थितियों की संख्या उन पाथ्स की संख्या के समतुल्य होती है जिन्हें वास्तव में लिया जा सकता है। लेकिन कुछ पाथ असंभव हो सकते हैं, इसलिए हालांकि सीएफजी के माध्यम से पाथ्स की संख्या स्पष्ट रूप से पाथ कवरेज के लिए आवश्यक टैस्टिंग स्थितियों की संख्या पर ऊपरी सीमा है, यह बाद वाली संख्या (संभावित पाथ्स की) कभी-कभी कम होती है {{mvar|M}}.
* {{mvar|M}} कंट्रोल-फ्लो ग्राफ़ (सीएफजी) के माध्यम से पाथ्स की संख्या के लिए निचली सीमा है। यह मानते हुए कि प्रत्येक टैस्टिंग विधि एक पाथ लेती है, [[पथ कवरेज|पाथ कवरेज]] प्राप्त करने के लिए एसेंशियल स्थितियों की संख्या उन पाथ्स की संख्या के समतुल्य होती है जिन्हें वास्तव में लिया जा सकता है। लेकिन कुछ पाथ असंभव हो सकते हैं, इसलिए हालांकि सीएफजी के माध्यम से पाथ्स की संख्या स्पष्ट रूप से पाथ कवरेज के लिए एसेंशियल टैस्टिंग स्थितियों की संख्या पर ऊपरी सीमा है, यह पश्चात वाली संख्या (संभावित पाथ्स की) कभी-कभी कम होती है {{mvar|M}}.


उपरोक्त तीनों संख्याएँ समान हो सकती हैं: शाखा कवरेज <math>\leq</math> साइक्लोमेटिक कम्पलेक्सिटी <math>\leq</math> पाथ्स की संख्या.
उपरोक्त तीनों संख्याएँ समान हो सकती हैं: ब्रांच कवरेज <math>\leq</math> साइक्लोमेटिक कम्पलेक्सिटी <math>\leq</math> पाथ्स की संख्या


उदाहरण के लिए, एक प्रोग्राम पर विचार करें जिसमें दो अनुक्रमिक यदि-तब-अन्यथा कथन शामिल हैं।
उदाहरण के लिए, एक प्रोग्राम पर विचार करें जिसमें दो अनुक्रमिक यदि-तब-अन्यथा कथन सम्मिलित हैं।


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 101: Line 105:
</syntaxhighlight>
</syntaxhighlight>


[[File:Control flow graph of function with two if else statements.svg|thumb|250px|right|उपरोक्त स्रोत कोड का कंट्रोल-फ्लो ग्राफ़; लाल वृत्त फ़ंक्शन का प्रवेश पॉइंट है, और नीला वृत्त निकास पॉइंट है। ग्राफ़ को मजबूती से कनेक्ट करने के लिए निकास को प्रवेश से जोड़ा गया है।]]इस उदाहरण में, पूर्ण शाखा कवरेज प्राप्त करने के लिए दो टैस्टिंग स्थिति पर्याप्त हैं, जबकि पूर्ण पाथ कवरेज के लिए चार आवश्यक हैं। प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी 3 है (क्योंकि प्रोग्राम के लिए दृढ़ता से जुड़े ग्राफ में 9 एज, 7 नोड्स और 1 जुड़ा घटक शामिल है) ({{math|9 − 7 + 1}}).
[[File:Control flow graph of function with two if else statements.svg|thumb|250px|right|उपरोक्त स्रोत कोड का कंट्रोल-फ्लो ग्राफ़; लाल वृत्त फ़ंक्शन का एंट्री पॉइंट है, और नीला वृत्त एग्जिट पॉइंट है। ग्राफ़ को मजबूती से कनेक्ट करने के लिए एग्जिट को एंट्री से जोड़ा गया है।]]इस उदाहरण में, पूर्ण ब्रांच कवरेज प्राप्त करने के लिए दो टैस्टिंग स्थिति पर्याप्त हैं, जबकि पूर्ण पाथ कवरेज के लिए चार एसेंशियल हैं। प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी 3 है (क्योंकि प्रोग्राम के लिए दृढ़ता से जुड़े ग्राफ में 9 एज, 7 नोड्स और 1 जुड़ा घटक ({{math|9 − 7 + 1}}) सम्मिलित है)।


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


दुर्भाग्य से, किसी प्रोग्राम के माध्यम से सभी संभावित पाथ्स का टैस्टिंग करना हमेशा व्यावहारिक नहीं होता है। ऊपर दिए गए उदाहरण को ध्यान में रखते हुए, हर बार एक अतिरिक्त यदि-तब-अन्यथा कथन जोड़ा जाता है, तो संभावित पाथ्स की संख्या 2 गुना बढ़ जाती है। जैसे-जैसे प्रोग्राम इस तरह बढ़ता है, यह जल्दी से उस पॉइंट पर पहुंच जाता है जहां सभी पाथ्स का टैस्टिंग करना अव्यावहारिक हो जाता है।
दुर्भाग्य से, किसी प्रोग्राम के माध्यम से सभी संभावित पाथ्स का टैस्टिंग करना हमेशा व्यावहारिक नहीं होता है। ऊपर दिए गए उदाहरण को ध्यान में रखते हुए, हर बार एक अतिरिक्त यदि-तब-अन्यथा कथन जोड़ा जाता है, तो संभावित पाथ्स की संख्या 2 गुना बढ़ जाती है। जैसे-जैसे प्रोग्राम इस तरह बढ़ता है, यह जल्दी से उस पॉइंट पर पहुंच जाता है जहां सभी पाथ्स का टैस्टिंग करना अव्यावहारिक हो जाता है।


एक सामान्य टैस्टिंग रणनीति, उदाहरण के लिए एनआईएसटी संरचित टैस्टिंग पद्धति द्वारा समर्थित, मॉड्यूल की पर्याप्त कवरेज प्राप्त करने के लिए आवश्यक [[व्हाइट-बॉक्स परीक्षण|व्हाइट-बॉक्स टैस्टिंग]] | व्हाइट-बॉक्स टैस्टिंगों की संख्या निर्धारित करने के लिए मॉड्यूल की साइक्लोमैटिक कम्पलेक्सिटी का उपयोग करना है। लगभग सभी स्थितियों में, ऐसी पद्धति के अनुसार, एक मॉड्यूल में कम से कम उतने ही टैस्टिंग होने चाहिए जितने उसकी साईक्लोमैटिक कम्पलेक्सिटी के हों; अधिकांश स्थितियों में, टैस्टिंगों की यह संख्या फ़ंक्शन के सभी प्रासंगिक पाथ्स का अभ्यास करने के लिए पर्याप्त है।<ref name="nist"/>
एक सामान्य टैस्टिंग रणनीति, उदाहरण के लिए एनआईएसटी स्ट्रक्चर्ड टैस्टिंग पद्धति द्वारा समर्थित, मॉड्यूल की पर्याप्त कवरेज प्राप्त करने के लिए एसेंशियल [[व्हाइट-बॉक्स परीक्षण|व्हाइट-बॉक्स टैस्टिंग]] की संख्या निर्धारित करने के लिए मॉड्यूल की साइक्लोमैटिक कम्पलेक्सिटी का उपयोग करना है। लगभग सभी स्थितियों में, ऐसी पद्धति के अनुसार, एक मॉड्यूल में कम से कम उतने ही टैस्टिंग होने चाहिए जितने उसकी साईक्लोमैटिक कम्पलेक्सिटी के हों; अधिकांश स्थितियों में, टैस्टिंगों की यह संख्या फ़ंक्शन के सभी प्रासंगिक पाथ्स का अभ्यास करने के लिए पर्याप्त है।<ref name="nist"/>


एक फ़ंक्शन के उदाहरण के रूप में जिसे सटीक रूप से टैस्टिंग करने के लिए केवल शाखा कवरेज से अधिक की आवश्यकता होती है, उपरोक्त फ़ंक्शन पर फिर से विचार करें, लेकिन मान लें कि बग होने से बचने के लिए, कोई भी कोड जो कॉल करता है <code>f1()</code> या <code>f3()</code> दूसरे को भी बुलाना चाहिए.{{efn|This is a fairly common type of condition; consider the possibility that <code>f1</code> allocates some resource which <code>f3</code> releases.}} यह मानते हुए कि के परिणाम <code>c1()</code> और <code>c2()</code> इंडिपेंडेंट हैं, इसका मतलब है कि ऊपर प्रस्तुत फ़ंक्शन में एक बग है। शाखा कवरेज हमें केवल दो टैस्टिंगों के साथ मेथड्स का टैस्टिंग करने की अनुमति देगा, और टैस्टिंगों का एक संभावित सेट निम्नलिखित स्थितियों का टैस्टिंग करना होगा:
एक फ़ंक्शन के उदाहरण के रूप में जिसे सटीक रूप से टैस्टिंग करने के लिए केवल ब्रांच कवरेज से अधिक की एसेंशियलता होती है, उपरोक्त फ़ंक्शन पर फिर से विचार करें, लेकिन मान लें कि बग होने से बचने के लिए, कोई भी कोड जो कॉल करता है <code>f1()</code> या <code>f3()</code> दूसरे को भी बुलाना चाहिए.{{efn|This is a fairly common type of condition; consider the possibility that <code>f1</code> allocates some resource which <code>f3</code> releases.}} यह मानते हुए कि के परिणाम <code>c1()</code> और <code>c2()</code> इंडिपेंडेंट हैं, इसका अर्थ है कि ऊपर प्रस्तुत फ़ंक्शन में एक बग है। ब्रांच कवरेज हमें केवल दो टैस्टिंगों के साथ मेथड्स का टैस्टिंग करने की अनुमति देगा, और टैस्टिंगों का एक संभावित सेट निम्नलिखित स्थितियों का टैस्टिंग करना होगा:


* <code>c1()</code> सत्य लौटाता है और <code>c2()</code> सत्य लौटाता है
* <code>c1()</code> रिटर्न ट्रू है और <code>c2()</code> रिटर्न ट्रू है
* <code>c1()</code> झूठा रिटर्न देता है और <code>c2()</code> झूठा लौटाता है
* <code>c1()</code> रिटर्न फॉल्स है और <code>c2()</code> रिटर्न फॉल्स है


इनमें से कोई भी मामला बग को उजागर नहीं करता है। हालाँकि, यदि हम आवश्यक टैस्टिंगों की संख्या को इंगित करने के लिए साइक्लोमैटिक कम्पलेक्सिटी का उपयोग करते हैं, तो संख्या बढ़कर 3 हो जाती है। इसलिए हमें निम्नलिखित पाथ्स में से एक का टैस्टिंग करना चाहिए:
इनमें से कोई भी विधि बग को उजागर नहीं करता है। चूँकि, यदि हम एसेंशियल टैस्टिंगों की संख्या को इंगित करने के लिए साइक्लोमैटिक कम्पलेक्सिटी का उपयोग करते हैं, तो संख्या बढ़कर 3 हो जाती है। इसलिए हमें निम्नलिखित पाथ्स में से एक का टैस्टिंग करना चाहिए:


* <code>c1()</code> सत्य लौटाता है और <code>c2()</code> झूठा लौटाता है
* <code>c1()</code> रिटर्न ट्रू है और <code>c2()</code> रिटर्न फॉल्स है
* <code>c1()</code> झूठा रिटर्न देता है और <code>c2()</code> सत्य लौटाता है
* <code>c1()</code> रिटर्न फॉल्स देता है और <code>c2()</code> रिटर्न ट्रू है


इनमें से कोई भी टैस्टिंग बग को उजागर करेगा।
इनमें से कोई भी टैस्टिंग बग को उजागर करता है।


===दोषों की संख्या से सहसंबंध===
===दोषों की संख्या से सहसंबंध===
Line 126: Line 130:
url=http://www.eecs.qmul.ac.uk/~norman/papers/defects_prediction_preprint105579.pdf|
url=http://www.eecs.qmul.ac.uk/~norman/papers/defects_prediction_preprint105579.pdf|
title=A Critique of Software Defect Prediction Models|
title=A Critique of Software Defect Prediction Models|
year=1999|volume=25|issue=3|pages=675–689|doi=10.1109/32.815326|citeseerx=10.1.1.548.2998 }}</ref> कुछ अध्ययन<ref name="schroeder99">{{cite journal| title=ऑब्जेक्ट-ओरिएंटेड मेट्रिक्स के लिए एक व्यावहारिक मार्गदर्शिका|author=Schroeder, Mark|s2cid=14945518|year=1999|volume=1|issue=6|pages=30–36|journal=IT Professional |doi=10.1109/6294.806902}}</ref> साईक्लोमैटिक कम्पलेक्सिटी और दोषों के बीच एक सकारात्मक सहसंबंध खोजें: जिन कार्यों और मेथड्सयों में सबसे अधिक कम्पलेक्सिटी होती है उनमें सबसे अधिक दोष भी होते हैं। हालाँकि, साइक्लोमैटिक कम्पलेक्सिटी और प्रोग्राम आकार (आमतौर पर कोड की पंक्तियों में मापा जाता है) के बीच संबंध को कई बार प्रदर्शित किया गया है। [[ द हैटन्स |द हैटन्स]] ने दावा किया है<ref name="taic">
year=1999|volume=25|issue=3|pages=675–689|doi=10.1109/32.815326|citeseerx=10.1.1.548.2998 }}</ref> कुछ अध्ययन<ref name="schroeder99">{{cite journal| title=ऑब्जेक्ट-ओरिएंटेड मेट्रिक्स के लिए एक व्यावहारिक मार्गदर्शिका|author=Schroeder, Mark|s2cid=14945518|year=1999|volume=1|issue=6|pages=30–36|journal=IT Professional |doi=10.1109/6294.806902}}</ref> साईक्लोमैटिक कम्पलेक्सिटी और दोषों के बीच एक सकारात्मक सहसंबंध खोजें: जिन कार्यों और मेथड्सयों में सबसे अधिक कम्पलेक्सिटी होती है उनमें सबसे अधिक दोष भी होते हैं। चूँकि, साइक्लोमैटिक कम्पलेक्सिटी और प्रोग्राम आकार (आमतौर पर कोड की पंक्तियों में मापा जाता है) के बीच संबंध को कई बार प्रदर्शित किया गया है। [[ द हैटन्स |द हैटन्स]] ने दावा किया है<ref name="taic">
{{cite web |url=http://www.leshatton.org/TAIC2008-29-08-2008.html |title=The role of empiricism in improving the reliability of future software |author=Les Hatton |year=2008 |at=version 1.1}}</ref> उस कम्पलेक्सिटी में कोड की पंक्तियों के समान ही पूर्वानुमान लगाने की क्षमता होती है।
{{cite web |url=http://www.leshatton.org/TAIC2008-29-08-2008.html |title=The role of empiricism in improving the reliability of future software |author=Les Hatton |year=2008 |at=version 1.1}}</ref> उस कम्पलेक्सिटी में कोड की पंक्तियों के समान ही पूर्वानुमान लगाने की क्षमता होती है।
प्रोग्राम के आकार को नियंत्रित करने वाले अध्ययन (अर्थात, अलग-अलग कम्पलेक्सिटीओं वाले लेकिन समान आकार वाले मॉड्यूल की तुलना करना) आम तौर पर कम निर्णायक होते हैं, जिनमें से कई में कोई महत्वपूर्ण सहसंबंध नहीं पाया जाता है, जबकि अन्य में सहसंबंध पाया जाता है। क्षेत्र का अध्ययन करने वाले कुछ शोधकर्ता कोई सहसंबंध नहीं पाते हुए अध्ययन में उपयोग की जाने वाली मेथड्सयों की वैधता पर सवाल उठाते हैं।<ref name="kan">
प्रोग्राम के आकार को नियंत्रित करने वाले अध्ययन (अर्थात, अलग-अलग कम्पलेक्सिटीओं वाले लेकिन समान आकार वाले मॉड्यूल की तुलना करना) आम तौर पर कम निर्णायक होते हैं, जिनमें से कई में कोई महत्वपूर्ण सहसंबंध नहीं पाया जाता है, जबकि अन्य में सहसंबंध पाया जाता है। क्षेत्र का अध्ययन करने वाले कुछ शोधकर्ता कोई सहसंबंध नहीं पाते हुए अध्ययन में उपयोग की जाने वाली मेथड्सयों की वैधता पर सवाल उठाते हैं।<ref name="kan">
{{cite book |title=Metrics and Models in Software Quality Engineering |author=Kan |pages=316–317 |publisher=Addison-Wesley |year=2003 |isbn=978-0-201-72915-3}}</ref> हालाँकि यह संबंध संभवतः सत्य है, लेकिन इसे आसानी से उपयोग में नहीं लाया जा सकता।<ref name=cherf>{{cite journal|
{{cite book |title=Metrics and Models in Software Quality Engineering |author=Kan |pages=316–317 |publisher=Addison-Wesley |year=2003 |isbn=978-0-201-72915-3}}</ref> चूँकि यह संबंध संभवतः सत्य है, लेकिन इसे सरलता से उपयोग में नहीं लाया जा सकता।<ref name=cherf>{{cite journal|
journal=Journal of Software Quality|
journal=Journal of Software Quality|
author=G.S. Cherf|
author=G.S. Cherf|
Line 135: Line 139:
year=1992|volume=1|issue=3|pages=147–158|
year=1992|volume=1|issue=3|pages=147–158|
issn=1573-1367|doi=10.1007/bf01720922|
issn=1573-1367|doi=10.1007/bf01720922|
s2cid=37274091}}</ref> चूँकि प्रोग्राम का आकार व्यावसायिक सॉफ़्टवेयर की कंट्रोलीय विशेषता नहीं है, इसलिए मैककेब्स के नंबर की उपयोगिता पर प्रश्न उठाया गया है।<ref name="fenton" />इस अवलोकन का सार यह है कि बड़े प्रोग्राम अधिक जटिल होते हैं और उनमें अधिक दोष होते हैं। कोड की साईक्लोमैटिक कम्पलेक्सिटी को कम करने से सहसंबंध उस कोड में त्रुटियों या बग की संख्या को कम करने का कारण नहीं बनता है। हालाँकि, [[ISO 26262]] जैसे अंतर्राष्ट्रीय सुरक्षा मानक, कम कोड कम्पलेक्सिटी को लागू करने वाले कोडिंग दिशानिर्देशों को अनिवार्य करते हैं।<ref name="ISO26262Part3">{{cite book | title =ISO 26262-3:2011(en) Road vehicles — Functional safety — Part 3: Concept phase| publisher =International Standardization Organization | url =https://www.iso.org/obp/ui/#iso:std:iso:26262:-3:ed-1:v1:en}}</ref>
s2cid=37274091}}</ref> चूँकि प्रोग्राम का आकार व्यावसायिक सॉफ़्टवेयर की कंट्रोलीय विशेषता नहीं है, इसलिए मैककेब्स के नंबर की उपयोगिता पर प्रश्न उठाया गया है।<ref name="fenton" /> इस अवलोकन का सार यह है कि बड़े प्रोग्राम अधिक जटिल होते हैं और उनमें अधिक दोष होते हैं। कोड की साईक्लोमैटिक कम्पलेक्सिटी को कम करने से सहसंबंध उस कोड में त्रुटियों या बग की संख्या को कम करने का कारण नहीं बनता है। चूँकि, [[ISO 26262]] जैसे अंतर्राष्ट्रीय सुरक्षा मानक, कम कोड कम्पलेक्सिटी को लागू करने वाले कोडिंग दिशानिर्देशों को अनिवार्य करते हैं।<ref name="ISO26262Part3">{{cite book | title =ISO 26262-3:2011(en) Road vehicles — Functional safety — Part 3: Concept phase| publisher =International Standardization Organization | url =https://www.iso.org/obp/ui/#iso:std:iso:26262:-3:ed-1:v1:en}}</ref>
==कृत्रिम बुद्धि==
==आर्टिफिसियल इंटेलिजेंस==
कृत्रिम बुद्धिमत्ता प्रोग्रामों की सिमेंटिक कम्पलेक्सिटी के मूल्यांकन के लिए साइक्लोमैटिक कम्पलेक्सिटी का भी उपयोग किया जा सकता है।<ref>{{cite journal |doi=10.1016/j.compag.2011.11.009 |title=भूमध्यसागरीय परिदृश्य परिवर्तनों की जटिलता के मॉडलिंग में कृत्रिम बुद्धिमत्ता|journal=Computers and Electronics in Agriculture |volume=81 |pages=87–96 |year=2012 |last1=Papadimitriou |first1=Fivos }}</ref>
आर्टिफिसियल इंटेलिजेंसमत्ता प्रोग्रामों की सिमेंटिक कम्पलेक्सिटी के मूल्यांकन के लिए साइक्लोमैटिक कम्पलेक्सिटी का भी उपयोग किया जा सकता है।<ref>{{cite journal |doi=10.1016/j.compag.2011.11.009 |title=भूमध्यसागरीय परिदृश्य परिवर्तनों की जटिलता के मॉडलिंग में कृत्रिम बुद्धिमत्ता|journal=Computers and Electronics in Agriculture |volume=81 |pages=87–96 |year=2012 |last1=Papadimitriou |first1=Fivos }}</ref>
==अल्ट्रामेट्रिक टोपोलॉजी==
==अल्ट्रामेट्रिक टोपोलॉजी==
साइक्लोमैटिक कम्पलेक्सिटी भौगोलिक और परिदृश्य-पारिस्थितिक विश्लेषण में उपयोगी साबित हुई है, यह दिखाए जाने के बाद कि इसे [[अल्ट्रामेट्रिक स्पेस]] दूरी के ग्राफ़ पर लागू किया जा सकता है।<ref>{{cite journal |doi=10.1080/1747423X.2011.637136 |title=अल्ट्रामेट्रिक टोपोलॉजी के साथ भूमि उपयोग और परिदृश्य जटिलता का गणितीय मॉडलिंग|journal=Journal of Land Use Science |volume=8 |issue=2 |pages=234–254 |year=2013 |last1=Papadimitriou |first1=Fivos |s2cid=121927387 |doi-access=free }}</ref>
साइक्लोमैटिक कम्पलेक्सिटी जिओग्राफिकल और लैंडस्केप-इकोलॉजिकल एनालिसिस में उपयोगी सिद्ध हुई है, यह दिखाए जाने के पश्चात कि इसे [[अल्ट्रामेट्रिक स्पेस]] दूरी के ग्राफ़ पर लागू किया जा सकता है।<ref>{{cite journal |doi=10.1080/1747423X.2011.637136 |title=अल्ट्रामेट्रिक टोपोलॉजी के साथ भूमि उपयोग और परिदृश्य जटिलता का गणितीय मॉडलिंग|journal=Journal of Land Use Science |volume=8 |issue=2 |pages=234–254 |year=2013 |last1=Papadimitriou |first1=Fivos |s2cid=121927387 |doi-access=free }}</ref>
==यह भी देखें==
==यह भी देखें==
* प्रोग्रामिंग कम्पलेक्सिटी
* प्रोग्रामिंग कम्पलेक्सिटी
Line 148: Line 152:
* [[निर्णय-से-निर्णय पथ|डिसीज़न-से-डिसीज़न पाथ]]
* [[निर्णय-से-निर्णय पथ|डिसीज़न-से-डिसीज़न पाथ]]
* डिज़ाइन विधेय
* डिज़ाइन विधेय
* आवश्यक कम्पलेक्सिटी (संरचितता का संख्यात्मक माप)
* एसेंशियल कम्पलेक्सिटी (स्ट्रक्चर्डता का संख्यात्मक माप)
* हालस्टेड कम्पलेक्सिटी उपाय
* हालस्टेड कम्पलेक्सिटी उपाय
* [[सॉफ्टवेयर इंजीनियरिंग]]
* [[सॉफ्टवेयर इंजीनियरिंग]]
* सॉफ़्टवेयर टैस्टिंग
* सॉफ़्टवेयर टैस्टिंग
* [[स्थैतिक कार्यक्रम विश्लेषण|स्थैतिक प्रोग्राम विश्लेषण]]
* [[स्थैतिक कार्यक्रम विश्लेषण|स्थैतिक प्रोग्राम एनालिसिस]]
* [[रख-रखाव]]
* [[रख-रखाव]]



Revision as of 11:28, 8 August 2023

साइक्लोमैटिक कम्पलेक्सिटी एक सॉफ्टवेयर मीट्रिक है जिसका उपयोग प्रोग्रामिंग कम्पलेक्सिटी को इंगित करने के लिए किया जाता है। यह प्रोग्राम के स्रोत कोड के माध्यम से रैखिक रूप से इंडिपेंडेंट पाथ्स की संख्या का एक मात्रात्मक माप है। इसे 1976 में थॉमस जे. मैककेबे, सीनियर द्वारा विकसित किया गया था।

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

एक सॉफ़्टवेयर टैस्टिंग रणनीति, जिसे मैककेबे ने बेसिस पाथ टैस्टिंग कहा है, जिन्होंने सबसे पहले इसे प्रस्तावित किया था, प्रोग्राम के माध्यम से प्रत्येक रैखिक रूप से इंडिपेंडेंट पाथ की टैस्टिंग करना है; इस स्थिति में, टैस्टिंग स्थितियों की संख्या प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी के समतुल्य होती है।[1]

विवरण

परिभाषा

एक साधारण प्रोग्राम का कंट्रोल-फ्लो ग्राफ़। प्रोग्राम लाल नोड पर निष्पादित होना शुरू होता है, फिर एक लूप में एंट्री करता है (लाल नोड के सही नीचे तीन नोड्स का समूह)। लूप से बाहर निकलने पर, एक कंडीशनल विवरण (लूप के नीचे समूह) होता है, और अंत में प्रोग्राम नीले नोड पर बाहर निकलता है। इस ग्राफ़ में 9 एज, 8 नोड्स और 1 जुड़ा हुआ घटक (ग्राफ़ सिद्धांत) है, इसलिए प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी है 9 − 8 + 2×1 = 3.

स्रोत कोड के एक अनुभाग की साईक्लोमैटिक कम्पलेक्सिटी इसके समाविष्ट रैखिक रूप से इंडिपेंडेंट पाथ (ग्राफ सिद्धांत) की संख्या है - पाथ्स का एक सेट रैखिक रूप से निर्भर होता है यदि एक या अधिक पाथ्स का एक उपसमूह होता है जहां उनके एज सेट का सममित अंतर रिक्त होता है। उदाहरण के लिए, यदि स्रोत कोड में कोई कंट्रोल फ्लो (कंडीशनल या डिसीज़न पॉइंट) नहीं है, तो कम्पलेक्सिटी 1 होगी, क्योंकि कोड के माध्यम से केवल एक ही पाथ होता है। यदि कोड में एक एकल-स्थिति IF कथन है, तो कोड के माध्यम से दो पाथ होंगे: एक जहां IF कथन TRUE का मूल्यांकन करता है और दूसरा जहां यह FALSE का मूल्यांकन करता है, इसलिए कम्पलेक्सिटी 2 होगी, दो नेस्टेड एकल-स्थिति IF, या दो शर्तों वाला एक IF, 3 की कम्पलेक्सिटी उत्पन्न करता है।

गणितीय रूप से, स्ट्रक्चर्ड प्रोग्रामिंग की साईक्लोमैटिक कम्पलेक्सिटी[lower-alpha 1] के प्रोग्राम को कंट्रोल-फ्लो ग्राफ के संदर्भ में परिभाषित किया गया है, एक डायरेक्टेड ग्राफ जिसमें प्रोग्राम के बेसिक ब्लॉक होते हैं, दो बेसिक ब्लॉकों के बीच एक एज के साथ यदि कंट्रोल पहले से दूसरे तक जा सकता है। कम्पलेक्सिटी M को इसलिए परिभाषित किया गया है:[2]

जहाँ

  • E = ग्राफ़ के एजेस की संख्या
  • N = ग्राफ़ के नोड्स की संख्या
  • P = कनेक्टेड कम्पोनेंट्स की संख्या (ग्राफ़ सिद्धांत)
ऊपर जैसा ही कार्य, वैकल्पिक फॉर्मूलेशन का उपयोग करके दर्शाया गया है, जहां प्रत्येक एग्जिट पॉइंट दोबारा एंट्री पॉइंट से जुड़ा हुआ है। इस ग्राफ़ में 10 एज, 8 नोड्स और 1 जुड़ा हुआ घटक (ग्राफ़ सिद्धांत) है, जिसके परिणामस्वरूप वैकल्पिक फॉर्मूलेशन का उपयोग करके 3 की साइक्लोमैटिक कम्पलेक्सिटी भी उत्पन्न होती है (10 − 8 + 1 = 3).

एक वैकल्पिक सूत्रीकरण एक ग्राफ़ का उपयोग करना है जिसमें प्रत्येक एग्जिट पॉइंट दोबारा एंट्री पॉइंट से जुड़ा होता है। इस स्थिति में, ग्राफस्ट्रॉन्ग्ली कनेक्टेड होता है, और प्रोग्राम की साइक्लोमैटिक कम्पलेक्सिटी इसके ग्राफ की साईक्लोमैटिक संख्या के समतुल्य है (जिसे ग्राफ सिद्धांत में पहली बेट्टी संख्या), जिसे इस प्रकार परिभाषित किया गया है[2]

इसे ग्राफ़ में उपस्थित रैखिक रूप से इंडिपेंडेंट साइकल्स की संख्या की कंप्यूटेड रूप में देखा जा सकता है, अर्थात वे साइकल्स जिनके समाविष्ट अन्य साइकल्स सम्मिलित नहीं हैं। ध्यान दें कि क्योंकि प्रत्येक एग्जिट पॉइंट एंट्री पॉइंट पर दोबारा लूप करता है, प्रत्येक एग्जिट पॉइंट के लिए कम से कम एक ऐसी साईकल जरूर होती है।

एकल प्रोग्राम (या सबरूटीन या मेथड्स) के लिए, P हमेशा 1 के समतुल्य होता है। इसलिए एकल सबरूटीन के लिए एक सरल सूत्र है[3]

चूँकि, साइक्लोमैटिक कम्पलेक्सिटी को एक ही समय में ऐसे कई प्रोग्रामों या सबप्रोग्रामों पर लागू किया जा सकता है (उदाहरण के लिए, एक क्लासेस के सभी विधियों पर), और इन स्थितियों में P विचाराधीन प्रोग्रामों की संख्या के समतुल्य होगा, क्योंकि प्रत्येक सबप्रोग्राम ग्राफ़ के डिस्कनेक्ट किए गए सबसेट के रूप में दिखाई देता है।

मैककेबे ने दिखाया कि केवल एक एंट्री पॉइंट और एक एग्जिट पॉइंट के साथ किसी भी स्ट्रक्चर्ड प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी उस प्रोग्राम में निहित डिसीज़न पॉइंटओं (अर्थात, यदि कथन या कंडीशनल लूप) की संख्या प्लस एक के समतुल्य है। चूँकि, यह केवल निम्नतम, मशीन-स्तर के निर्देशों पर गिने जाने वाले डिसीज़न पॉइंटओं के लिए ट्रू है।[4] यौगिक विधेय से जुड़े डिसीज़न जैसे उच्च-स्तरीय लैंगुएजेस में पाए जाते हैं IF cond1 AND cond2 THEN ... सम्मिलित विधेय चर के संदर्भ में गिना जाना चाहिए, अर्थात इस उदाहरण में किसी को दो डिसीज़न पॉइंट गिनने चाहिए, क्योंकि IF cond1 THEN IF cond2 THEN ... मशीन स्तर पर यह समतुल्य है।[2][5]

साइक्लोमैटिक कम्पलेक्सिटी को कई एग्जिट पॉइंटओं वाले प्रोग्राम तक बढ़ाया जा सकता है; इस स्थिति में यह समतुल्य है

जहाँ प्रोग्राम में डिसीज़न पॉइंटओं की संख्या है, और s एग्जिट पॉइंटओं की संख्या है।[5][6]

बीजगणितीय टोपोलॉजी के संदर्भ में स्पष्टीकरण

ग्राफ़ का एक सम उपसमूह (जिसे यूलेरियन पाथ के रूप में भी जाना जाता है) वह है जहां प्रत्येक शीर्ष (ग्राफ़ सिद्धांत) एजेस की सम संख्या के साथ घटना है; ऐसे उपसमूह साइकल्स और पृथक शीर्षों के संघ हैं। निम्नलिखित में, सम सबग्राफ को उनके एज सेट के साथ पहचाना जाएगा, जो केवल उन सम सबग्राफ पर विचार करने के समतुल्य है जिसमें पूर्ण ग्राफ के सभी शीर्ष सम्मिलित हैं।

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

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

अधिक टोपोलॉजिकली इंक्लाइनड के लिए, साइक्लोमैटिक कम्पलेक्सिटी को वैकल्पिक रूप से एक सापेक्ष बेट्टी संख्या, एक सापेक्ष होमोलॉजी समूह के आकार के रूप में परिभाषित किया जा सकता है:

जिसे टर्मिनल नोड्स टी के सापेक्ष ग्राफ़ जी के पहले होमोलॉजी समूह की रैंक के रूप में पढ़ा जाता है। यह एक एंट्री से एग्जिट तक फ्लो ग्राफ के माध्यम से रैखिक रूप से इंडिपेंडेंट पाथ्स की संख्या कहने का एक तकनीकी विधि है, जहां:

  • रैखिक रूप से इंडिपेंडेंट समरूपता से मेल खाता है, और इसका अर्थ है कि कोई बैकट्रैकिंग को दोगुना नहीं करता है;
  • पाथ प्रथम समरूपता से मेल खाते हैं: पाथ एक 1-आयामी वस्तु है;
  • सापेक्ष का अर्थ है कि पाथ किसी एंट्री या एग्जिट पॉइंट पर स्टार्ट और फ़िनिश होनी चाहिए।

यह साईक्लोमैटिक कम्पलेक्सिटी की सहज धारणा से मेल खाता है, और ऊपर बताए अनुसार कंप्यूटेड की जा सकती है।

वैकल्पिक रूप से, कोई किसी दिए गए घटक पर सभी टर्मिनल नोड्स की पहचान करके (एक साथ चिपकाकर) पूर्ण बेट्टी संख्या (पूर्ण समरूपता - सापेक्ष नहीं) के माध्यम से इसकी कंप्यूटेड कर सकता है (या समकक्ष, एंट्री द्वार से एग्जिट को जोड़ने वाले पाथ बनाएं), जिस स्थिति में (नए, संवर्धित ग्राफ को कॉल करना) , जो है ), एक प्राप्त होता है

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

यह लूप की संख्या और घटकों की संख्या के रूप में साइक्लोमैटिक कम्पलेक्सिटी के लक्षण वर्णन से मेल खाता है।

व्याख्या

अपनी प्रस्तुति में 'जोखिम की पहचान करने के लिए सॉफ्टवेयर गुणवत्ता मेट्रिक्स'[8] होमलैंड सिक्योरिटी विभाग के लिए, टॉम मैककेबे ने साईक्लोमैटिक कम्पलेक्सिटी की व्याख्या करने के लिए निम्नलिखित क्लासेसीकरण प्रस्तुत किया है:

  • 1-10 सरल प्रक्रिया, थोड़ा जोखिम
  • 11-20 अधिक जटिल, मध्यम जोखिम
  • 21 - 50 जटिल, उच्च जोखिम
  • > 50 अप्राप्य कोड, बहुत अधिक जोखिम

अनुप्रयोग

विकास के समय कम्पलेक्सिटी को सीमित करना

मैककेबे के मूल अनुप्रयोगों में से एक प्रोग्राम विकास के समय दिनचर्या की कम्पलेक्सिटी को सीमित करना था; उन्होंने सुझाव दिया कि प्रोग्रामर्स को अपने द्वारा विकसित किए जा रहे मॉड्यूल की कम्पलेक्सिटी की कंप्यूटेड करनी चाहिए, और जब भी मॉड्यूल की साइक्लोमैटिक कम्पलेक्सिटी 10 से अधिक हो तो उन्हें छोटे मॉड्यूल में विभाजित करना चाहिए,[2] इस अभ्यास को एनआईएसटी स्ट्रक्चर्ड टैस्टिंग पद्धति द्वारा अपनाया गया था, इस अवलोकन के साथ कि मैककेबे के मूल प्रकाशन के पश्चात से, 10 के आंकड़े को पर्याप्त पुष्ट साक्ष्य प्राप्त हुए थे, लेकिन कुछ परिस्थितियों में प्रतिबंध में छोड़ देना और 15 तक की कम्पलेक्सिटी वाले मॉड्यूल को अनुमति देना उचित हो सकता है। चूंकि पद्धति ने स्वीकार किया कि सहमति-सीमा से परे जाने के लिए कभी-कभी कारण थे, इसने अपनी सिफारिश को प्रत्येक मॉड्यूल के लिए, या तो साइक्लोमैटिक कम्पलेक्सिटी को [सहमत-सीमा] तक सीमित कर दिया या एक प्रदान किया गया है। सीमा क्यों पार की गई इसका लिखित स्पष्टीकरण भी सम्मिलित होता है।[9]

किसी प्रोग्राम की संरचना को मापना

मैककेबे के 1976 के पेपर का खंड VI यह निर्धारित करने से संबंधित है कि नॉन-स्ट्रक्चर्ड प्रोग्रामिंग के कंट्रोल-फ्लो ग्राफ़ (सीएफजी) उनके सबग्राफ के संदर्भ में कैसा दिखते हैं, जिसे मैककेबे पहचानते हैं। (उस भाग के विवरण के लिए स्ट्रक्चर्ड प्रोग्राम प्रमेय देखें।) मैककेबे ने उस खंड को एक संख्यात्मक माप का प्रस्ताव देकर समाप्त किया है कि कोई दिया गया प्रोग्राम स्ट्रक्चर्ड प्रोग्रामिंग आदर्श के कितना निकट है, अर्थात मैककेबे के नवशास्त्रवाद का उपयोग करके इसकी स्ट्रक्चर्डता मैककेबे ने इस उद्देश्य के लिए जो माप तैयार किया, उसे एसेंशियल कम्पलेक्सिटी (स्ट्रक्चर्डता का संख्यात्मक माप) कहा जाता है।[2]

इस माप की कंप्यूटेड करने के लिए, मूल सीएफजी को एकल-प्रविष्टि और एकल-एग्जिट पॉइंट वाले सबग्राफ की पहचान करके पुनरावृत्त रूप से कम किया जाता है, जिन्हें फिर एक नोड द्वारा प्रतिस्थापित किया जाता है। यह कटौती इस बात से मेल खाती है कि यदि कोई इंसान कोड के बड़े हिस्से से एक सबरूटीन निकालता है तो वह क्या करेगा, (आजकल ऐसी प्रक्रिया पुनर्रचना के छत्र शब्द के अंतर्गत आती है।) मैककेबे की कटौती मेथड्स को पश्चात में कुछ पाठ्यपुस्तकों में संक्षेपण कहा गया, क्योंकि इसे संक्षेपण (ग्राफ सिद्धांत) के सामान्यीकरण के रूप में देखा गया था।[10] यदि कोई प्रोग्राम स्ट्रक्चर्ड है, तो मैककेबे की कमी/संक्षेपण प्रक्रिया इसे एकल सीएफजी नोड में कम कर देती है। इसके विपरीत, यदि प्रोग्राम स्ट्रक्चर्ड नहीं है, तो पुनरावृत्त प्रक्रिया अपरिवर्तनीय भाग की पहचान करेगी। मैककेबे द्वारा परिभाषित एसेंशियल कम्पलेक्सिटी माप केवल इस अपरिवर्तनीय ग्राफ की साईक्लोमैटिक कम्पलेक्सिटी है, इसलिए यह सभी स्ट्रक्चर्ड प्रोग्रामों के लिए सटीक रूप से 1 होगा, लेकिन नॉन-स्ट्रक्चर्ड प्रोग्रामों के लिए एक से अधिक होता है।[9]: 80 

सॉफ़्टवेयर टैस्टिंग के लिए निहितार्थ

साइक्लोमैटिक कम्पलेक्सिटी का एक अन्य अनुप्रयोग उन टैस्टिंग स्थितियों की संख्या निर्धारित करना है जो किसी विशेष मॉड्यूल के संपूर्ण टैस्टिंग कवरेज को प्राप्त करने के लिए एसेंशियल हैं।

यह साईक्लोमैटिक कम्पलेक्सिटी के दो गुणों के कारण उपयोगी है, M, एक विशिष्ट मॉड्यूल के लिए:

  • M पूर्ण ब्रांच कवरेज प्राप्त करने के लिए एसेंशियल टैस्टिंग स्थितियों की संख्या के लिए ऊपरी सीमा है।
  • M कंट्रोल-फ्लो ग्राफ़ (सीएफजी) के माध्यम से पाथ्स की संख्या के लिए निचली सीमा है। यह मानते हुए कि प्रत्येक टैस्टिंग विधि एक पाथ लेती है, पाथ कवरेज प्राप्त करने के लिए एसेंशियल स्थितियों की संख्या उन पाथ्स की संख्या के समतुल्य होती है जिन्हें वास्तव में लिया जा सकता है। लेकिन कुछ पाथ असंभव हो सकते हैं, इसलिए हालांकि सीएफजी के माध्यम से पाथ्स की संख्या स्पष्ट रूप से पाथ कवरेज के लिए एसेंशियल टैस्टिंग स्थितियों की संख्या पर ऊपरी सीमा है, यह पश्चात वाली संख्या (संभावित पाथ्स की) कभी-कभी कम होती है M.

उपरोक्त तीनों संख्याएँ समान हो सकती हैं: ब्रांच कवरेज साइक्लोमेटिक कम्पलेक्सिटी पाथ्स की संख्या

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

if (c1())
    f1();
else
    f2();

if (c2())
    f3();
else
    f4();
उपरोक्त स्रोत कोड का कंट्रोल-फ्लो ग्राफ़; लाल वृत्त फ़ंक्शन का एंट्री पॉइंट है, और नीला वृत्त एग्जिट पॉइंट है। ग्राफ़ को मजबूती से कनेक्ट करने के लिए एग्जिट को एंट्री से जोड़ा गया है।

इस उदाहरण में, पूर्ण ब्रांच कवरेज प्राप्त करने के लिए दो टैस्टिंग स्थिति पर्याप्त हैं, जबकि पूर्ण पाथ कवरेज के लिए चार एसेंशियल हैं। प्रोग्राम की साईक्लोमैटिक कम्पलेक्सिटी 3 है (क्योंकि प्रोग्राम के लिए दृढ़ता से जुड़े ग्राफ में 9 एज, 7 नोड्स और 1 जुड़ा घटक (9 − 7 + 1) सम्मिलित है)।

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

दुर्भाग्य से, किसी प्रोग्राम के माध्यम से सभी संभावित पाथ्स का टैस्टिंग करना हमेशा व्यावहारिक नहीं होता है। ऊपर दिए गए उदाहरण को ध्यान में रखते हुए, हर बार एक अतिरिक्त यदि-तब-अन्यथा कथन जोड़ा जाता है, तो संभावित पाथ्स की संख्या 2 गुना बढ़ जाती है। जैसे-जैसे प्रोग्राम इस तरह बढ़ता है, यह जल्दी से उस पॉइंट पर पहुंच जाता है जहां सभी पाथ्स का टैस्टिंग करना अव्यावहारिक हो जाता है।

एक सामान्य टैस्टिंग रणनीति, उदाहरण के लिए एनआईएसटी स्ट्रक्चर्ड टैस्टिंग पद्धति द्वारा समर्थित, मॉड्यूल की पर्याप्त कवरेज प्राप्त करने के लिए एसेंशियल व्हाइट-बॉक्स टैस्टिंग की संख्या निर्धारित करने के लिए मॉड्यूल की साइक्लोमैटिक कम्पलेक्सिटी का उपयोग करना है। लगभग सभी स्थितियों में, ऐसी पद्धति के अनुसार, एक मॉड्यूल में कम से कम उतने ही टैस्टिंग होने चाहिए जितने उसकी साईक्लोमैटिक कम्पलेक्सिटी के हों; अधिकांश स्थितियों में, टैस्टिंगों की यह संख्या फ़ंक्शन के सभी प्रासंगिक पाथ्स का अभ्यास करने के लिए पर्याप्त है।[9]

एक फ़ंक्शन के उदाहरण के रूप में जिसे सटीक रूप से टैस्टिंग करने के लिए केवल ब्रांच कवरेज से अधिक की एसेंशियलता होती है, उपरोक्त फ़ंक्शन पर फिर से विचार करें, लेकिन मान लें कि बग होने से बचने के लिए, कोई भी कोड जो कॉल करता है f1() या f3() दूसरे को भी बुलाना चाहिए.[lower-alpha 2] यह मानते हुए कि के परिणाम c1() और c2() इंडिपेंडेंट हैं, इसका अर्थ है कि ऊपर प्रस्तुत फ़ंक्शन में एक बग है। ब्रांच कवरेज हमें केवल दो टैस्टिंगों के साथ मेथड्स का टैस्टिंग करने की अनुमति देगा, और टैस्टिंगों का एक संभावित सेट निम्नलिखित स्थितियों का टैस्टिंग करना होगा:

  • c1() रिटर्न ट्रू है और c2() रिटर्न ट्रू है
  • c1() रिटर्न फॉल्स है और c2() रिटर्न फॉल्स है

इनमें से कोई भी विधि बग को उजागर नहीं करता है। चूँकि, यदि हम एसेंशियल टैस्टिंगों की संख्या को इंगित करने के लिए साइक्लोमैटिक कम्पलेक्सिटी का उपयोग करते हैं, तो संख्या बढ़कर 3 हो जाती है। इसलिए हमें निम्नलिखित पाथ्स में से एक का टैस्टिंग करना चाहिए:

  • c1() रिटर्न ट्रू है और c2() रिटर्न फॉल्स है
  • c1() रिटर्न फॉल्स देता है और c2() रिटर्न ट्रू है

इनमें से कोई भी टैस्टिंग बग को उजागर करता है।

दोषों की संख्या से सहसंबंध

कई अध्ययनों ने किसी फ़ंक्शन या मेथड्स में होने वाले दोषों की आवृत्ति के साथ मैककेबे की साइक्लोमैटिक कम्पलेक्सिटी संख्या के बीच संबंध की जांच की है।[11] कुछ अध्ययन[12] साईक्लोमैटिक कम्पलेक्सिटी और दोषों के बीच एक सकारात्मक सहसंबंध खोजें: जिन कार्यों और मेथड्सयों में सबसे अधिक कम्पलेक्सिटी होती है उनमें सबसे अधिक दोष भी होते हैं। चूँकि, साइक्लोमैटिक कम्पलेक्सिटी और प्रोग्राम आकार (आमतौर पर कोड की पंक्तियों में मापा जाता है) के बीच संबंध को कई बार प्रदर्शित किया गया है। द हैटन्स ने दावा किया है[13] उस कम्पलेक्सिटी में कोड की पंक्तियों के समान ही पूर्वानुमान लगाने की क्षमता होती है। प्रोग्राम के आकार को नियंत्रित करने वाले अध्ययन (अर्थात, अलग-अलग कम्पलेक्सिटीओं वाले लेकिन समान आकार वाले मॉड्यूल की तुलना करना) आम तौर पर कम निर्णायक होते हैं, जिनमें से कई में कोई महत्वपूर्ण सहसंबंध नहीं पाया जाता है, जबकि अन्य में सहसंबंध पाया जाता है। क्षेत्र का अध्ययन करने वाले कुछ शोधकर्ता कोई सहसंबंध नहीं पाते हुए अध्ययन में उपयोग की जाने वाली मेथड्सयों की वैधता पर सवाल उठाते हैं।[14] चूँकि यह संबंध संभवतः सत्य है, लेकिन इसे सरलता से उपयोग में नहीं लाया जा सकता।[15] चूँकि प्रोग्राम का आकार व्यावसायिक सॉफ़्टवेयर की कंट्रोलीय विशेषता नहीं है, इसलिए मैककेब्स के नंबर की उपयोगिता पर प्रश्न उठाया गया है।[11] इस अवलोकन का सार यह है कि बड़े प्रोग्राम अधिक जटिल होते हैं और उनमें अधिक दोष होते हैं। कोड की साईक्लोमैटिक कम्पलेक्सिटी को कम करने से सहसंबंध उस कोड में त्रुटियों या बग की संख्या को कम करने का कारण नहीं बनता है। चूँकि, ISO 26262 जैसे अंतर्राष्ट्रीय सुरक्षा मानक, कम कोड कम्पलेक्सिटी को लागू करने वाले कोडिंग दिशानिर्देशों को अनिवार्य करते हैं।[16]

आर्टिफिसियल इंटेलिजेंस

आर्टिफिसियल इंटेलिजेंसमत्ता प्रोग्रामों की सिमेंटिक कम्पलेक्सिटी के मूल्यांकन के लिए साइक्लोमैटिक कम्पलेक्सिटी का भी उपयोग किया जा सकता है।[17]

अल्ट्रामेट्रिक टोपोलॉजी

साइक्लोमैटिक कम्पलेक्सिटी जिओग्राफिकल और लैंडस्केप-इकोलॉजिकल एनालिसिस में उपयोगी सिद्ध हुई है, यह दिखाए जाने के पश्चात कि इसे अल्ट्रामेट्रिक स्पेस दूरी के ग्राफ़ पर लागू किया जा सकता है।[18]

यह भी देखें

टिप्पणियाँ

  1. Here "structured" means in particular "with a single exit (return statement) per function".
  2. This is a fairly common type of condition; consider the possibility that f1 allocates some resource which f3 releases.


संदर्भ

  1. A J Sobey. "Basis Path Testing".
  2. 2.0 2.1 2.2 2.3 2.4 McCabe (December 1976). "एक जटिलता उपाय". IEEE Transactions on Software Engineering. SE-2 (4): 308–320. doi:10.1109/tse.1976.233837. S2CID 9116234.
  3. Philip A. Laplante (25 April 2007). सॉफ्टवेयर इंजीनियरिंग के बारे में प्रत्येक इंजीनियर को क्या पता होना चाहिए. CRC Press. p. 176. ISBN 978-1-4200-0674-2.
  4. Fricker, Sébastien (April 2018). "What exactly is cyclomatic complexity?". froglogic GmbH. Retrieved October 27, 2018. To compute a graph representation of code, we can simply disassemble its assembly code and create a graph following the rules: ...
  5. 5.0 5.1 J. Belzer; A. Kent; A. G. Holzman; J. G. Williams (1992). Encyclopedia of Computer Science and Technology. CRC Press. pp. 367–368.
  6. Harrison (October 1984). "मैकाबे की जटिलता माप को बहु-निकास कार्यक्रमों पर लागू करना". Software: Practice and Experience. 14 (10): 1004–1007. doi:10.1002/spe.4380141009. S2CID 62422337.
  7. Diestel, Reinhard (2000). Graph theory. Graduate texts in mathematics 173 (2 ed.). New York: Springer. ISBN 978-0-387-98976-1.
  8. Thomas McCabe Jr. (2008). "जोखिम की पहचान करने के लिए सॉफ़्टवेयर गुणवत्ता मेट्रिक्स". Archived from the original on 2022-03-29.
  9. 9.0 9.1 9.2 Arthur H. Watson; Thomas J. McCabe (1996). "Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric" (PDF). NIST Special Publication 500-235.
  10. Paul C. Jorgensen (2002). Software Testing: A Craftsman's Approach, Second Edition (2nd ed.). CRC Press. pp. 150–153. ISBN 978-0-8493-0809-3.
  11. 11.0 11.1 Norman E Fenton; Martin Neil (1999). "A Critique of Software Defect Prediction Models" (PDF). IEEE Transactions on Software Engineering. 25 (3): 675–689. CiteSeerX 10.1.1.548.2998. doi:10.1109/32.815326.
  12. Schroeder, Mark (1999). "ऑब्जेक्ट-ओरिएंटेड मेट्रिक्स के लिए एक व्यावहारिक मार्गदर्शिका". IT Professional. 1 (6): 30–36. doi:10.1109/6294.806902. S2CID 14945518.
  13. Les Hatton (2008). "The role of empiricism in improving the reliability of future software". version 1.1.
  14. Kan (2003). Metrics and Models in Software Quality Engineering. Addison-Wesley. pp. 316–317. ISBN 978-0-201-72915-3.
  15. G.S. Cherf (1992). "An Investigation of the Maintenance and Support Characteristics of Commercial Software". Journal of Software Quality. 1 (3): 147–158. doi:10.1007/bf01720922. ISSN 1573-1367. S2CID 37274091.
  16. ISO 26262-3:2011(en) Road vehicles — Functional safety — Part 3: Concept phase. International Standardization Organization.
  17. Papadimitriou, Fivos (2012). "भूमध्यसागरीय परिदृश्य परिवर्तनों की जटिलता के मॉडलिंग में कृत्रिम बुद्धिमत्ता". Computers and Electronics in Agriculture. 81: 87–96. doi:10.1016/j.compag.2011.11.009.
  18. Papadimitriou, Fivos (2013). "अल्ट्रामेट्रिक टोपोलॉजी के साथ भूमि उपयोग और परिदृश्य जटिलता का गणितीय मॉडलिंग". Journal of Land Use Science. 8 (2): 234–254. doi:10.1080/1747423X.2011.637136. S2CID 121927387.


बाहरी संबंध