একটি কল গ্রাফ আঁকুন


12

আমি পাইথনে লেখা একটি পুরাতন কোড বেস রক্ষণ করছি। বিশেষত কোডের একটি জটিল টুকরা রয়েছে যা মডিউল থেকে অন্যান্য মডিউলগুলি থেকে অন্য ফাংশনগুলিকে কল করে যা অন্যান্য ফাংশনগুলিকে কল করে and এটি ওওপি নয়, কেবল ফাংশন এবং মডিউল।
আমি মূল ফাংশনটি কল করার পরে যেখানে প্রবাহ শুরু হয় এবং শেষ হয় সেদিকে নজর রাখার চেষ্টা করেছি তবে আমি অনুভব করি যে এটি আঁকতে হবে কারণ আমি সাব-কলগুলিতে হারিয়ে যাচ্ছি।

আমার উদ্বেগটি হ'ল প্রতিটি ফাংশনটি তাদের কাজটি সম্পন্ন করতে এবং কলারের কাছে মূল্য ফেরত দেওয়ার জন্য তাদের দেহের মধ্যে একাধিক বহিরাগত ফাংশন কল করে।

আমি কীভাবে এটি আঁকতে পারি? মানে এই জাতীয় আচরণ / কোড নথিভুক্ত করার জন্য কোন ধরণের চার্ট / গ্রাফিক উপযুক্ত হবে?

সুতরাং, আমি মনে করি না যে কোনও ইউএমএল চিত্র আঁকার জন্য কার্যকর হবে, না কোনও ফ্লোচার্ট। একটি কল গ্রাফ, সম্ভবত?


ডক্সিজেন - কল / কলার গ্রাফ তৈরি করবে, অজগরের জন্য এটির কতটা সমর্থন রয়েছে তা আমি নিশ্চিত নই। আমি জানি আপনি এটির জন্য পাইথন কোডটি নথিভুক্ত করতে পারেন।
gbjbaanb

আমি পাইক্যালগ্রাফ চেষ্টা করেছি তবে এটি ব্যবহার করা খুব জটিল / খুব গভীর। এটি আমার কোডের জটিলতার কারণেই এটি জ্যাঙ্গো এবং API url এ বাহ্যিক কলের সাথে প্লেইন পাইথন মিশ্রিত করে। এ কারণেই আমি কেবল আমার প্রয়োজনীয় প্রাসঙ্গিক বিষয়টি আমলে নিয়ে হাতে আঁকতে চেয়েছিলাম। সমস্যাটি হ'ল সিস্টেমটির সম্পূর্ণ বোঝার জন্য কোন ধরণের গ্রাফটি ব্যবহার করতে হবে তা আমি জানি না
লিওনার্দো

5
এটি যদি আপনাকে কেবল এটি বুঝতে সহায়তা করে তবে প্রাকৃতিকভাবে যা আসে তা আঁকুন। যদি এটি আনুষ্ঠানিক ডকুমেন্টেশনে চলে যায় তবে আপনি সর্বদা এটি পরিষ্কার করতে পারেন।
jonrsharpe

উত্তর:


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। নোট করুন যে এটি দীর্ঘ সময়ের মধ্যে একটি বাক্স তৈরি করে, পদ্ধতি কলটির সুযোগকে বোঝায়। এই সাধারণ উদাহরণের জন্য, বাক্সটি আমাদের সিকোয়েন্স ডায়াগ্রামের পুরো উচ্চতা হয়ে থাকবে কারণ এই একমাত্র জিনিস চালানো হয়।

এখানে চিত্র বর্ণনা লিখুন

এখন আমরা আমাদের কর্মসংখ্যার find_largest_fitসাথে মানানসই বৃহত্তম একাধিকটি খুঁজে পেতে কল করি এবং এটি আমাদের কাছে ফিরিয়ে দেয়। আমরা থেকে একটি রেখা আঁকা long_divisionথেকে find_largest_fitফাংশন কল জন্য সুযোগ বোঝান আরেকটি বক্স সঙ্গে। গুণকটি ফিরলে বাক্সটি কীভাবে শেষ হয় তা দ্রষ্টব্য; এই যে ফাংশন সুযোগ শেষ!

এখানে চিত্র বর্ণনা লিখুন

বৃহত্তর সংখ্যার জন্য কয়েকবার পুনরাবৃত্তি করুন এবং আপনার চার্টটি এর মতো দেখতে হবে:

এখানে চিত্র বর্ণনা লিখুন

মন্তব্য

আপনি কেবলমাত্র একটি নির্দিষ্ট কেস ডকুমেন্ট করতে চাইলে আপনি ভেরিয়েবলের নামগুলি দিয়ে কলগুলি লেবেল করতে চান বা তাদের মানগুলি নির্বাচন করতে পারেন। আপনি নিজেই একটি ফাংশন কল করার মাধ্যমে পুনরাবৃত্তিও দেখাতে পারেন।

অতিরিক্তভাবে, আপনি এখানে ব্যবহারকারীদের দেখিয়ে তাদের প্রম্পট করতে এবং সিস্টেমে সহজেই তাদের ইনপুটটি দেখাতে পারেন। এটি একটি মোটামুটি নমনীয় সিস্টেম যা আমি মনে করি আপনি বরং দরকারী হিসাবে খুঁজে পাবে!


ধন্যবাদ, আমি সিকোয়েন্স ডায়াগ্রামটি জানি তবে এটি আমার কাছে মনে হয় এটি ওওপের জন্য আরও উপযুক্ত। আমার ক্ষেত্রে জিনিসগুলি কিছুটা বেশি অগোছালো, উদাহরণস্বরূপ আমার কাছে প্রায় 20 টি ফাংশন / সহায়তাকারী একাধিক মডিউল জুড়ে ছড়িয়ে আছে। হো আমি কি ফাংশনটির সাথে সম্পর্কিত মডিউলটি নির্দিষ্ট করব? আমদানির সময় কিছু ফাংশনটিরও নাম পরিবর্তন করা হয়েছে বিবেচনা করে ..
লিওনার্দো

1
আমি বলব যে এটি আপনার কাছে কতগুলি মডিউল রয়েছে তা বিবেচনা করে না - উদাহরণস্বরূপ উপরোক্ত উদাহরণগুলি উভয়ই হয় না। কেবল তাদের নাম দিন যাতে আপনি তাদের পরে খুঁজে পেতে পারেন মডিউলএ / ফাংশন 1, মডিউলবি / ফাংশন 2 ইত্যাদি 20 টি ফাংশনের জন্য এটি বড় হতে চলেছে, তবে এটি অবশ্যই বুঝতে অসম্ভব। অন্য যেটি আপনি করতে পারেন তা হ'ল কোনও ফাংশনের শেষ ব্যবহারের পরে লাইনটি শেষ করে আপনার ডায়াগ্রামের অনুভূমিক স্থান বাঁচাতে এর নীচে অন্য ফাংশন লাইন রেখে দিন।
14

7

আমি মনে করি একটি কল গ্রাফ সবচেয়ে উপযুক্ত দৃশ্যায়ন হবে ization আপনি যদি হাত দিয়ে না করার সিদ্ধান্ত নেন তবে একটি দুর্দান্ত ছোট্ট টুল রয়েছে যা 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

আপনি '-n' দিয়ে গ্রাফ ক্লিনার করতে পারেন যা কোনও ফাংশন সংজ্ঞায়িত হয়েছিল এমন লাইনগুলি সরিয়ে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.