سؤال

أنا أعمل على مكتبة حيث نريد تحديد مقدار مكتبةنا المستخدمة. أي نريد أن نعرف عدد الأساليب في مكتبتنا عامة، ولكن لا يتم استدعاؤها أبدا.

الهدف: تحدد التحليل الثابت عدد خطوط التعليمات البرمجية استدعاء كل طريقة عامة في الحزمة A في المشروع الحالي. إذا كان عدد المكالمات صفر، يجب الإبلاغ عن الطريقة على هذا النحو.

هل كانت مفيدة؟

المحلول

أعتقد أنك تبحث عن هذا البرنامج المساعد Eclipse -> ucdetector.

من الوثائق (إشعار الدفع إلى نقطة رصاصة ثانية)

  • رمز (ميت) غير ضروري
  • الرمز حيث يمكن تغيير الرؤية للحماية أو الافتراضي أو الخاص
  • طرق الحقول، والتي يمكن أن تكون نهائية

على نطاق أوسع، إذا كنت ترغب في إجراء التحليل الثابت على مستوى الكائن، فابحث في هذه الأداة من IBM ->التحليل الهيكلي ل Java. وبعد إنه مفيد حقا تحليل الكائنات للمكتبات، واجهات برمجة التطبيقات، إلخ.

نصائح أخرى

ليس بالضبط ما تبحث عنه، ولكن:

يتم القيام بشيء مماثل مع أدوات تغطية التعليمات البرمجية (مثل كوبيرتورا). إنهم لا يقومون بالتفتيش الساكنة من التعليمات البرمجية المصدرية، ولكن صك bytecode لجمع المقاييس في وقت التشغيل. بالطبع، تحتاج إلى قيادة التطبيق بطريقة تمارس جميع نمط الاستخدام، وقد تفوت مسارات رمز النادر.

على الجبهة التحليل الثابت، ربما يمكن أن تساعدك هذه الأدوات (يستخدمها مشروع Apache للتحقق من توافق API للإصدارات الجديدة، مثل هذه المهمة ذات صلة إلى حد ما بما تحاول القيام به):

  • مرحاض هي أداة تتحقق من مكتبات Java للتوافق الثنائي والمصدر مع الإصدارات القديمة. في الأساس، تعطيه مجموعتين من ملفات جرة وفك CLIRR لإخراج قائمة بالتغييرات في API العام.
  • jdiff. هو docomlet javadoc الذي يولد تقريرا HTML بجميع الحزم والفئات والبنسيات والأساليب والحقول التي تمت إزالتها أو تم إضافتها أو تغييرها بأي طريقة، بما في ذلك وثائقها، عند مقارنة برمجة التطبيقات.

استخدام العميل للمكالمات العاكسة هو ثقب واحد في التحليل الثابت للنظر فيه. نظرا لعدم وجود وسيلة لمعرفة تأكد من عدم استدعاء طريقة معينة عبر بعض مخطط الانعكاس الغريب. لذلك، ربما مزيج من وقت التشغيل والتحليل الثابت قد يكون الأفضل.

لا أعتقد أنك قادر على قياس كيفية حاجة "في كثير من الأحيان" فئة أو وظيفة.
هناك بعض الأسئلة البسيطة:

  • ما يحدد، إذا كانت إحصائية استخدام مكتبة اللعبة الخاصة بك هي "طبيعية" أو "تبسيط"؟ هل من الخطأ قتل نفسك في اللعبة في كثير من الأحيان؟ سوف تستخدم فئة "KillScreen" بشكل متكرر مثل اللاعب الجيد.
  • ما يحدد "الكثير"؟ الوقت أو عدد الاستخدام؟ سوف تستهلك Pojos الوقت النادر، ولكن يتم استخدامها في كثير من الأحيان.

خاتمة:
لا أعرف ما تحاول إنجازه.
إذا كنت ترغب في عرض تبعيات التعليمات البرمجية الخاصة بك، فهناك الآخر أدوات للقيام بذلك. إذا كنت تحاول قياس تنفيذ التعليمات البرمجية، فهناك profiler أو معايير ل Java. إذا كنت مهوسا إحصائيا، فسوف تكون سعيدا Rapidminer. ;)

