Kod kapsamı kullanılmayan yöntemleri vurgulamaktadır - ne yapmalıyım?


59

Var olan bir Java projesinin kod kapsamını arttırmakla görevlendirildim.

Kod kapsamı aracının ( EclEmma ) hiçbir zaman bir yerden çağrılmayan bazı yöntemleri vurguladığını fark ettim .

İlk tepkim, bu yöntemler için birim testleri yazmak değil , onları bölüm müdürüme / ekibime vurgulamak ve neden bu işlevlerin neden orada olduğunu sormak.

En iyi yaklaşım ne olurdu? Onlar için birim testleri yaz veya neden orada olduklarını sorguluyor musun?


1
Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
maple_shaft

Yanıtlar:


119
  1. Silin.
  2. Teslim Et.
  3. Unutmak.

Gerekçe:

  1. Ölü kod öldü. Tanımı gereği hiçbir amacı yoktur. Bir noktada bir amacı olabilirdi, ama bu gitti ve kodun gitmesi gerekiyordu.
  2. Sürüm kontrolü, (benim deneyimime göre) birinin daha sonra bu kodu aramaya devam etmesiyle ortaya çıkan nadir benzersiz olayın alınabilmesini sağlar.
  3. Yan etki olarak, kod kapsamını hiçbir şey yapmadan anında geliştirirsiniz (ölü kod test edilmedikçe, bu nadiren gerçekleşmez).

Yorumlardan kaçınmak: Orijinal cevap, kodun şüphesiz ölü olduğunu doğruladığınızı kabul etti. IDE'ler yanılabilir ve ölü görünen kodun aslında çağrılabileceği çeşitli yollar vardır . Kesinlikle emin değilseniz bir uzmana getirin.


118
Genel olarak bu yaklaşıma katılırdım, ancak bir proje ve / veya küçük bir geliştirici için yeniyseniz, silmeden önce mentorunuza / amirinize sorun. Projeye bağlı olarak, bazı yöntemler kullanılmış görünmeyebilir, ancak erişiminiz olan proje kodunda değil, dış kod tarafından çağrılabilir / kullanılır. Otomatik olarak oluşturulan kod olabilir, böylece silme işleminiz kayıt geçmişi gürültüsünden başka bir şey elde etmez. IDE'niz proje içinden yansıma tabanlı erişim bulamıyor olabilir. Vb ss. Böyle köşe davalarından emin değilseniz, en azından bir kere sorun.
Frank Hopkins,

11
Bu cevabın özü ile aynı fikirde olsam da, asıl soru “Neden orada olduklarını sormalı mıyım?” Sorusuydu. . Bu cevap OP'nin silmeden önce ekibine sormaması gerektiği izlenimini verebilir.
Doc Brown

58
İlk önce bir adım eklerdim - kullanılmayan kod satırları için git suçlama günlüğünü kontrol et. Onları yazan kişiyi bulabilirseniz, ne için olduklarını sorabilirsiniz. Satırlar yeniyse, birisinin yakında kullanmayı planlaması iyi bir olasılıktır (bu durumda muhtemelen şimdi test edilmelidir).
bdsl

10
Yorumlarda veya diğer cevaplarda ifade edildiği gibi, bu sorunun en çok oy alan ve kabul edilen cevap olduğuna inanamıyorum.
user949300,

11
@Emory Yeni bir takıma başlamanın en iyi yolu, hiç kimsenin ihtiyaç duymadığını düşündüğün için, dikkatsizce silerek yapıyı kırmaktır. 1. günden itibaren popüler olduğunuzu garanti eder. Buna gerek olmayabilir (çünkü her büyük, eski uygulamanın her zaman% 100 kod kapsamı öksürüğü vardır ), ancak bu çok kötü bir yatırım getirisidir.
Voo

55

Diğer tüm cevaplar, söz konusu yöntemlerin gerçekten kullanılmadığı varsayımına dayanmaktadır. Ancak, soru, bu projenin kendi kendine yeterli olup olmadığını veya bir tür kütüphanenin olup olmadığını belirtmedi.

