Java projelerinde kullanılmayan / ölü kod nasıl bulunur [kapalı]


306

Büyük java projelerinde kullanılmayan / ölü kodu bulmak için hangi araçları kullanıyorsunuz? Ürünümüz birkaç yıldır geliştirilmektedir ve artık kullanılmayan kodu manuel olarak tespit etmek çok zorlaşmaktadır. Ancak mümkün olduğunca kullanılmayan kodu silmeye çalışıyoruz.

Genel stratejiler / teknikler (belirli araçlar hariç) için öneriler de takdir edilmektedir.

Düzenleme: Zaten kod kapsama araçları (Clover, IntelliJ) kullandığımızı, ancak bunların çok az yardımcı olduğunu unutmayın. Ölü kodun hala birim testleri vardır ve kapsam dahilinde gösterilir. İdeal bir araç, ona bağlı olarak çok az başka bir kodu olan kod kümelerini belirleyecek ve dokümanların manuel incelemesine izin verecekti.


16
Ünite testlerini ayrı bir kaynak ağacında tutun (yine de yapmalısınız) ve kapsama araçlarını yalnızca canlı ağaçta çalıştırın.
agnul

5
IDEA'nın "Kullanılmayan beyanı" incelemesiyle başlayacak ve Test kaynaklarını dahil et seçeneğinin işaretini kaldıracağım . IDEA'nın "az yardım" derken ne demek istediğinizi açıklığa kavuşturabilir misiniz?
David Moles

1
Ölü kodu bulma yolları: 1) dışarıdaki hiçbir şeyle bağlantılı değildir. 2) çalışma zamanında bağlı olmasına rağmen dışarıdan kullanılmamıştır. 3) Bağlantılı ve Denilen ama asla ölü değişken gibi kullanılmadı. 4) mantıksal olarak ulaşılamaz durum. Yani bağlantı kurma, zamanla erişim, mantık tabanlı, eriştikten sonra kullanın.
Muhammed Umer

IntelliJ
Idea'yı

David Mole'ın cevabına ek: bu cevaba bakınız stackoverflow.com/a/6587932/1579667
Benj

Yanıtlar:


40

Kod kullanım günlüklerini tutmak için çalışan sisteme alet verip aylarca veya yıllarca kullanılmayan kodları incelemeye başlarım.

Örneğin, kullanılmayan sınıflarla ilgileniyorsanız, örnekler oluşturulduğunda tüm sınıflar günlüğe kaydedilebilir. Ve sonra küçük bir komut dosyası, kullanılmayan sınıfları bulmak için bu günlükleri sınıfların tam listesi ile karşılaştırabilir.

Tabii ki, yöntem seviyesine giderseniz performansı aklınızda bulundurmalısınız. Örneğin, yöntemler yalnızca ilk kullanımlarını kaydedebilir. Bunun Java'da en iyi nasıl yapıldığını bilmiyorum. Bunu, dinamik bir dil olan ve böylece çalışma zamanında kod değişikliğine izin veren Smalltalk'ta yaptık. Bir günlük çağrısı ile tüm yöntemleri kullanırız ve bir yöntem ilk kez günlüğe kaydedildikten sonra günlük kodunu kaldırırız, bu nedenle bir süre sonra daha fazla performans cezası oluşmaz. Benzer bir şey Java'da statik boolean bayrakları ile de yapılabilir ...


5
Ben bu yanıtı seviyorum ama herkes açıkça her sınıfta günlük eklemeden Java bunu nasıl bir fikir var mı? Belki de 'Proxy' büyüsü?
Yasadışı Programcı

14
@Outlaw AOP bunun için mükemmel bir kullanım örneği gibi görünüyor.
Pascal Thivent

6
Uygulamanın sınıf yükleme yapısını anlarsanız, sınıf yükleme olaylarını izlemek için sınıf yükleyicideki AOP'yi kullanabilirsiniz. Bu, bir üretim sistemine tüm inşaatçılar nezdinde tavsiyeden daha az invaziv olacaktır.
ShabbyDoo

