एक कॉल ग्राफ़ ड्रा करें


12

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

मुझे चिंता इस बात की है कि प्रत्येक फ़ंक्शन अपने कार्य को पूरा करने और कॉलर को मान वापस करने के लिए अपने शरीर के भीतर कई बाहरी कार्यों को कॉल करता है।

मैं इसे कैसे आकर्षित कर सकता हूं? मतलब इस तरह के व्यवहार / कोड को दस्तावेज करने के लिए किस तरह का चार्ट / ग्राफिक उपयुक्त होगा?

इसलिए, मुझे नहीं लगता कि यह यूएमएल आरेख बनाने के लिए उपयोगी होगा, न ही फ्लोचार्ट। एक कॉल ग्राफ, शायद?


doxygen - कॉल / कॉलर ग्राफ़ उत्पन्न करेगा, मुझे यकीन नहीं है कि अजगर के लिए इसका कितना समर्थन है। मुझे पता है कि आप इसके लिए अजगर कोड दस्तावेज़ कर सकते हैं।
gbjbaanb

मैंने pycallgraph की कोशिश की है, लेकिन इसका उपयोग करने के लिए यह बहुत जटिल / बहुत गहरा है। यह मेरे कोड की जटिलता के कारण है क्योंकि इसमें django और API url के लिए बाहरी कॉल के साथ सादे अजगर को मिलाया गया है। यही कारण है कि मैं इसे केवल उस प्रासंगिक हिस्से को ध्यान में रखकर खींचना चाहता था जिसकी मुझे आवश्यकता है। समस्या यह है कि मुझे नहीं पता है कि सिस्टम की पूरी समझ रखने के लिए किस तरह के ग्राफ का उपयोग करना है
लियोनार्डो

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

जवाबों:


9

मुझे लगता है कि आप यहां जो देख रहे हैं वह एक अनुक्रम आरेख है । ये आपको उस क्रम की कल्पना करने की अनुमति देते हैं जिसमें विभिन्न मॉड्यूल तीरों के उपयोग के माध्यम से प्रत्येक को कॉल करते हैं।

एक निर्माण आसान है:

  1. इसके नीचे एक बिंदीदार रेखा के साथ अपना शुरुआती वर्ग बनाएं।
  2. कॉल ट्रेस में अगली कक्षा / विधि को नीचे की बिंदीदार रेखा के साथ ड्रा करें
  3. आपके द्वारा खींचे गए अंतिम तीर के नीचे लंबवत रूप से एक तीर के साथ लाइनें कनेक्ट करें
  4. अपने ट्रेस में सभी कॉल के लिए चरण 2-3 को दोहराएं

उदाहरण

मान लेते हैं कि हमारे पास निम्नलिखित कोड हैं जिनके लिए हम एक अनुक्रम आरेख बनाना चाहते हैं:

def long_division(quotient, divisor):
    solution = ""
    remainder = quotient
    working = ""
    while len(remainder) > 0:
        working += remainder[0]
        remainder = remainder[1:]
        multiplier = find_largest_fit(working, divisor)
        solution += multiplier
        working = calculate_remainder(working, multiplier, divisor)
    print solution


def calculate_remainder(working, multiplier, divisor):
    cur_len = len(working)
    int_rem = int(working) - (int(multiplier) * int (divisor))
    return "%*d" % (cur_len, int_rem)


def find_largest_fit(quotient, divisor):
    if int(divisor) == 0:
        return "0"
    i = 0
    while i <= 10:
        if (int(divisor) * i) > int(quotient):
            return str(i - 1)
        else:
            i += 1


if __name__ == "__main__":
    long_division("645", "5")

पहली चीज जो हम आकर्षित करेंगे mainवह है विधि से जुड़ने वाला प्रवेश बिंदु ( ) long_division। ध्यान दें कि यह long_division में एक बॉक्स बनाता है, जो विधि कॉल के दायरे को दर्शाता है। इस सरल उदाहरण के लिए, बॉक्स इस तथ्य के कारण हमारे अनुक्रम आरेख की पूरी ऊंचाई होगी कि यह केवल एक चीज है।

यहाँ छवि विवरण दर्ज करें

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

यहाँ छवि विवरण दर्ज करें

बड़ी संख्या के लिए कुछ बार दोहराएं और आपके चार्ट को कुछ इस तरह दिखना चाहिए:

यहाँ छवि विवरण दर्ज करें

टिप्पणियाँ

आप चुन सकते हैं कि क्या आप कॉल किए गए चर नामों के साथ कॉल लेबल करना चाहते हैं, या उनके मान यदि आप केवल एक विशिष्ट मामले को दस्तावेज करना चाहते हैं। आप स्वयं को कॉल करने वाले फ़ंक्शन के साथ भी पुनरावृत्ति दिखा सकते हैं।

इसके अतिरिक्त, आप उपयोगकर्ताओं को यहां दिखा सकते हैं और उन्हें संकेत दे सकते हैं और सिस्टम में उनके इनपुट को आसानी से दिखा सकते हैं। यह एक काफी लचीला प्रणाली है जो मुझे लगता है कि आप उपयोगी पाएंगे!


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

1
मैं कहूंगा कि आपके पास कितने मॉड्यूल हैं, इससे कोई फर्क नहीं पड़ता - उदाहरण के ऊपर था या तो बिल्कुल भी नहीं। बस उन्हें नाम दें ताकि आप उन्हें बाद में पा सकें, ModuleA / function1, ModuleB / Function2 आदि। 20 कार्यों के लिए इसका बड़ा होना, लेकिन निश्चित रूप से समझना असंभव नहीं है। आपको लगता है कि आप अपने अंतिम उपयोग के बाद एक फ़ंक्शन के लिए लाइन को समाप्त कर सकते हैं और अपने डायग्राम में क्षैतिज स्थान को बचाने के लिए इसके नीचे एक और फ़ंक्शन लाइन डाल सकते हैं।
Ampt

7

मुझे लगता है कि एक कॉल ग्राफ सबसे उपयुक्त दृश्य होगा। यदि आप इसे हाथ से नहीं करने का निर्णय लेते हैं, तो एक अच्छा सा उपकरण है जिसे कहा जाता है pyanकि अजगर फाइल पर स्थैतिक विश्लेषण करता है और ग्राफविज़ डॉट फ़ाइल के माध्यम से एक विज़ुअलाइज़्ड कॉल ग्राफ़ उत्पन्न कर सकता है (जिसे एक छवि को प्रदान किया जा सकता है)। कुछ दोहे हैं, लेकिन सबसे पूर्ण रूप से चित्रित https://github.com/davidfraser/pyan प्रतीत होता है ।

कमांड चलाते समय आपको केवल उन सभी फाइलों को निर्दिष्ट करना होगा जो आप संसाधित करना चाहते हैं:

python ~/bin/pyan.py --dot a.py b.py c.py -n > pyan.dot; dot -Tpng -opyan.png pyan.dot

या

python ~/bin/pyan.py --dot $(find . -name '*.py') -n > pyan.dot; dot -Tpng -opyan.png pyan.dot

आप 'एन-एन' के साथ ग्राफ क्लीनर बना सकते हैं जो उन लाइनों को हटाता है जहां एक फ़ंक्शन परिभाषित किया गया था।

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