Cycle Finder เครื่องมือ

การใช้งาน

ต่อไปนี้เป็นตัวอย่างง่ายๆ ที่มีการหมุนเวียนระหว่าง 2 คลาส Foo และ Bar

cat Foo.java
package mypkg;
public class Foo {
  Bar myBar;
}

cat Bar.java
package mypkg;
public class Bar {
  Foo myFoo;
}

cycle_finder Foo.java Bar.java
acceptAST: mypkg/Bar.java
acceptAST: mypkg/Foo.java

***** Found reference cycle *****
Bar -> (field myFoo with type Foo)
Foo -> (field myBar with type Bar)
----- Full Types -----
Lmypkg/Bar;
Lmypkg/Foo;

1 CYCLES FOUND.

ก่อนอื่นคุณจะเห็น acceptAST สำหรับไฟล์ JavaScript แต่ละไฟล์ที่กำลังแยกวิเคราะห์อยู่ก่อน นี่เป็นเพียงการบันทึกข้อมูลเท่านั้น

สำหรับแต่ละรอบจะมีการพิมพ์ 2 รายการ รายการแรกจะมีคำอธิบายเกี่ยวกับรอบนี้ แต่ละเส้นจะแสดงขอบในกราฟอ้างอิง คำอธิบาย Edge จะแสดงประเภทต้นทางตามด้วยคำอธิบายว่าประเภทต้นทางอาจอ้างอิงถึงประเภทเป้าหมายอย่างไร

รายการที่ 2 ในส่วน Full Types จะแสดงคีย์ประเภทที่ไม่ซ้ำกันสำหรับประเภทแต่ละประเภทในรอบ วิธีนี้มีประโยชน์เนื่องจากมีแพ็กเกจแต่ละประเภทที่สมบูรณ์

ไม่แสดงรายการ

บางรอบที่ตรวจพบไม่จำเป็นต้องมีการดำเนินการแก้ไข ซึ่งอาจเป็นเพราะวงจรมีออบเจ็กต์ที่มีอายุยาวนานที่ไม่จำเป็นต้องจัดการตำแหน่ง หรือเครื่องมืออาจตรวจจับวัฏจักรทางทฤษฎีตามประเภทของฟิลด์บางประเภทที่สามารถพิสูจน์ได้ว่าวัตถุที่เกี่ยวข้องจะไม่ก่อให้เกิดวัฏจักร สำหรับกรณีเหล่านี้ เราสามารถใช้ไฟล์รายการระงับเพื่อไม่ให้รายงานรอบเหล่านี้

เครื่องมือจะยอมรับไฟล์รายการที่ระงับโดยใช้ตัวเลือก --suppress-list ไฟล์รายการที่ระงับคือไฟล์ข้อความธรรมดาที่มีรายการบรรทัดเดียว รายการที่ไม่อนุญาตอาจใช้รูปแบบใดรูปแบบหนึ่งจาก 4 รูปแบบที่แสดงในตัวอย่างด้านล่าง ขอแนะนำเมื่อเพิ่มรายการระงับรายการให้เจาะจงที่สุดเพื่อหลีกเลี่ยงการระงับรอบที่ถูกต้อง เพิ่มความคิดเห็นได้โดยใช้อักขระ "#"

# Specifies that "fieldA" in ClassA will not refer to any object that is a subtype of ClassB.
FIELD my.pkg.ClassA.fieldA my.pkg.ClassB

# Suppresses all cycles containing "fieldA" in ClassA.
FIELD my.pkg.ClassA.fieldA

# Suppresses all cycles containing any field of ClassA.
TYPE my.pkg.ClassA

# Suppress all cycles containing the Inner's outer reference to ClassA.
OUTER my.pkg.ClassA.Inner

# Suppress all cycles containing the outer reference from an anonymous class declared in myMethod.
OUTER my.pkg.ClassA.myMethod.$

# Suppresses all cycles containing any type in package "my.pkg".
NAMESPACE my.pkg