5
Bu yanıt dinamik bir dil için oldukça iyidir, ancak ÇOK daha iyi yapabilen statik bir dil için korkunçtur. Statik olarak yazılan bir dille (yansımanın yanı sıra) tam olarak hangi yöntemlerin kullanıldığını ve hangilerinin kullanılmadığından emin olabilirsiniz, bu statik olarak yazılan bir dilin en büyük avantajlarından biridir ve burada açıklanan yanlış yöntem yerine onu kullanmalısınız. .
Bill K

4
@BillK düşündüğünüzden daha fazla yansıma olur. Örneğin Spring, örtünün altında yansıma da dahil olmak üzere biraz sihir yapar. Analiz aracınız bunu taklit etmelidir.
Thorbjørn Ravn Andersen

220

Oldukça iyi çalışan bir Eclipse eklentisi Kullanılmayan Kod Dedektörüdür .

Tüm bir projeyi veya belirli bir dosyayı işler ve görünürlük değişikliklerini (yani korunan veya özel olabilecek genel bir yöntem) önermenin yanı sıra çeşitli kullanılmayan / ölü kod yöntemlerini gösterir.


Güzel görünüyor ama çalıştıramadım - "Un ... kodunu algıla" eylemi devre dışı bırakıldı ve etkinleştirmenin bir yolunu bulamadım.
Ondra Aprižka

1
Gerçekten kullanılmayan yöntemler bulmak, ama aynı zamanda bir iş delege desen tasarım
Eildosa

Hala kepler üzerinde çalışıyor mu? eclipse 3.8 hakkında bültenler: ucdetector.org/releases.html
Mr_and_Mrs_D

Kepler üzerinde mükemmel bir çalışma durumunda gibi görünüyor.
Erik Kaplun

4
Marketplace.eclipse.org/content/unnecessary-code-detector sitesine bir bağlantı eklemek ister misiniz ? Bu, kurulumu kolaylaştırır ve yeni Eclipse sürümlerinde desteklenip desteklenmediğini sorusunu yanıtlar.
Thomas Weller

64

CodePro yakın zamanda Eclipse projesi ile Google tarafından piyasaya sürüldü. Ücretsizdir ve oldukça etkilidir. Eklentinin bir / daha fazla giriş noktası olan ' Ölü Kodu Bul ' özelliği vardır. Oldukça iyi çalışıyor.


1
Tutulma Kepler ile artık çalışmaz. Güncelleme sitesi aracılığıyla başarıyla yükledikten sonra, her zaman tutulma çökmesi yapar.
txulu

Ne yazık ki, bu araç Bahar'ın varlığından haberdar değil gibi görünüyor, bu nedenle, tüm @Bileşenlerimi yanlış, yanlış olarak işaretleyecek
Clint Eastwood

Çok eski ol Daha fazla çalışmıyor Last updated this plugin March 27, 2012 Geliştiriciler.google.com
java

2
Tüm bağlantılar eski.
zygimantus

3
Maalesef, Google'ın Eclipse projesine kodu döktüğü ve her şeyi unuttuğu anlaşılıyor.
Thorbjørn Ravn Andersen

30

Şaşırdım ProGuard burada bahsedilmedi. Etrafındaki en olgun ürünlerden biri.

ProGuard , ücretsiz bir Java sınıfı dosya küçültücü, optimize edici, gizleme ve önleyici. Kullanılmayan sınıfları, alanları, yöntemleri ve nitelikleri algılar ve kaldırır. Bayt kodunu optimize eder ve kullanılmayan talimatları kaldırır. Kalan sınıfları, alanları ve yöntemleri kısa anlamsız adlar kullanarak yeniden adlandırır. Son olarak, Java 6 veya Java Micro Edition için işlenmiş kodu önceliklendirir.