Söz konusu proje bir kütüphane ise, görünüşte kullanılmayan yöntemler projenin dışında kullanılabilir ve bunları kaldırmak diğer projeleri bozabilir. Kütüphanenin kendisi müşterilere satılıyorsa veya kamuya açık hale getiriliyorsa, bu yöntemlerin kullanımını takip etmek bile mümkün olmayabilir.

Bu durumda, dört olasılık vardır:

  • Yöntemler özel veya paket özel ise, güvenle kaldırılabilir.
  • Metotlar halka açıksa, özellikleri eksiksiz olmaları için fiili kullanım olmadan bile gerekçeleri haklı görülebilir. Yine de test edilmeleri gerekir.
  • Metotlar halka açık ve gereksiz ise, bunların kaldırılması zor bir değişiklik olacaktır ve kütüphane anlamsal versiyonlamayı takip ederse , buna yalnızca yeni bir ana versiyonda izin verilir.
  • Alternatif olarak, halka açık yöntemler de kullanımdan kaldırılabilir ve daha sonra kaldırılabilir. Bu, API tüketicilerinin bir sonraki ana sürümde kaldırılmadan önce kullanımdan kaldırılan işlevlerden geçiş yapması için biraz zaman verir.

9
Artı, eğer bir kütüphane ise, fonksiyonlar tam bir
iyilik

Nasıl test edilmeleri gerektiğini açıklayabilir misiniz? Yöntemin neden orada olduğunu bilmiyorsanız, muhtemelen ne yapması gerektiğini bilmiyorsunuzdur.
TKK

Gibi Yöntem isimleri filter_name_exists, ReloadSettingsveya addToSchema(rastgele 3 keyfi açık kaynak projelerinden aldı) yöntemi yapması gerektiğini Sanılanın birkaç ipucu vermelidir. Bir javadoc yorumu daha da faydalı olabilir. Uygun bir şartname değil, biliyorum ama en azından gerilemeyi önleyebilecek birkaç test oluşturmak için yeterli olabilir.
Zoltan

1
Özel bir sınıf veya arabirimdeki genel yöntemler bu amaç için genel olarak kabul edilmemelidir. Benzer şekilde, bir kamu sınıfı özel bir sınıfın içine yerleştirilmişse, bu gerçekten kamuya açık değildir.
emory

31

İlk önce kod kapsamı aracınızın doğru olduğunu kontrol edin.

Arayüze referanslar aracılığıyla çağrılan yöntemlerden ya da sınıfın dinamik olarak bir yere yüklenip yüklenmediğini tespit ettikleri durumlar yaşadım.


Teşekkürler yapacağız. Eclipse'de, işlev için kod tabanında bir arama yapıyorum ve hiçbir şey çıkmıyor. Daha kapsamlı bir arama yapmanın başka önerileri varsa, çok minnettar olurum.
Lucas T,

3
evet, sınıfı bir dll olarak ithal edebilecek diğer projeleri de kontrol etmelisiniz
Ewan

7
Bu cevap eksik geliyor. "İlk önce kod kapsamı aracınızın doğru olduğunu kontrol edin. Eğer öyleyse, o zaman .... [cevabın kalanını girin] ". Spesifik olarak, OP , kod kapsamı aracı doğruysa ne yapılması gerektiğini bilmek ister .
Jon Bentley

1
@ jonbentley OP, araç raporuna en iyi yaklaşımı istiyor. "Elle kontrol et", çünkü bağlamdan oldukça açık bir şekilde anlaşılıyor
Ewan

15

Java statik olarak derlendiğinden, yöntemleri kaldırmak oldukça güvenli olmalıdır. Ölü kodu kaldırmak her zaman iyidir. Onları çalışma zamanında çalıştıran çılgın bir yansıma sistemi olma ihtimali vardır, bu yüzden önce diğer geliştiricilere danışın, ancak bunları kaldırın.


9
İnsanları kontrol etmek için +1, en az sürpriz prensibine uyuyor. Birisinin daha önce birkaç tane işlediğini belirten yöntemi aramak için birisinin çok fazla zaman harcamasını istemiyorsunuz. Ayrıca, bazı son durumlarda ölü kodlar, daha önce kontrol edilmiş ancak henüz herhangi bir yerde kablolu olmayan yeni şeyler olabilir (bu durumda yorumlarla iyi belgelenmeli ve test edilmelidir).
Frax

