Cycle Finder الأداة
الاستخدام
في ما يلي مثال بسيط لدورة بين فئتين، 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 يتم تحليله. هذا مجرد تسجيل مفيد.
ستتم طباعة قائمتين لكل دورة. تحتوي القائمة الأولى على وصف للدورة. يسرد كل خط حافة في الرسم البياني المرجعي. سيعرض وصف الحافة نوع المصدر متبوعًا بوصف للكيفية التي قد يشير بها نوع المصدر إلى نوع الهدف.
تعرض القائمة الثانية، ضمن Full Types
، أنواع المفاتيح الفريدة لكل نوع في الدورة. وهذا مفيد لأنه يوفر الحزمة الكاملة من كل نوع.
منع القوائم
ولن تتطلب بعض الدورات المرصودة اتخاذ أي إجراء تصحيحي. قد يرجع ذلك إلى أنّ الدورة تحتوي على عناصر طويلة الأجل لا تحتاج إلى تجزئة. أو قد تكتشف الأداة دورة نظرية بناءً على أنواع حقول معينة حيث يمكن إثبات أن الكائنات المعنية لن تشكل دورة أبدًا. وبالنسبة إلى هذه الحالات، يمكننا استخدام ملفات suppress-list وعدم الإبلاغ عن هذه الدورات.
تقبل الأداة ملفات قوائم الإيقاف باستخدام الخيار --suppress-list
. ملفات قائمة المنع هي ملفات نص عادي تحتوي على إدخالات من سطر واحد. قد يتخذ إدخال قائمة قمع أحد الأشكال الأربعة الموضحة في المثال أدناه. ويُنصح عند إضافة إدخالات قائمة الإيقاف أن تكون محددة قدر الإمكان لتجنب إيقاف أي دورة مشروعة. يمكن إضافة التعليقات باستخدام "#". الحرف.
# 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