ProGuard'ın bazı kullanım alanları:

  • Daha küçük kod arşivleri, ağlar arasında daha hızlı aktarım, daha hızlı yükleme ve daha küçük bellek ayak izleri için daha kompakt kod oluşturma.
  • Programları ve kütüphaneleri tersine mühendislikle zorlaştırmak.
  • Ölü kod listeleniyor, böylece kaynak koddan kaldırılabilir.
  • Daha hızlı sınıf yüklemelerinden tam olarak yararlanmak için Java 6 veya üstü için mevcut sınıf dosyalarını yeniden hedefleme ve önleme.

Ölü kod listesi için örnek: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode


8
Örnek bir kullanım sağlamak daha iyi bir cevap verecektir.
rds

1
Belgeleri okurken, kullanılmayan kodu daralttığını görüyorum, ancak listelediği herhangi bir yerde bulamıyorum - kabul edilen bir örnek veya belgelerin ilgili bölümüne bağlantı oldukça yararlı olacaktır!
Ocak'ta orbfish

26

Eclipse'de tek bir sınıfta bildiğim bir şey, tüm yöntemlerini özel olarak değiştirmek ve sonra hangi şikayetleri aldığımı görmek. Kullanılan yöntemler için, bu hatalara neden olur ve bunları mümkün olan en düşük erişim seviyesine döndürürüm. Kullanılmayan yöntemler için bu, kullanılmayan yöntemlerle ilgili uyarılara neden olur ve bunlar daha sonra silinebilir. Ve bir bonus olarak, genellikle özel hale getirilebilen ve yapılması gereken bazı genel yöntemler bulursunuz.

Ama çok manuel.


4
Belki ideal cevap değil ama bu gerçekten zekice.
Erik Reppen

8
Bu zekice ... başka bir sınıftan kullanılmayan bir koddan çağrı yapana kadar.
Danosaure

Bu yöntem üzerinde yineleme yapmak, kullanılan bir yöntem kaldırıldıktan sonra başkalarını oluştururken büyük kod yığınlarını kaldırabilir.
4myle

15

Kod tabanınızı oluşturmak için bir sınama kapsamı aracı kullanın, ardından sınamaları değil, uygulamanın kendisini çalıştırın.

Emma ve Eclemma , kodun herhangi bir çalışması için hangi sınıfların yüzde kaçının çalıştırıldığına dair güzel raporlar verecektir.


1
Bunun için +1 iyi bir başlangıç ​​noktasıdır, ancak örneğin kullanılmayan (henüz beyan edilmiş) değişkenlerin de yeşil olacağını unutmayın.
DerMike

13

Kod tabanımızın yeniden düzenleme için hedef açısından zengin ortamındaki bazı funk'ları tanımlamaya yardımcı olması için Hata Bul'u kullanmaya başladık . Ayrıca Yapı 101'in kod tabanınızın mimarisinde çok karmaşık olan noktaları tanımlamasını da düşünürdüm , bu yüzden gerçek bataklıkların nerede olduğunu biliyorsunuz.


4
FindBugs ölü ve kullanılmayan kodu algılayamaz, sadece kullanılmayan alanları tespit eder. Bu cevaba bakınız .
Stefan Mücke

12

Teorik olarak, kullanılmayan kodu deterministik olarak bulamazsınız. Bunun matematiksel bir kanıtı var (bu daha genel bir teorem için özel bir durum). Merak ediyorsanız, Durdurma Sorununa bakın.

Bu, Java kodunda birçok şekilde kendini gösterebilir:

  • Kullanıcı girdisi, yapılandırma dosyaları, veritabanı girişleri vb.
  • Harici kod yükleniyor;
  • Nesne ağaçlarının üçüncü taraf kütüphanelerine aktarılması;
  • vb.

Bununla birlikte, IDEA IntelliJ'yi tercih ettiğim IDE olarak kullanıyorum ve modüller, kullanılmayan yöntemler, kullanılmayan üyeler, kullanılmayan sınıflar, vb. Arasında findign bağımlılıkları için kapsamlı analiz araçlarına sahip. kullanılmayan olarak etiketlendi, ancak genel bir yöntem daha kapsamlı analiz gerektiriyor.


