يقوم CK بحساب مقاييس الكود على مستوى الفئة ومستوى الطريقة في مشاريع JAVA عن طريق التحليل الثابت (أي لا حاجة إلى رمز مُجمع). حاليًا ، يحتوي على مجموعة كبيرة من المقاييس ، بما في ذلك CK الشهيرة:
CBO (اقتران بين الكائنات) : يحسب عدد التبعيات التي يمتلكها الفصل. تتحقق الأدوات عن أي نوع يستخدم في الفئة بأكملها (إعلان الحقل ، وأنواع إرجاع الطريقة ، وإعلانات متغيرة ، إلخ). يتجاهل التبعيات لجافا نفسها (على سبيل المثال java.lang.string).
تعديل CBO (اقتران بين الكائنات) : يحسب عدد التبعيات التي يمتلكها الفصل. إنه يشبه إلى حد كبير CBO الأصلي لـ CKTOOL. ومع ذلك ، فإن هذا المقياس يعتبر الاعتماد من فئة على حد سواء على حد سواء المراجع التي يجعلها النوع للآخرين والمراجع التي يتلقاها من أنواع أخرى.
المعجبين في : يحسب عدد تبعيات الإدخال التي يمتلكها الفصل ، أي عدد الفئات التي تشير إلى فئة معينة. على سبيل المثال ، بالنظر إلى الفئة X ، فإن مروحة X سيكون عدد الفئات التي تستدعي X من خلال الرجوع إليها كسممة ، والوصول إلى بعض سماتها ، وتسود بعض أساليبها ، وما إلى ذلك ، إلخ.
المعجبين : يحسب عدد تبعيات الإخراج التي يمتلكها الفصل ، أي عدد الفئات الأخرى المشار إليها من قبل فئة معينة. بمعنى آخر ، بالنظر إلى الفئة X ، فإن مروحة X هي عدد الفئات التي تسمى X عبر السمات المرجعية ، ودعوات الطريقة ، ومثيلات الكائن ، إلخ.
DIT (شجرة الميراث العمق) : إنها تحسب عدد "الآباء" الذي يمتلكه الفصل. جميع الفصول لديها DIT على الأقل 1 (يرث الجميع java.lang.object). من أجل تحقيق ذلك ، يجب أن تكون الفصول الدراسية موجودة في المشروع (أي إذا كان الفصل يعتمد على X الذي يعتمد في ملف الجرة/التبعية ، ويعتمد x على فئات أخرى ، يتم حساب DIT على أنها 2).
NOC (عدد الأطفال) : يحسب عدد الفئات الفرعية الفورية التي لدى فئة معينة.
عدد الحقول : يحسب عدد الحقول. أرقام محددة لإجمالي عدد الحقول ، الثابتة ، العامة ، الخاصة ، المحمية ، الافتراضية ، النهائية ، والمزامنة.
عدد الطرق : يحسب عدد الأساليب. أرقام محددة لإجمالي عدد الأساليب ، والطرق الثابتة ، والجملية ، والخاصة ، والمحمية ، والافتراضي ، والنهائي ، والمزامنة. أساليب المنشئ أيضا حساب هنا.
عدد الطرق المرئية : يحسب عدد الأساليب المرئية. طريقة مرئية إذا لم تكن خاصة.
NOSI (عدد الدعوات الثابتة) : يحسب عدد الدعوات إلى الأساليب الثابتة. يمكن أن يحسب فقط تلك التي يمكن حلها بواسطة JDT.
RFC (استجابة للفئة) : يحسب عدد دعوات الطريقة الفريدة في الفصل. نظرًا لأن الدعوات يتم حلها عن طريق التحليل الثابت ، فإن هذا التنفيذ يفشل عندما يكون للأسلوب أحمالًا زائدة مع نفس العدد من المعلمات ، ولكن أنواعًا مختلفة.
WMC (فئة طريقة الوزن) أو تعقيد مكابي . إنه يحسب عدد تعليمات الفرع في الفصل.
LOC (خطوط الكود) : يحسب خطوط العد ، وتجاهل الخطوط والتعليقات الفارغة (أي ، سطر مصدر الكود ، أو SLOC). قد يكون عدد الخطوط هنا مختلفة بعض الشيء عن الملف الأصلي ، حيث نستخدم التمثيل الداخلي لـ JDT للرمز المصدري لحسابه.
LCOM (عدم تماسك الأساليب) : يحسب قياس LCOM. هذا هو الإصدار الأول من المتري ، وهو غير موثوق به. يمكن أن تكون Lcom-HS أفضل (نأمل أن ترسل لنا طلب سحب).
lcom* (عدم تماسك الأساليب) : هذا المقياس هو نسخة معدلة من الإصدار الحالي من LCom المنفذ في أداة CK. Lcom* هو مقياس طبيعي يحسب عدم تماسك الفئة في نطاق من 0 إلى 1. ثم ، كلما اقتربت من 1 قيمة Lcom* في الفصل ، كلما قل درجة التماسك من هذه الفئة المعنية. كلما اقتربت من 0 قيمة lcom* في فئة ، معظم تماسك هذه الفئة المعنية. يتبع هذا التنفيذ الإصدار الثالث من Lcom* محدد في [1].
TCC (تماسك فئة ضيقة) : يقيس تماسك فئة مع نطاق قيمة من 0 إلى 1. يقيس TCC تماسك الفئة عبر الاتصالات المباشرة بين الطرق المرئية أو طريقتين أو أشجار الاحتجاج الخاصة بهم الوصول إلى متغير الفئة نفسه.
LCC (تماسك فئة فضفاضة) : على غرار TCC ولكنه يتضمن أيضًا عدد الاتصالات غير المباشرة بين الفئات المرئية لحساب التماسك. وبالتالي ، فإن القيد LCC> = TCC يحمل دائما.
كمية العائدات : عدد تعليمات return .
كمية الحلقات : عدد الحلقات (أي ، لأنها ، أثناء ذلك ، تم تعزيزها).
كمية المقارنات : عدد المقارنات (أي ، == و! =). ملاحظة:! = متوفر فقط في 0.4.2+.
كمية المحاولة/المصيد : عدد المحاولة/المصيد
كمية التعبيرات الأقواس : عدد التعبيرات داخل الأقواس.
حرفية السلسلة : عدد حرفي السلسلة (على سبيل المثال ، "John Doe" ). الأوتار المتكررة تحسب عدة مرات كما تظهر.
كمية العدد : عدد الأرقام (أي ، int ، طويلة ، مزدوجة ، تعويم).
كمية عمليات الرياضيات : عدد عمليات الرياضيات (الأوقات ، الفجوة ، الباقي ، زائد ، ناقص ، القرف الأيسر ، التحول الأيمن).
كمية المتغيرات : عدد المتغيرات المعلنة.
كتل متداخلة ماكس : أكبر عدد من الكتل المتداخلة معًا.
كمية من الفصول المجهولة والفصول الداخلية وتعبيرات Lambda : الاسم يقول كل شيء. لاحظ أنه كلما تم الإعلان عن فئة مجهولة أو فئة داخلية ، تصبح "فئة جديدة كاملة" ، على سبيل المثال ، CK يولد AB و AB $ C ، C كونه فئة داخلية داخل AB ، ومع ذلك ، فإن تعبيرات Lambda لا تعتبر فصولًا ، وبالتالي ، هي جزء من الفئة/الطريقة التي يتم تضمينها فيها. يحتوي الفئة أو الطريقة فقط على عدد الفئات الداخلية التي يتم إعلانها على مستواه ، على سبيل المثال ، فئة داخلية يتم إعلانها داخل الطريقة M2 ، التي توجد داخل الفئة A المجهولة ، والتي يتم الإعلان عنها داخل الطريقة M ، والتي يتم إعلانها أخيرًا داخل الفئة C ، وهي فئة أول مجلة).
عدد الكلمات الفريدة : عدد الكلمات الفريدة في الكود المصدري. على مستوى الطريقة ، لا يستخدم سوى الجسم كمدخل. على مستوى الفصل ، يستخدم الجسم الكامل من الفصل كمقاييس. تعتبر الخوارزمية أساسًا عدد الكلمات في طريقة/فئة ، بعد إزالة الكلمات الرئيسية Java. يتم تقسيم الأسماء بناءً على حالة الإبل والتسديد (على سبيل المثال ، يصبح LongName_Likethis أربع كلمات). انظر فئة WordCounter للحصول على تفاصيل حول التنفيذ.
عدد عبارات السجل : عدد عبارات السجل في رمز المصدر. يستخدم العد regex متوافقًا مع مكالمات API SLF4J و LOG4J. انظر NumberOfLogStatements.java وأمثلة الاختبار ( NumberOfLogStatementsTest و fixtures/logs ) لمزيد من المعلومات.
لديه Javadoc : منطقية تشير إلى ما إذا كانت الطريقة لديها Javadoc. (فقط على مستوى الطريقة في الوقت الحالي)
المعدلات : المعدلات العامة/المجردة/الخاصة/المحمية/الأصلية للفئات/الأساليب. يمكن فك تشفيرها باستخدام org.eclipse.jdt.core.dom.Modifier .
استخدام كل متغير : كم مرة تم استخدام كل متغير داخل كل طريقة.
استخدام كل حقل : عدد المرات التي تم فيها استخدام كل حقل محلي داخل كل طريقة ، الحقل المحلي هو حقول داخل الفصل (لا يتم تضمين الفئات الفرعية). كما تم اكتشاف استخدامات المجال المحلي غير المباشر ، وتشمل استخدامات المجال المحلي غير المباشر جميع استخدامات الحقول داخل شجرة الاحتجاج المحلية لفئة على سبيل المثال A invokes B و B تستخدم الحقل A ، ثم A يستخدم بشكل غير مباشر بواسطة A.
استدعاءات الطريقة : جميع الأساليب التي يتم استدعاؤها مباشرة ، والاختلافات هي دعوات محلية والدعوات المحلية غير المباشرة.
ملاحظة: يفصل CK الفصول والفئات الداخلية والفصول المجهولة. LOC هو المقياس الوحيد الذي لم يتم عزله تمامًا عن الآخرين ، على سبيل المثال ، إذا كان A لديه إعلان من الفئة B ، ثم LOC (A) = LOC (Class A) + LOC (الفئة الداخلية B).
CK هي أداة جمع مقاييس Code Java ، يتم تبسيطها إلى بنية بسيطة تدور حول ثلاث حزم أساسية:
للإيجاز ، ضمن هذه الوثائق ، يتم حذف بادئات الحزمة مثل com.github.mauricioaniche.ck .
CK تزامن عملية جمع المقاييس بأكملها. يقوم بتهيئة الباحثين المتري ، وتقسيم الملفات على أساس الذاكرة المتاحة ، وإعداد محلات AST مع إعدادات البيئة المناسبة ، ويدير تدفق التنفيذ عبر دلائل مختلفة وتبعيات JAR. يقوم بضبط سلوكه بشكل حيوي بناءً على مدخلات المستخدمين مثل useJars و maxAtOnce و variablesAndFields لتحسين معالجة ملفات Java لجمع المقاييس.ck . تقوم هذه الفئة بمعالجة الوسائط لخط الأوامر لتكوين عملية جمع المقاييس وإطلاقها. إنه يتعامل مع إدخال المستخدم لمسار المشروع ، وإدراج جرة ، وتقسيم الملفات ، وتفصيل المقاييس ، وإعداد دليل الإخراج. يقوم Runner بتنفيذ التنفيذ الكلي من خلال تهيئة فئة CK والتعامل معها من خلال ResultWriter .FileASTRequestor ، وهو مكون من Core Eclipse JDT (Java Development Tools). يلعب دورًا محوريًا في إطار CK من خلال تنظيم عملية جمع المقاييس. ينسق MetricsExecutor إنشاء شجرة بناء الجملة المجردة (AST) لملفات مصدر Java ، وهو أمر ضروري لتحليل واستخراج مقاييس التعليمات البرمجية. MetricsFinder: تلعب فئة الأداة المساعدة هذه ، الموجودة في ck.utils ، دورًا حاسمًا في التعريف الديناميكي وتثبيت فئات جامع المتري ضمن إطار CK. ويستهدف الفصول التي تنفذ واجهات ClassLevelMetric و MethodLevelMetric من حزمة metrics .
يستخدم MetricsFinder مكتبة Reflections لمسح فئات جامع المقياس وتحميلها في وقت التشغيل ، مما يتيح أن يكون نظام CK قابلاً للتكيف وقابل للتكيف مع المقاييس الجديدة دون الحاجة إلى تعديلات على البنية الأساسية. هذه الميزة مفيدة بشكل خاص لدمج المقاييس المخصصة في عملية التحليل بسلاسة.
CKVISitor: مكون جزء لا يتجزأ من إطار CK ، يمتد CKVisitor إلى فئة ASTVisitor التي توفرها مكتبة Eclipse JDT (Java Development Tools) ، مما يتيح التحليل التفصيلي وجمع متري مباشرة من شجرة بناء الجملة المجردة لمصدر Java (AST).
تم تصميم الزائر لتجاوز العقد المختلفة لـ AST ، مثل الأنواع والأساليب ، وتطبيق إجراءات محددة في كل عقدة. إنه يدير بشكل فعال تسلسل هرمي قائم على المكدس للفئات والأساليب ، مما يسمح بحساب المقاييس وجمعها في سياق نطاق العقدة الحالية.
CKASTVISitor: تم تنفيذها بواسطة فئات مترية في ck.metrics ، مما يسمح لكل مقياس بالتعامل مع عقد AST المحددة ذات الاهتمام ، مثل استدعاءات الطريقة وإبداعات مثيل الفئة.
ClassLevelMetric و MethodLevelMetric: واجهات تحديد طرق لجمع المقاييس على مستوى الفئة ومستوى الطريقة ، على التوالي.
CKNotifier .CKClassResult و CKMethodResult مع البيانات التي تم جمعها.يشتمل CK Framework على عدد من أنماط التصميم الراسخة لتعزيز النموذج ، وتوسيع نطاق قابلية قاعدة قاعدة البيانات الخاصة به. تتيح هذه الأنماط إطار العمل من التعامل مع العمليات المعقدة بكفاءة مثل اجتياز أشجار بناء الجملة التجريدية (AST) ، وجمع المقاييس ، وإخطار النتائج. فيما يلي أنماط تصميم المفاتيح المستخدمة:
نمط الزوار: تنفذ واجهات CKVisitor و CKASTVisitor نمط الزوار ، وهو محوري في التعامل مع عمليات AST المختلفة دون تغيير فئات العناصر التي تعمل عليها. هذا النمط مفيد بشكل خاص في السيناريوهات حيث يحتاج المكون إلى إجراء عمليات مميزة وغير ذات صلة عبر التسلسل الهرمي للصف لعقد AST. إنه يبسط التعليمات البرمجية عن طريق تحديد المنطق التشغيلي إلى كائنات الزوار ، مما يسهل إضافة عمليات جديدة سهلة دون تعديل فئات العقدة الموجودة. يؤدي الفصل بين المخاوف إلى قاعدة كود أكثر قابلية للصيانة وقابلة للتمديد ، حيث يتم فصل هياكل عقدة AST عليها.
نمط الإشعارات: يعتمد CK نمط المعطيات من خلال استخدام CKNotifier ، والذي يعمل كآلية مركزية لبث نتائج مجموعة المقاييس لجميع المراقبين المسجلين. يعد هذا النمط أمرًا بالغ الأهمية لإنشاء بنية مقترنة بشكل فضفاض حيث يكون الموضوع (عملية الحساب المتري) مستقلاً عن مراقبيه (معالجات النتائج أو مولدات التقارير). يمكّن ذلك CK من إخطار مكونات متعددة حول الانتهاء من الحسابات المتري دون اقتران لمكونات محددة ، مما يعزز مرونة النظام وقابلية التوسع.
نمط المصنع: تتم إدارة إنشاء مثيل لهواة الجمع المتري بواسطة MetricsFinder ، الذي يجسد نمط المصنع. يتم استخدام هذا النمط لتغليف منطق إنشاء فئات جامع متري محددة استنادًا إلى قرارات وقت التشغيل. يقوم نمط المصنع بتبسيط عملية إضافة أنواع جديدة من هواة الجمع المتري دون إزعاج الكود الحالي ، مما يوفر بنية للتوصيل والتشغيل حيث يمكن تقديم مقاييس جديدة بسلاسة. كما أنه يساعد في الحفاظ على فصل المخاوف ، حيث يتم عزل عملية إنشاء كائنات متري عن المنطق الأساسي للجمع المتري.
من خلال الاستفادة من أنماط التصميم هذه ، يدير CK بكفاءة التعقيد ويضمن أن يظل الإطار قويًا وقابل للتكيف وسهل تمديده مع ظهور متطلبات جديدة وأنواع المتري.
تحتاج إلى ما لا يقل عن Java 8 لتتمكن من تجميع هذه الأداة وتشغيلها.
لاستخدام أحدث إصدار (يجب عليك) ، استنساخ المشروع وإنشاء جرة. تقوم mvn clean compile package البسيطة بإنشاء ملف جرة واحدة لك (انظر المجلد الهدف الخاص بك).
ثم ، فقط قم بالتشغيل:
java -jar ck-x.x.x-SNAPSHOT-jar-with-dependencies.jar
<project dir>
<use jars:true|false>
<max files per partition:0=automatic selection>
<variables and fields metrics?:true|false>
<output dir>
[ignored directories...]
يشير Project dir إلى الدليل حيث يمكن لـ CK العثور على جميع الكود المصدري المراد تحليله. سوف CK يبحث بشكل متكرر عن ملفات .java. يمكن لـ CK استخدام تبعيات المشروع فيما يتعلق بتحسين دقتها. تخبر معلمات use jars CK بالبحث عن أي ملفات .jar في الدليل واستخدامها لحل الأنواع بشكل أفضل. تخبر Max files per partition بحجم الدفعة للمعالجة. دعونا نقرر ذلك لك وتبدأ بـ 0 ؛ إذا حدثت مشاكل (أي ، خارج الذاكرة) تفكر في ضبطها. تشير Variables and field metrics إلى CK ما إذا كنت تريد مقاييس على مستويات متغير وحقل أيضًا. فهي ذات الحبيبات الدقيقة للغاية وتنتج الكثير من الإنتاج. يجب عليك تخطيه إذا كنت بحاجة فقط إلى مقاييس في الفصل أو مستوى الطريقة. أخيرًا ، output dir إلى الدليل حيث ستقوم CK بتصدير ملف CSV بمقاييس من المشروع الذي تم تحليله. اختياريا ، يمكنك تحديد أي رقم تم تجاهلها ، مفصولة بالمساحات (على سبيل المثال ، build/ ). بشكل افتراضي ، يتم تجاهل .git وجميع المجلدات الخفية الأخرى.
ستقوم الأداة بإنشاء ثلاثة ملفات CSV: فئة وطريقة ومستويات متغيرة.
تعلم بالقدوة. انظر Runner.java Class.
شاهد أحدث إصدار من المكتبة في الشارة في بداية هذه القراءة ، أو على https://mvnrepository.com/artifact/com.github.mauricioiche/ck.
استخدم المقتطف التالي في pom.xml الخاص بك. قم بتحديث XYZ مع أحدث إصدار من الأداة (تحقق من mvnrepository.com أو الشارة في بداية ملف readme هذا):
<!-- https://mvnrepository.com/artifact/com.github.mauricioaniche/ck -->
<dependency>
<groupId>com.github.mauricioaniche</groupId>
<artifactId>ck</artifactId>
<version>X.Y.Z</version>
</dependency>
يمكنك أيضًا استخدام البرنامج المساعد CK Maven ، الذي تم تطويره بواسطة JazzMuesli ، والذي يقوم تلقائيًا بتشغيل CK في مشروعك. مفيد جدًا للمطورين: https://github.com/jazzmuesli/ck-mvn-plugin.
تستخدم هذه الأداة مكتبة JDT Core من Eclipse تحت غطاء محرك السيارة لبناء AST. يتم تعيين إصدار الامتثال حاليًا على Java 11.
هل تحتاج إلى دعم لإصدار لغة أحدث؟ عملية إضافتها واضحة للغاية ، مع الأخذ في الاعتبار المساهمة في العلاقات العامة:
pom.xml . يمكنك استخدام متصفح مستودع مثل مستودع MVN لتخفيف هذه العملية.pom.xml ، قم بتحديث خصائص source target للمكون الإضافي لمجمول Maven وفقًا لذلك.CK.java : [...]
ASTParser parser = ASTParser.newParser(AST.JLS11);
[...]
JavaCore.setComplianceOptions(JavaCore.VERSION_11, options);
[...]
لأن الأداة ولدت لحساب CK ClassleVelmetrics ، لكنها نمت إلى أبعد من توقعاتي ... الحياة مضحكة!
من فضلك ، استخدم إدخال bibtex التالي:
@manual{aniche-ck,
title={Java code metrics calculator (CK)},
author={Maurício Aniche},
year={2015},
note={Available in https://github.com/mauricioaniche/ck/}
}
فقط أرسل العلاقات العامة! سائدا
هذا البرنامج مرخص بموجب ترخيص Apache 2.0.