چرخه یاب ابزار

استفاده

در اینجا یک مثال ساده با چرخه بین دو کلاس 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 برای هر فایل جاوا در حال تجزیه مشاهده خواهید کرد. این فقط ثبت اطلاعات آموزنده است.

برای هر چرخه، دو لیست چاپ خواهد شد. فهرست اول شامل شرحی از چرخه است. هر خط یک یال را در نمودار مرجع فهرست می کند. توضیحات لبه نوع مبدا را نشان می دهد و به دنبال آن توضیحی در مورد اینکه چگونه نوع مبدا ممکن است به نوع هدف اشاره داشته باشد.

لیست دوم، در زیر Full Types ، کلیدهای نوع منحصر به فرد را برای هر نوع در چرخه نشان می دهد. این مفید است زیرا بسته کامل هر نوع را ارائه می دهد.

فهرست ها را سرکوب کنید

برخی از چرخه های شناسایی شده نیازی به اقدام اصلاحی ندارند. این ممکن است به این دلیل باشد که چرخه شامل اشیاء با عمر طولانی است که نیازی به جابجایی ندارند. یا این ابزار ممکن است یک چرخه نظری را بر اساس انواع زمینه های خاص شناسایی کند که در آن قابل اثبات است که اشیاء درگیر هرگز یک چرخه را تشکیل نمی دهند. برای این موارد می‌توانیم از فایل‌های suppress-list استفاده کنیم تا این چرخه‌ها را گزارش نکنیم.

این ابزار با استفاده از گزینه --suppress-list فایل های 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