4
Kod, "kullanılmayan" yöntemleri çağırmak için yansıma kullanmıyorsa, ancak bu durumda çok daha büyük sorunlarınız varsa ve kodu bir failywft.com adresinde görmek için sabırsızlanıyoruz (Herhangi bir kodun bir ClassName olup olmadığını görmek için hızlı bir test yapın. sınıf).
MTilsted

2
Statik olarak derlendi, ama invokedynamictalimat da var , yani, bilirsin ...
corsiKa

@MTilsted: Dizeleri kullanarak kod çağıracak birçok çerçeve var - Kafamın üstünden en azından İlkbahar ve Hazırda Beklet'i düşünebilirim.
jhominal,

9

En iyi yaklaşım ne olurdu? Onlar için birim testleri yaz veya neden orada olduklarını sorguluyor musun?

Kod silmek iyi bir şeydir.

Kodu silemediğinizde , yöntemi kaldırmak için hangi ana yayını hedeflediğinizi belgeleyen @Deprecated olarak işaretleyebilirsiniz . Sonra "sonra" silebilirsiniz. Bu arada, ona bağlı hiçbir yeni kod eklenmemesi gerektiği açık olacaktır.

Kullanımdan kaldırılmış yöntemlere yatırım yapmayı tavsiye etmem - bu yüzden sadece kapsama hedeflerine ulaşmak için yeni birim testleri yapılmaz.

İkisi arasındaki fark, öncelikle yöntemlerin yayınlanmış arayüzün bir parçası olup olmadığıdır . Yayınlanan arayüzün bölümlerini keyfi olarak silmek, arayüze bağlı olan tüketiciler için hoş olmayan bir sürpriz olabilir.

EclEmma ile konuşamıyorum, ama deneyimlerime göre, dikkat etmeniz gereken şeylerden biri yansıma. Örneğin, hangi sınıflara / yöntemlere erişeceğinizi seçmek için metin yapılandırma dosyalarını kullanırsanız, kullanılan / kullanılmayan ayrım açık olmayabilir (bu birleştirilmiş zamanlar tarafından yakıldım).

Projeniz bağımlılık grafiğinde bir yapraksa, kullanımdan kaldırılma durumu zayıflar. Projeniz bir kütüphane ise, kullanımdan kaldırılma durumu daha güçlüdür.

Şirketiniz bir mono repo kullanıyorsa , silme çoklu repo durumundan daha düşük risk taşır.

10b0'da belirtildiği gibi , yöntemler kaynak kontrolünde zaten mevcutsa, silme işleminden sonra bunları geri kazanma işlemi düz ileri bir egzersizdir. Bunu yapmanız gerektiğinden gerçekten endişe duyuyorsanız, taahhütlerinizin nasıl organize edileceğine biraz düşünün, böylece ihtiyaç duyduğunuzda silinen değişiklikleri kurtarabilirsiniz.

Belirsizlik yeterince yüksekse, silmek yerine kodu yorumlamayı düşünebilirsiniz . Mutlu yoldaki (silinen kodun hiçbir zaman geri yüklenmediği) ekstra bir iş, ancak geri yüklemeyi kolaylaştırıyor. Tahminimce, birkaç defa yakılana kadar düz silmeyi tercih etmeniz gerektiği ve bu bağlamda "belirsizliğin" nasıl değerlendirileceği hakkında bazı bilgiler verecek.

neden orada olduklarını sorguluyor?

Lore yakalamaya harcanan zaman mutlaka boşa gitmez. Kaldırma işlemini iki adımda gerçekleştirdiğimi biliyordum - ilk önce kod hakkında ne öğrendiğimizi açıklayan bir yorum ekleyip onaylayarak ve daha sonra kodu (ve yorumu) silerek.

Mimari karar kayıtlarına benzer bir şeyi , kaynak koduyla irfanı yakalamanın bir yolu olarak da kullanabilirsiniz .


