كيفية العثور على التعليمات البرمجية غير المستخدمة/الميتة في مشاريع جافا

StackOverflow https://stackoverflow.com/questions/162551

  •  03-07-2019
  •  | 
  •  

سؤال

ما الأدوات التي تستخدمها للعثور على التعليمات البرمجية غير المستخدمة/الميتة في مشاريع جافا الكبيرة؟لقد ظل منتجنا قيد التطوير لعدة سنوات، وأصبح من الصعب جدًا اكتشاف التعليمات البرمجية التي لم تعد قيد الاستخدام يدويًا.ومع ذلك، فإننا نحاول حذف أكبر قدر ممكن من التعليمات البرمجية غير المستخدمة.

كما نقدر الاقتراحات الخاصة بالاستراتيجيات/التقنيات العامة (بخلاف الأدوات المحددة).

يحرر: لاحظ أننا نستخدم بالفعل أدوات تغطية التعليمات البرمجية (Clover، IntelliJ)، ولكن هذه الأدوات قليلة المساعدة.لا يزال الكود الميت يحتوي على اختبارات الوحدة، ويظهر كما هو مغطى.أعتقد أن الأداة المثالية ستحدد مجموعات من التعليمات البرمجية التي تحتوي على القليل جدًا من التعليمات البرمجية الأخرى التي تعتمد عليها، مما يسمح بفحص المستندات يدويًا.

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

المحلول

وأود أن الصك نظام تشغيل للحفاظ على سجلات استخدام الرمز، وتبدأ بعد ذلك بتفتيش التعليمات البرمجية التي لم يتم استخدامه لمدة شهور أو سنوات.

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

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

نصائح أخرى

والمساعد الكسوف التي تعمل بشكل جيد إلى حد معقول هو غير المستخدمة كود الكاشف .

ويقوم بمعالجة مشروع بأكمله، أو ملف معين ويظهر مختلف الأساليب غير المستخدمة / الميتة الرمز، وكذلك اقتراح تغييرات الرؤية (أي طريقة العامة التي يمكن أن تكون محمية أو الخاص).

صدر

CodePro مؤخرا من قبل جوجل مع المشروع الكسوف. فهو حر وفعال للغاية. البرنامج المساعد لديه " البحث الميت كود " ميزة واحدة / العديد من نقطة الدخول (س). يعمل بشكل جيد جدا.

أنا مندهش بروجارد لم يتم ذكرها هنا.إنه أحد المنتجات الأكثر نضجًا على الإطلاق.

بروجارد هو ملف فئة Java مجاني يتقلص ، مُحسِّن ، محطات ، و preverifier.يكتشف ويزيل الفصول غير المستخدمة والحقول والأساليب والسمات.يعمل على تحسين رمز Bytecode ويزيل التعليمات غير المستخدمة.إنه يعيد تسمية الفئات المتبقية والحقول والأساليب باستخدام أسماء قصيرة لا معنى لها.أخيرًا ، يقوم بتقديم الكود المعالج لـ Java 6 أو Java Micro Edition.

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

  • إنشاء المزيد من التعليمات البرمجية المدمجة ، لأرشيفات التعليمات البرمجية الأصغر ، والنقل بشكل أسرع عبر الشبكات ، والتحميل الأسرع ، وآثار ذاكرة أصغر.
  • جعل البرامج والمكتبات أكثر صعوبة في الهندسة العكسية.
  • إدراج التعليمات البرمجية الميتة، بحيث يمكن إزالتها من التعليمات البرمجية المصدر.
  • إعادة استهداف ملفات الفئة الموجودة والتحقق منها مسبقًا لـ Java 6 أو أعلى، للاستفادة الكاملة من تحميل الفئة الأسرع.

هنا مثال لقائمة التعليمات البرمجية الميتة: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

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

ولكن من اليدوي للغاية.

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

إيما و <لأ href = "http://www.eclemma.org/" يختلط = " noreferrer "> Eclemma سوف تعطيك تقارير لطيفة ما نسبة ما يتم تشغيل الطبقات لأي المدى معينة من التعليمات البرمجية.

لقد بدأت في استخدام البحث البق للمساعدة في التعرف على بعض الفانك في منطقتنا مصدر برنامج في الهدف الغنية البيئة لrefactorings. وأود أن تنظر أيضا هيكل 101 لتحديد المواقع في الهندسة المعمارية مصدر برنامج الخاص بك التي هي معقدة للغاية، حتى تعرف حيث المستنقعات الحقيقية.

من الناحية النظرية، لا يمكنك العثور بشكل حاسم على التعليمات البرمجية غير المستخدمة.يوجد دليل رياضي على ذلك (حسنًا، هذه حالة خاصة لنظرية أكثر عمومية).إذا كنت فضوليًا، فابحث عن مشكلة التوقف.

