วาดกราฟการโทร


12

ฉันยังคงรักษาฐานรหัสเก่าที่เขียนด้วยไพ ธ อน โดยเฉพาะอย่างยิ่งมีชิ้นส่วนที่ซับซ้อนของรหัสที่มาจากโมดูลเรียกฟังก์ชั่นอื่น ๆ จากโมดูลอื่นที่เรียกใช้ฟังก์ชั่นอื่น ๆ และอื่น ๆ ไม่ใช่ OOP เพียงฟังก์ชั่นและโมดูล
ฉันพยายามติดตามว่าการไหลเริ่มต้นและสิ้นสุดเมื่อใดฉันเรียกฟังก์ชันหลัก แต่ฉันรู้สึกว่าต้องวาดสิ่งนี้เพราะฉันหลงทางในการโทรย่อย

สิ่งที่ฉันกังวลก็คือแต่ละฟังก์ชั่นเรียกฟังก์ชั่นภายนอกหลายอย่างภายในร่างกายของพวกเขาเพื่อทำงานให้เสร็จและส่งคืนค่าให้กับผู้โทร

ฉันจะวาดสิ่งนี้ได้อย่างไร ความหมายของแผนภูมิ / กราฟิกประเภทใดที่เหมาะกับการบันทึกพฤติกรรม / รหัสประเภทนี้

ดังนั้นฉันไม่คิดว่าจะมีประโยชน์ในการวาดแผนภาพ UML ไม่ใช่ผังงาน กราฟการโทรอาจจะใช่ไหม


doxygen - จะสร้างกราฟผู้โทร / ผู้โทรฉันไม่แน่ใจว่ารองรับไพ ธ อนจำนวนเท่าใด ฉันรู้ว่าคุณสามารถจัดทำเอกสารรหัสหลามได้
gbjbaanb

ฉันลอง pycallgraph แต่มันซับซ้อนเกินไป / ลึกเกินกว่าที่จะใช้ นี่เป็นเพราะความซับซ้อนของรหัสของฉันเพราะมันผสมหลามธรรมดากับ django และการเรียก URL ภายนอก API นั่นคือเหตุผลที่ฉันต้องการวาดด้วยมือโดยคำนึงถึงส่วนที่เกี่ยวข้องที่ฉันต้องการเท่านั้น ปัญหาคือฉันไม่รู้ว่ากราฟชนิดใดที่จะใช้เพื่อทำความเข้าใจกับระบบอย่างสมบูรณ์
Leonardo

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การเชื่อมต่อกับวิธีการ โปรดทราบว่าสิ่งนี้จะสร้างกล่องเป็น long_division ซึ่งบ่งบอกขอบเขตของการเรียกใช้เมธอด สำหรับตัวอย่างง่ายๆนี้กล่องจะเป็นความสูงทั้งหมดของแผนภาพลำดับของเราเนื่องจากความจริงที่ว่านี่เป็นสิ่งเดียวที่ทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้เราโทรfind_largest_fitหาคนที่มีขนาดใหญ่ที่สุดซึ่งเหมาะสมกับหมายเลขการทำงานของเราแล้วส่งคืนให้เรา เราวาดเส้นจากlong_divisionถึงfind_largest_fitด้วยกล่องอื่นเพื่อแสดงขอบเขตสำหรับการเรียกใช้ฟังก์ชัน สังเกตว่ากล่องจะสิ้นสุดลงอย่างไรเมื่อส่งคืนตัวคูณ นี่คือจุดสิ้นสุดของขอบเขตฟังก์ชั่น!

ป้อนคำอธิบายรูปภาพที่นี่

ทำซ้ำสองสามครั้งเพื่อให้ได้ตัวเลขที่มากขึ้นและแผนภูมิของคุณควรมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ

คุณสามารถเลือกว่าคุณต้องการติดป้ายกำกับการโทรด้วยชื่อตัวแปรที่ส่งผ่านหรือค่าของพวกเขาหากคุณต้องการจัดทำเอกสารเฉพาะกรณีใดกรณีหนึ่งเท่านั้น คุณยังสามารถแสดงการเรียกซ้ำด้วยฟังก์ชันที่เรียกตัวเอง

นอกจากนี้คุณสามารถแสดงผู้ใช้ที่นี่และแจ้งให้พวกเขาและแสดงข้อมูลของพวกเขาเข้าสู่ระบบได้อย่างง่ายดายเพียงพอ มันเป็นระบบที่ค่อนข้างยืดหยุ่นซึ่งฉันคิดว่าคุณจะพบว่าค่อนข้างมีประโยชน์!


ขอบคุณฉันรู้แผนภาพลำดับ แต่ฉันรู้สึกว่ามันเหมาะสำหรับ oop ในกรณีของฉันสิ่งต่าง ๆ ยุ่งเหยิงกว่าเล็กน้อยซึ่งหมายความว่าตัวอย่างเช่นฉันมีฟังก์ชั่น / ผู้ช่วยเหลือประมาณ 20 รายการแผ่กระจายไปทั่วหลายโมดูล ฉันจะระบุโมดูลที่ฟังก์ชั่นนั้นเป็นของอะไร เมื่อพิจารณาว่าฟังก์ชั่นบางอย่างนั้นถูกเปลี่ยนชื่อในระหว่างการนำเข้า ..
Leonardo

1
ฉันจะบอกว่ามันไม่สำคัญว่าคุณมีโมดูลมากเท่าไหร่ - ตัวอย่างด้านบนนั้นไม่ได้มีอยู่ในระบบเลย เพียงตั้งชื่อพวกมันเพื่อที่คุณจะได้เจอพวกมันในภายหลัง ModuleA / function1, ModuleB / Function2 เป็นต้นสำหรับ 20 ฟังก์ชั่นมันจะใหญ่ขึ้น แต่ก็ไม่สามารถเข้าใจได้อย่างแน่นอน อีกคนคิดว่าคุณทำได้คือจบบรรทัดสำหรับฟังก์ชั่นหลังจากการใช้งานครั้งสุดท้ายและวางสายฟังก์ชั่นอื่นไว้ด้านล่างเพื่อประหยัดพื้นที่แนวนอนในไดอะแกรมของคุณ
59

7

ฉันคิดว่ากราฟโทรจะเป็นการสร้างภาพที่เหมาะสมที่สุด หากคุณตัดสินใจที่จะไม่ทำมันด้วยมือมีเครื่องมือเล็ก ๆ ที่เรียกpyanว่าทำการวิเคราะห์แบบคงที่ในไฟล์ไพ ธ อนและสามารถสร้างกราฟการโทรแบบเห็นภาพโดยใช้ไฟล์ graphviz dot (ซึ่งสามารถแสดงเป็นรูปภาพ) มีการคู่ของงา แต่คนส่วนใหญ่อย่างที่โดดเด่นน่าจะเป็น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.