9

Bir kod kapsamı aracı her şeyi bilmez, her şeyi görür. Sadece aracı yöntemi denir olmadığını iddia çünkü o anlamına gelmez değil denir. Yansıma var ve dile bağlı olarak yöntemi çağırmanın başka yolları da olabilir. C veya C ++ 'da işlev veya yöntem isimleri oluşturan makrolar olabilir ve araç çağrıyı göremeyebilir. Böylece ilk adım şöyle olacaktır: Yöntem ismi ve ilgili isimler için yazılı bir arama yapın. Deneyimli meslektaşları sorun. Aslında kullanıldığını bulabilirsiniz.

Emin değilseniz, her "kullanılmamış" yöntemin başına bir assert () koyun. Belki denir. Veya bir kayıt ifadesi.

Belki de kod aslında değerlidir. Bir meslektaşın iki haftadır üzerinde çalıştığı ve yarın açacağı yeni bir kod olabilir. Bugün çağrılmadı, çünkü çağrıları yarın eklenecek.

Belki kod aslında 2. bölümdür: Kod, yanlış giden şeyleri bulabilecek çok pahalı çalışma zamanı testleri gerçekleştiriyor olabilir. Kod sadece işler gerçekten yanlış giderse açıktır. Değerli bir hata ayıklama aracını siliyor olabilirsiniz.

İlginç bir şekilde, olası en kötü tavsiye "Sil. Taahhüt et. Unut." en yüksek puan. (Kod incelemeleri? Kod incelemeleri yapmıyorsunuz? Kod incelemeleri yapmazsanız ne yapıyorsunuz?


Saygılarımla, "SİL. KOMİTE. UNUTMA" konusunda en kötü tavsiye olduğu konusunda hemfikir değilim. (Bence en iyisi budur). Yaklaşımınız da iyi. Bence mümkün olan en kötü tavsiye "ölü kodu" kullanan, ancak iddiada bulunmayan birim testleri yazmaktır. Kod kapsamı aracı, kullanıldığını düşünmek için kandırılacak.
emory

3
"Sil. Teslim Et. Unut" yanıtındaki hiçbir şey kod incelemesi yapmamayı söylüyor. İşlendikten sonra (ancak dağıtımdan önce :-)) kodu gözden geçirmek tamamen mümkündür (ve tavsiye edilir, IMHO).
sleske

@sleske Artık bulunmayan kodu nasıl inceliyorsunuz? Bu cevap da "gözden geçirme" den bahsetmiyor.
user949300,

@ user949300: Bir kod değişikliğinin gözden geçirilmesi gerekip gerekmediği ayrı bir sorudur ve kodun eklenmesinden, değiştirilmesinden veya silinmesinden bağımsız olarak (kod eklemek, onu silmekten daha feci olabilir, bkz. örneğin Heartbleed güvenlik açığı). Artı, cevap (şimdi), bir kod incelemesine oldukça yakın bir ses getiren "bir uzman getir" diyor.
sleske,

1
@ user949300: "Artık orada olmayan kodu nasıl gözden geçirirsiniz" - Açık bir şekilde umarım: Seçtiğiniz sürüm kontrol aracındaki değişikliğe bakarak. Değişiklikleri başka nasıl incelersiniz (herhangi bir değişikliği)?
sleske,

6

Yazılımın çalıştığı ortama bağlı olarak, yöntem çağrılırsa günlüğe giriş yapabilirsiniz. Uygun bir süre içinde aranmazsa, yöntem güvenle kaldırılabilir.

Bu, yalnızca yöntemi silmek yerine daha temkinli bir yaklaşımdır ve çok hataya duyarlı bir ortamda çalışıyorsanız faydalı olabilir.

#unreachable-codeKaldırma için her aday için benzersiz bir tanımlayıcı içeren özel bir boşaltma kanalına giriş yapıyoruz ve oldukça etkili olduğu kanıtlandı.



o zaman "uygun bir zaman" daha uzun (her ne kadar "gece yarısından sonra bir adam" gibi olsam da)
Jamie Bull
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.