1
Girişiniz için teşekkürler. IntelliJ kullanıyoruz ve orada yardım alıyoruz. Durma Sorunu ve kararsızlığa gelince, teoriyi biliyorum, ancak mutlaka deterministik bir çözüme ihtiyacımız yok.
knatten

12
Açılış cezası çok güçlü. Duruş Probleminde olduğu gibi (genellikle yanlış / kötü muamele), tam bir genel çözüm yoktur, ancak tespit edilmesi mümkün olan birçok özel durum vardır.
joel.neely

9
Değerlendirme ve / veya yansıması olan diller için genel bir çözüm olmasa da, kodun kanıtlanamayacağı birçok durum vardır.
pjc50

1
Yansıması olmadan ve tam kaynak koduyla, statik olarak yazılan herhangi bir dil, kullanılmayan tüm kodları deterministik olarak bulmayı oldukça kolaylaştırmalıdır.
Bill K

Bunun yansıma veya dış arayanlar tarafından erişilemez olduğunu bulamıyorsunuz, ancak belirli bir giriş noktasından veya giriş noktaları kümesinden statik olarak erişilemeyen bir kod bulabilirsiniz
nafg

8

Eclipse Goto'da Windows> Tercihler> Java> Derleyici> Hatalar / Uyarılar
ve hepsini hatalarla değiştirin. Tüm hataları düzeltin. Bu en basit yol. Güzelliği, yazarken kodu temizlemenize izin vermesidir.

Ekran Tutulma Kodu:

resim açıklamasını buraya girin


5

IntelliJ, kullanılmayan kodu tespit etmek için kod analiz araçlarına sahiptir. Mümkün olduğunca çok sayıda alan / yöntem / sınıf oluşturmayı denemelisiniz ve bu da daha fazla kullanılmayan yöntem / alan / sınıf gösterecektir

Ayrıca kod hacmini azaltmanın bir yolu olarak yinelenen kodu bulmaya çalışacağım.

Son önerim, eğer kullanıldıysa kodunuzu daha basit hale getirecek açık kaynak kodunu bulmaya çalışmaktır.


Bu araçların ne olduğuna dair herhangi bir örnek var mı?
17'de orbfish

@orbfish Analyse=> Run inspection by name=>unused
Peter Lawrey


3

DCD, bazı IDE için bir eklenti değildir, ancak karınca veya tek başına çalıştırılabilir. Statik bir araç gibi görünüyor ve PMD ve FindBugs'ın yapamayacağı şeyleri yapabilir . Deneyeceğim.

PS Aşağıdaki yorumda belirtildiği gibi, Proje şimdi GitHub'da yaşıyor .


Bu cevap değil bir yorum olarak aşağı gitmek gerekir
Kont

DCD "şimdi ölü görünüyor" ifadenizi kaldırmak için lütfen yanıtınızı güncelleyin. Sürüm 2.1 12 gün önce yayınlandı . Ayrıca, cevabınızdaki bağlantı da çalışmıyor.
skomisa

2

Profil kodunu oluşturan ve kod kapsamı verileri sağlayan araçlar vardır. Bu, kodun ne kadarının çağrıldığını görmenizi sağlar (kod çalıştırılırken). Ne kadar yetim koduna sahip olduğunuzu öğrenmek için bu araçlardan herhangi birini alabilirsiniz.


2
  • FindBugs bu tür şeyler için mükemmeldir.
  • PMD (Project Mess Detector) kullanılabilecek başka bir araçtır.

Ancak, hiçbiri çalışma alanında kullanılmayan genel statik yöntemleri bulamaz . Eğer böyle bir araç bilen varsa, lütfen bana bildirin.


1

EMMA gibi kullanıcı kapsama araçları. Ancak statik bir araç değildir (yani, uygulamayı gerçekten regresyon testi ve tüm olası hata durumları aracılığıyla çalıştırmayı gerektirir, ki bu imkansızdır :))