يمكن أن يظهر هذا في كود Java بعدة طرق:

  • تحميل الفئات بناءً على إدخال المستخدم، وملفات التكوين، وإدخالات قاعدة البيانات، وما إلى ذلك؛
  • تحميل الكود الخارجي
  • تمرير أشجار الكائنات إلى مكتبات الطرف الثالث؛
  • إلخ.

ومع ذلك، فأنا أستخدم IDEA IntelliJ باعتباره IDE المفضل لدي، وهو يحتوي على أدوات تحليل واسعة النطاق للعثور على التبعيات بين الوحدات النمطية، والأساليب غير المستخدمة، والأعضاء غير المستخدمين، والفئات غير المستخدمة، وما إلى ذلك.إنها ذكية تمامًا أيضًا مثل الطريقة الخاصة التي لم يتم استدعاؤها والتي تم وضع علامة عليها غير مستخدمة ولكن الطريقة العامة تتطلب تحليلاً أكثر شمولاً.

في الكسوف انتقل الى ويندوز> تفضيلات> جافا> مترجم> أخطاء / التحذيرات
وتغيير كل منهم أخطاء. إصلاح كافة الأخطاء. هذا هو أبسط وسيلة. والجمال هو أن هذا سوف يسمح لك لتنظيف الكود كما تكتب.

لقطة كود الكسوف:

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

ووأود أيضا محاولة لتحديد مكان شفرة مكررة كوسيلة لتقليل حجم التعليمات البرمجية.

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

شريحة منظور سيعطي قائمة (و الرسم البياني التبعية) أي "أيتام" أو "اليتيمة مجموعة " من الطبقات أو الطرود التي ليس لها تبعيات أو من الكتلة "الرئيسية".

وDCD ليس المساعد لبعض IDE ولكن يمكن تشغيلها من النمل أو مستقل. يبدو وكأنه أداة ثابتة و أنها يمكن أن تفعل ما PMD وFindBugs لا يمكن . سأحاول ذلك.

وP.S. كما ورد في التعليق أدناه، يعيش المشروع الآن في جيثب .

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

  • FindBugs ممتاز لهذا النوع من الأشياء.
  • PMD (Project Mess Detector) هي أداة أخرى يمكن استخدامها.

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

وأدوات التغطية المستخدم، مثل EMMA. ولكنها ليست أداة ثابتة (أي أنه يتطلب فعلا لتشغيل التطبيق من خلال اختبار الانحدار، ومن خلال جميع حالات الخطأ المحتملة، والتي هي، أيضا، من المستحيل :))

ومع ذلك، EMMA أمر مفيد للغاية.

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

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

وأتصور أن أفضل طريقة لتحديد حقا كود ميتا سيكون لأداة التعليمات البرمجية الخاصة بك مع أداة التغطية في بيئة تشغيل حية وتحليل مدونة التغطية على مدى فترة طويلة من الزمن.

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

وأنا لم أر شخصيا هذا القيام به، ولا أعرف كيف الأدوات المذكورة أعلاه يمكن استخدامها لأجهزة القياس وتحليل التعليمات البرمجية التي لم يتم استدعاؤه من خلال مجموعة الاختبار - ولكن أنا متأكد من أنها يمكن أن تكون

وهناك مشروع جافا - الميت الكاشف كود (DCD). لرمز المصدر أنه لا يبدو أن تعمل بشكل جيد، ولكن لملف بامتداد - انها جيدة حقا. بالإضافة يمكنك تصفية حسب الطبقة والأسلوب.

نتبيانز هنا مكون إضافي لـ Netbeans كاشف رمز الميت.

سيكون من الأفضل لو كان بإمكانه الارتباط بالرمز غير المستخدم وإبرازه.يمكنكم التصويت والتعليق هنا: الخطأ 181458 - ابحث عن الفئات والأساليب والحقول العامة غير المستخدمة

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

ولقد وجدت البرسيم أداة التغطية التي الصكوك رمز ويسلط الضوء على التعليمات البرمجية التي يتم استخدامها والتي هي غير مستخدمة. على عكس جوجل CodePro تحليلات، كما أنها تعمل ليبابليكاتحده (حسب تجربتي وأنا قد تكون غير صحيحة عن Google CodePro).

والعيب الوحيد الذي لاحظته هو أنه لا يأخذ واجهات جافا بعين الاعتبار.

وأنا استخدم Doxygen لوضع خارطة استدعاء الأسلوب لتحديد الأساليب التي تسمى أبدا. على الرسم البياني سوف تجد الجزر من مجموعات طريقة دون المتصلين. هذا لا يعمل للمكتبات منذ تحتاج دائما تبدأ من نقطة الدخول الرئيسية.

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