2009-05-26 30 views
64

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

NDepend Website पर, मैं एक व्याख्या यह है कि मूल रूप से कहते हैं देखा "एक विधि में निर्णय की संख्या। प्रत्येक अगर, के लिए, & & आदि सीसी करने के लिए +1 कहते हैं," स्कोर ")। है कि वास्तव में यह? यदि हां, यह बुरा क्यों है? मैं देख सकता हूं कि कोड को समझने में आसान रखने के लिए कोई भी कथन की संख्या को कम रखना चाह सकता है, लेकिन क्या यह वास्तव में सबकुछ है?

या क्या कुछ गहरी अवधारणा है इसके लिए?

उत्तर

48

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

उच्च चक्रवात जटिलता वाले तरीके यूनिट परीक्षणों में पूर्ण कोड कवरेज प्राप्त करना अधिक कठिन होता है। (धन्यवाद Mark W!)

यह निश्चित रूप से रखरखाव के सभी अन्य पहलुओं को लाता है। त्रुटियों/प्रतिगमन/बहुत आगे की संभावना। हालांकि, मुख्य अवधारणा बहुत सीधी-आगे है।

+8

भी कहा जाता है, तो यह यूनिट परीक्षण और पूर्ण कोड कवरेज प्राप्त करना कठिन होता है। –

+1

सही 'कारण वे कहते हैं कि आप किसी भी क्षण में केवल अपने विवेक दिमाग में कुछ चीजें रख सकते हैं। – steamer25

+4

किसी विधि की चक्रीय जटिलता उस विधि के लिए 100% कोड कवरेज प्राप्त करने के लिए आवश्यक यूनिट परीक्षण मामलों की संख्या को भी दर्शाती है। –

6

हाँ, यह वास्तव में है। आपके कोड को जितना अधिक निष्पादन पथ ले सकता है, उतनी अधिक चीजें जिन्हें परीक्षण किया जाना चाहिए, और त्रुटि की उच्च संभावना।

2

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

30

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

+0

बहुत सटीक उत्तर। कुडोस! – RBT

1

नियमित रूप से प्रत्येक निर्णय बिंदु (लूप, स्विच, अगर, आदि ...) अनिवार्य रूप से एक कथन के बराबर उबाल जाता है। प्रत्येक if के लिए आपके पास 2 कोडपैथ हैं जिन्हें लिया जा सकता है। तो पहली शाखा के साथ 2 कोड पथ हैं, दूसरे के साथ 4 संभावित पथ हैं, तीसरे के साथ 8 और इसी तरह हैं। कम से कम 2 ** एन कोड पथ हैं जहां एन शाखाओं की संख्या है।

यह कोड के व्यवहार को समझना और इसे जांचने में मुश्किल हो जाता है जब एन कुछ छोटी संख्या से आगे बढ़ता है।

1

अपने फ़ंक्शन के control flow graph पर विचार करें, बाहर निकलने के लिए प्रवेश द्वार से अतिरिक्त किनारे चलते हैं। चक्रीय जटिलता अधिकतम कटौती है जिसे हम ग्राफ को दो टुकड़ों में अलग किए बिना कर सकते हैं।

उदाहरण के लिए:

function F: 
    if condition1: 
     ... 
    else: 
     ... 
    if condition2: 
     ... 
    else: 
     ... 

Control Flow Graph

Control Flow Graph

आप शायद सहज क्यों जुड़ा हुआ ग्राफ 3.

+0

क्या आप समझा सकते हैं कि आप उपरोक्त आरेख में कटौती कैसे कर रहे हैं? –

1

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

11

विकिपीडिया इस पर अपने दोस्त हो सकता है: मूल रूप से Definition of cyclomatic complexity

, आप एक ग्राफ के रूप में अपने कार्यक्रम की कल्पना करने के लिए है और फिर

जटिलता (...) है के रूप में परिभाषित:

M = E − N + 2P 

जहां

+०१२३५१६४१०६
  • एम = cyclomatic जटिलता,
  • ई = ग्राफ
  • एन के किनारों की संख्या = ग्राफ
  • पी के नोड्स की संख्या = जुड़ा घटकों की संख्या

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

2

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

मैंने हाल ही में अपनी जावा परियोजनाओं पर Eclipse Metrics Plugin के साथ प्रयोग किया है, और इसमें वास्तव में अच्छी और संक्षिप्त सहायता फ़ाइल है जो निश्चित रूप से आपकी नियमित ग्रहण सहायता के साथ एकीकृत होगी और आप विभिन्न जटिलताओं के उपायों और युक्तियों की कुछ और परिभाषाएं पढ़ सकते हैं और आपके कोड में सुधार करने के लिए चालें।

3

एक और दिलचस्प बात मैंने सुना है:

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

1

ऐसा ही है। हालांकि, "केस" या "स्विच" कथन की प्रत्येक शाखा 1 के रूप में गिनती है। असल में, इसका मतलब है कि सीसी केस स्टेटमेंट से नफरत करता है, और कोई भी कोड जिसके लिए उन्हें आवश्यकता होती है (कमांड प्रोसेसर, राज्य मशीन इत्यादि)।

+0

एक केस स्टेटमेंट एक ऑब्जेक्ट ग्राफ़ का संकेत हो सकता है जो मुफ्त में सेट होने के लिए चिल्ला रहा है .... –

+0

@TetsujinnoOni - * मई * हां। समस्या यह है कि मेरा ठेठ कमांड प्रोसेसर कुछ बाहरी स्रोतों से कमांड पढ़ रहा है, इसलिए मैं संकलक को डेटा आइटम को तब तक नहीं डाल सकता जहां कहीं भी यह एक गतिशील बहुलक वर्ग के लिए आवश्यक हो। –

1

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

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

9
Cyclocmatic complexity = Number of decision points + 1 

निर्णय अंक अपने सशर्त बयान हो सकता है की तरह है, अगर ... वरना, स्विच, पाश के लिए है, जबकि पाश आदि

निम्नलिखित चार्ट आवेदन के प्रकार का वर्णन।

  • cyclomatic जटिलता निहित है 1 - 10  सामान्य विचार किए जाने के applicatinon

  • cyclomatic जटिलता झूठ 11 - 20  मध्यम आवेदन

  • cyclomatic जटिलता झूठ 21 - 50  जोखिम भरा आवेदन

  • चक्रवात जटिलता 50 से अधिक है  अस्थिर अनुप्रयोग

+3

* "साइक्लोक्मैटिक जटिलता = निर्णय बिंदुओं की संख्या + 1" * सभी मामलों के लिए मैंने कोशिश की है, ऐसा लगता है कि यह सच है। मेरे पास सिर्फ एक प्रश्न है: हम प्रवाह ग्राफ और सूत्रों से परेशान क्यों होते हैं, जब 'निर्णय_पॉइंट्स + 1' की हमें आवश्यकता होती है? (किसी भी दर पर, इस बेहद आसान विधि के लिए धन्यवाद!) – Luc

2

नियंत्रण प्रवाह ग्राफ का उपयोग करके चक्रवात जटिलता की गणना की जाती है। किसी प्रोग्राम के स्रोत कोड के माध्यम से रैखिक रूप से स्वतंत्र पथों के मात्रात्मक माप की संख्या को साइक्लोमैटिक कॉम्प्लेक्सिटी (यदि/अगर/अन्य/के लिए)

संबंधित मुद्दे