Yine de, EMMA çok faydalıdır.


1

Emma, ​​Cobertura ve Clover gibi kod kapsamı araçları, kodunuzu düzenleyecek ve bir takım testler yaparak hangi bölümlerinin çağrıldığını kaydedecektir. Bu çok kullanışlıdır ve geliştirme sürecinizin ayrılmaz bir parçası olmalıdır. Test takımınızın kodunuzu ne kadar iyi kapsadığını belirlemenize yardımcı olacaktır.

Ancak, bu gerçek ölü kodu tanımlamakla aynı şey değildir. Yalnızca testlerin kapsadığı (veya kapsamadığı) kodu tanımlar. Bu, yanlış pozitifler (testleriniz tüm senaryoları kapsamıyorsa) ve yanlış negatifler (gerçek bir dünya senaryosunda hiç kullanılmayan test erişim kodunuz varsa) verebilir.

Gerçekten ölü kodu tanımlamak için en iyi yolu canlı çalışan bir ortamda bir kapsama aracı ile kod enstrüman ve uzun bir süre boyunca kod kapsamı analiz olacağını düşünün.

Yük dengeli yedekli bir ortamda (ve eğer değilse, neden olmasın?) Koşuyorsanız, uygulamanızın yalnızca bir örneğini enstrüman haline getirmenin ve yük dengeleyicinizi rasgele, ancak küçük bir kısmı yapılandırmanın mantıklı olacağını varsayalım. kullanıcılarınız enstrümanlı örneğinizde çalışır. Bunu uzun bir süre yaparsanız (tüm gerçek dünya kullanım senaryolarını - bu tür mevsimsel varyasyonları kapsadığınızdan emin olmak için), kodunuzun gerçek alan kullanımı altında hangi alanlarına tam olarak erişildiğini ve hangi bölümleri görebildiğinizi görebilmeniz gerekir. gerçekten hiç erişilmez ve dolayısıyla ölü kod.

Ben şahsen bu yapıldığını hiç görmedim ve yukarıda bahsi geçen araçların bir test paketi aracılığıyla çağrılmayan kodu enstrüman ve analiz etmek için nasıl kullanılabileceğini bilmiyorum - ama eminim olabilirler.


1

Bir Java projesi var - Dead Code Detector (DCD). Kaynak kodu için iyi çalışmıyor gibi görünüyor, ancak .jar dosyası için - gerçekten iyi. Ayrıca sınıfa ve yönteme göre filtreleyebilirsiniz.



0

Eclipse ulaşılamayan kodu gösterebilir / vurgulayabilir. JUnit size kod kapsamını gösterebilir, ancak bazı testlere ihtiyacınız vardır ve ilgili testin eksik olup olmadığına veya kodun gerçekten kullanılmadığına karar vermeniz gerekir.


3
Eclipse size yalnızca yöntemin kapsamının yerel (ör. Özel) olup olmadığını söyleyecektir; ve o zaman bile% 100 emin olamazsınız ... yansıma ile özel yöntem dışarıdan çağrılabilir.
p3t0r

0

Kullanılan kod kullanılan ve kullanılmayan kodu Clover kapsama aracı buldum. Google CodePro Analytics'ten farklı olarak, Web Uygulamaları için de çalışır (deneyimlerime göre Google CodePro hakkında yanlış olabilirim).

Fark ettiğim tek dezavantajı, Java arayüzlerini dikkate almamasıdır.


Afaict, ücretsiz bir sunucu tarafı CI aracı.
Erik Kaplun

0

Asla çağrılmayan yöntemleri bulmak için bir yöntem çağrı haritası geliştirmek için Doxygen kullanıyorum. Grafikte arayanlar olmadan yöntem kümelerinin adalarını bulacaksınız. Her zaman bir ana giriş noktasından başlamanız gerektiğinden bu, kütüphaneler için çalışmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.