حظا جيدا في ذلك!

أود أن أقترح Jdepend يوضح لك التبعيات بين الحزم والفئات، ممتازة للعثور على تبعيات دورية!http://clarkware.com/software/jdepend.html.(يحتوي على مساعد Eclipse: http://andrei.gmxhome.de/jdepend4eclipse/

وكذلك PMD لمقاييس أخرىhttp://pmd.sourceforge.net/

لدى Intellij أداة للكشف عن الأساليب والحقول والطبقة التي يمكن أن تحتوي على معدلات أكثر تقييدا. كما أنه يحتوي على إصلاح سريع لتطبيق هذه التغييرات التي يمكن أن توفر لك الكثير من العمل أيضا. إذا كنت لا ترغب في دفع ثمنها، فيمكنك الحصول على ترخيص Event لمدة 30 يوما وهو أكثر من وقت كاف لتغيير التعليمات البرمجية الخاصة بك، إنه ليس شيئا يجب أن يحتاجك إلى القيام به في كثير من الأحيان.

راجع للشغل: يحتوي Intellij على حوالي 650 عملية تفتيش رمزية لتحسين جودة التعليمات البرمجية، فإن حوالي نصفه يحتوي على إصلاحات تلقائية حتى أقترح قضاء بضع يوم باستخدامه ل Refactor / Tidy Up Code.

يرجى إلقاء نظرة على كاشف الكود الميت. وبعد يدعي أن تفعل ما تبحث عنه فقط: العثور على رمز غير مستخدم باستخدام التحليل الثابت.

إليك بعض القوائم لأدوات تغطية كود Java. لم أستخدم أي من هؤلاء شخصيا، لكن قد يبدأ في ذلك:

قد يكون proguard خيارا أيضا (http://proguard.sourceforge.net/):

"بعض استخدامات proguard هي:

  • ...
  • سرد الرمز الميت، لذلك يمكن إزالته من التعليمات البرمجية المصدر.
  • ... "

أنظر أيضا http://proguard.sourceforge.net/manual/examples.html#deadcode.

يمكنك كتابة الأداة المساعدة الخاصة بك لهذا (خلال ساعات من قراءة هذا) باستخدام مكتبة تحليل ASM ByTecode (http://asm.ow2.org.). ستحتاج إلى تنفيذ Classvisitor ومهجأ. ستستخدم ClassReader لتحليل ملفات الفصل في مكتبتك.

  • سيتم استدعاء VisionVisitor الخاص بك (..) لكل طريقة معلنة.
  • سيتم استدعاء VisionVisitor الخاص بك (..) لكل طريقة تسمى الأسلوب.

الحفاظ على خريطة للقيام العد. تمثل المفاتيح الأساليب (انظر أدناه). إليك بعض الكود:

class MyClassVisitor {
    // ...
    public void visit(int version, int access, String name, ...) {
        this.className = name;
    }
    public MethodVisitor visitMethod(int access, String name, String desc, ...):
        String key = className + "." + name + "#" + desc;
        if (!map.containsKey() {
            map.put(key, 0);
        }
        return new MyMethodVisitor(map);
    }
    // ...
}

void class MyMethodVisitor {
    // ...
    public visitMethodInsn(int opcode, String name, String owner, String desc, ...) {
        String key = owner + "." + name + "#" + desc;
        if (!map.containsKey() {
            map.put(key, 0);
        }
        map.put(key, map.get(key) + 1);
    }
    // ...
}

في الأساس هذا هو. أنت بدأت العرض بشيء مثل هذا:

Map<String,Integer> map = new HashMap<String,Integer>();
for (File classFile : my library) {
    InputStream input = new FileInputStream(classFile);
    new ClassReader(input).accept(new MyClassVisitor(map), 0);
    input.close();
}
for (Map.Entry<String,Integer> entry : map.entrySet()) {
    if (entry.getValue() == 0) {
        System.out.println("Unused method: " + entry.getKey());
    }
}

استمتع!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top