İlgili olmayan kodu silmeli miyim?


118

Orta büyüklükte (100k satır) bir kod tabanı üzerinde çalışıyorum, hepsi nispeten yeni kod (bir yaşından küçük) ve iyi bir birim test kapsamı var.

Artık herhangi bir yerde kullanılmayan ya da yalnızca belirli bir yöntemi test eden ünite testlerinde başvurulan yöntemler ile karşılaşmaya devam ediyorum.

Artık gerekmediğinden emin olduğumda bu kodu kaldırmalı mıyım?

Çıkarma nedenleri:

  • Daha az kod, daha az hata
  • Daha az kod başkalarının sindirmesi için daha kolaydır
  • Hala kaynak kontrolü altında

Saklamak için nedenler:

  • Referans olarak kullanılabilir
  • Bazen yararlı olabilir
  • Bir sınıfın işlevselliğini 'tamamlamaya' yazılmış olabilir.

22
"Daha az kod, daha az hata" - eğer gerçekten hiç kullanılmamışlarsa,
hataya

19
@Morawski Fakat eğer kalırsa, bir gün kullanılacak. Ve korunmadığı için, içinde böcekler olacak ve sonra ortaya çıkacak.
DJClayworth

9
Genelde ona ve ona bağlı olan testlere yorum yapardım ve sonra da tarih yazıp 'TODO' yorumunu bırakırdım. Bir yıl boyunca kullanılmamışsa, onu çiğnedim. Diğerleri sadece şimdi kaldırmanızı önerir, ancak özellikle de kod bir zamanlar yararlı olmuş gibi görünüyorsa, bunu zor buluyorum.
İş

31
@Job Kod yorumladıysanız kaldırılır. Bahane yok. Yorumlanan kod sadece "Kaynak kontrol sistemimize güvenmiyorum" diye bağırıyor. bana göre.
Kristof Provost

26
@Kristof Provost, artık orada değilse, yararlı kodun bir kez A kaynak dosyasında olduğunu nasıl bilebilirsin? Elbette, bulunduğunuz dosyanın geçmişini her zaman kontrol edebilirsiniz, fakat ne sıklıkta kendiniz düşünüyorsunuz: "Hm ... Burada bir özelliği değiştirmem / uygulamam gerekiyor. Veya bunun nasıl çalıştığını test etmem gerekiyor 5 yıl önce HIZLI. Acaba daha önce uygulanmış mı ve daha sonra sildi mi ... acaba geçmişi kontrol edeyim ". Vb ben dağınık bok etrafında tutulmasını savunuyor değilim, ancak üretimde kodu kullanmayan durumlar vardır, ama yapacak / hata ayıklama için vesileyle gerek olabilir
İş

Yanıtlar:


219

Basitçe tutmak için nedenlerin çoğunu tamamen ilgisiz, basitçe. Kod kullanılmazsa, çöpe atmayın; kaynak kontrolünden önemsiz şekilde elde edilebilecek herhangi bir avantaj. En fazla, onu bulmak için hangi düzeltmeyi söyleyerek bir yorum bırakın.

Oldukça basit, kodu ne kadar çabuk kesersen, o kadar çabuk onu korumak, derlemek ve test etmek için zaman harcamak zorunda kalmazsın. Bu avantajlar, ana hatlarıyla belirttiğiniz ve tümü kaynak kontrolünden elde edilebilecek önemsiz faydaları ağır basmaktadır.


30
Kaldırma konusunda hemfikirim, ancak bir şeyleri "kırılmamış" kodunu yansıma yoluyla kullandığı için kırdığım davalar oldu. Öyleyse, yine de dikkatli olmalısınız.
Şahin

14
@Falcon, insanlar kullanmaya başlamadan ya da herkese açık hale getirme ihtiyacını keşfetmeden önce en kısa zamanda kaldırmak için iyi bir neden.
StuperUser

6
@Falcon: OP'nin kodun kullanılmadığı iddiası.
DeadMG

4
@StuperUser: Kesinlikle katılıyorum. Ancak dikkatli olunmalı ve beklenmeyen durumlara hazırlanmalı.
Falcon

18
Onu çıkarırsanız ve üniteniz ve regresyon testleriniz geçer, ancak ürün arızalanırsa, bazı kod kapsamı araçlarının ayarlanması için güçlü bir durum sağlar.
Andrew T Finnell

43

Çıkarmak için tüm nedenler geçerli.

Saklamak için nedenler:

  • Referans olarak kullanılabilir
  • Bazen yararlı olabilir
  • Bir sınıfın işlevselliğini 'tamamlamaya' yazılmış olabilir.

Tüm bu nedenleri korumak için kaynak kontrolü ile idare edilecektir. Canlı koddan kaldırdığınızda, gerektiğinde / gerektiğinde geri alabilirsiniz.


1
Evet, referans alınmamış kod canlı kodda bırakılmamalıdır.
xdazz

Bana öyle geliyor ki, bu avantajları büyük parçalara yorum yaparak da alabilirsiniz.
Steve Bennett

@SteveBennett Aslında, ama bu cevabın amacını yanlış anlıyorsunuz. Yorumda tutmanın faydalarını sıralıyorum, asıl nokta bu kaynakların hepsinden VE DAHA FAZLA avantajlarından (diğer cevaplarda göreceğiniz) alacağınızdır.
StuperUser

Kesinlikle VCS'ye karşı değilim. :) (Yine de, notların geçerli sürümden kaldırılmasıyla, diğer yaklaşımlardan çok daha az görüldüğüne dikkat çekiyorum, referanssız bir metin dosyasında, wikide, yorumlarda vb. Saklamak gibi ...)
Steve Bennett

@Steve Bennet - Bir dosyanın mevcut sürümündeki yorumlardan "daha az görülebilir" olabilir, ancak tek bir dosyanın VCS geçmişini kontrol etmek önemsizdir ve txt dosyası / wiki / etc'den çok daha kolay olduğunu söyleyebilirim. .. yaklaşımlar.
Zach Lysobey

23

İlgili olmayan kod, bir meşale için bir güne ihtiyaç duymanız durumunda düz, sorta düz olan pilleri saklamakla aynıdır.

Bir çeşit sürüm kontrolü kullandığınız sürece, onu canlı koddan çöpe attığınızı ve yararlı olabileceği durumlarda sürüm tarihçesini kullandığımı söyleyebilirim.


40
Analojinizi biraz geliştirmek için, neredeyse kullanılmış pilleri "kullanılmış ancak bitmemiş piller" etiketli depodaki yeni pillerin yanındaki kutuda tutmak yerine uzaktan kumandanıza bağlı tutmak gibi bir şey.
Scott Whitlock

Artı daha iyi gelişme için 1!
Nicholas Smith

15

Şu anda kullanılmayan kodu saklamak için görebildiğim tek iyi sebep, bağımsız bir modülün parçasıysa: Şu anda kodun bazı kısımları kullanılmasa da gelecekte kullanılır.

Bu, özellikle farklı projeler arasında kullandığınız bir kütüphane için geçerli olabilir: belirli bir proje için ihtiyaç duyduğunuz şeye göre kod parçalarını içeri ve dışarı atmaya devam etmek istemezsiniz: Bu zaman alıcı ve hataya açık buluyorum.

Benim yaklaşımım: (1) bir kez kullanırsanız, gerçekten ihtiyacınız olanı saklayın; (2) iki kez kullanırsanız, ikinci kullanışınızda kopyalayıp uyarlayın; (3) ikiden fazla kullanırsanız, iyi tanımlanmış, sağlam bir modül oluşturun ve bu modülü istediğiniz kadar kullanın.

Özetleme: Kullanılmayan tüm kodları, sizin gibi tasarladığınız ve birkaç kez tekrar kullanacağınızı bildiğiniz genel amaçlı bir modülün parçası olmadığı sürece atardım.

Not : Elbette, daha temiz bir çözüm bir kütüphane için ayrı bir proje yapmak ve projeler arasında bir bağımlılık eklemek olacaktır.


1
Bunun bir örneği olarak, bir bayt dizisi içinde çeşitli büyüklükteki imzalı ve imzasız veri türlerini okuyan ve yazan bazı kütüphane rutinlerim var. Tüm veri tipleri için bu tür rutinlere sahip olmak, şu anda kodun neye ihtiyaç duyduğuna bağlı olarak bazılarının mevcut olması ve bazılarının olmamasından daha temiz görünüyor.
Supercat

11

Genel olarak, bu konuda YAGNI'ye eğilirdim. "İhtiyacınız olmayacak" ise, o zaman kod tabanınızda, birim testlerinizde ve montajlarınızda yer kaplıyor. İhtiyacınız olabilir, ama aynı zamanda tamamen yeniden yazmak zorunda kalabilirsiniz, çünkü şu an ve bunun gibi bir şeye ihtiyacınız olduğunda, çok şey değişebilir.

Ancak, genel tüketim için bir yardımcı program veya API yazarken bu biraz değişir. Tıpkı son kullanıcıların hiçbir zaman istediğiniz şekilde yazılımla etkileşimde bulunmalarını beklemeyeceğiniz gibi, kodunuzun tüketicilerinden de kodunuzu tam olarak düşündüğünüz gibi kullanmalarını istemelerini bekleyemezsiniz. Bu gibi durumlarda, bir yöntemin varlığını "nesnemle etkileşime girmek istemek için geçerli bir yoldur" ile doğrulayabildiğiniz sürece muhtemelen devam etmelidir, çünkü ihtiyacınız olmasa bile, şanslar iyidir. .


8

Kod temeli bir yıldan daha eski olduğu göz önüne alındığında, muhtemelen hala çok fazla akı (evet?) Var - bu nedenle, bazı bitlerin yakın gelecekte yeniden dirilmesi gerekebileceği fikri makul değil.

İlk başta doğru olması zor olan ve yeniden dirilme olasılığı daha yüksek olan bitler için onları sadece kaynak kontrolünden biraz daha "canlı" tutacağım. Millet, var olduklarını bilmeyecek / hatırlamayacak - "onu kaynak kontrolünde bulabilirsin" diyerek orada olduğunu bildiğini / hatırladığını sanıyor! Bu tür durumlarda, itiraz (bir "iddia" (yanlış) "showtopper) veya yorum yapmayı düşünün.


5
'Kaynak kontrolünde bulabilirsin' diyerek +1, orada olduğunu bildiğinizi / hatırladığınızı varsayar! ” - bazen bazı nedenlerden ötürü yardımcı olması için kesilmiş küçük kod hatırlatıcıları buluyorum.
Steven

3

Eğer kod önemsiz ve ilgi çekici değilse, yazılımı gereksiz yere ataletten kurtulmak için atıyorum.

İlginç kod kadavraları için archivesürüm kontrol sistemlerimde bir dal kullanıyorum .


3

"Referans olarak kullanılabilir" Kullanılmayan kodda bırakmak için iyi bir neden olma konusunda hemfikir olmayacağım. Genellikle, kullanılmayan kodun sadece küçük bir kısmı aslında ilginç bir şey gösteriyor. Kullanışlı ancak kullanılmayan kodu belgelemek ve depolamak için birden çok yol vardır.

Sürüm kontrolü, daha sonra kodun gerekli olduğuna karar verirseniz, belirli bir işlevi geri yüklemenizi kolaylaştıracak bir geçmişi içerecek olsa da, önceki revizyonun ne olacağını bilen xy veya z'yi bulmak için sürüm kontrol geçmişine bakmanız gerektiğini bilerek biraz sıkıcı ve ne aradığınızı oldukça özel bir fikriniz yoksa genellikle gözardı edilir.

Kod, ne zaman kaldırıldığına ve neden yalnızca koddan silinmediğine dair bir notla yorumlanabilir. Bununla birlikte, bu genel olarak kötü bir stil olarak kabul edilir ve kullanılmayan ve uygun şekilde korunmayan kod, daha sonra açıklanmayacaksa her türlü hatayı doğurabilir; bu nedenle, genel olarak orta-refaktasyon sırasında geçici hata ayıklama / test etme adımı olarak daha iyidir. üretim kodunu bırakmanın bir yolu.

Gelecekte yararlı görünüyorsa, silinen kodu saklamanın en sevdiğim yolu, kayda değer miktarda silinmiş kodun çeşitli parçalarını içeren ikincil bir başvuru belgesi oluşturmaktır. Her bir kod bloğu, nereden geldiği ya da çıkarıldığı zaman veya kodun en son bulunduğu revizyon numarası gibi hatırlanması gereken herhangi bir şey hakkında kısa bir açıklama ile etiketlenir. Kaldırılan ancak "potansiyel olarak faydalı" olan her şey tek bir yerde, kolayca aranabilir, ancak sürekli olarak sürdürmek ve test etmek için sürekli bir çaba gerektirmez (bu test, kodun yeniden tanıtıldığı herhangi bir noktaya ertelenir).


2

Kullanılmayan yöntemleri kullanmanın iyi bir nedeni de: diğer dallarda / etiketlerde kullanılabilirler!

Çıkarmadan önce tüm aktif dallarınızı ve etiketlerinizi inceleyin.


Bu bana mantıklı değil: o kullanılan değilse bu dalı, çıkarın bu dalı. Başka bir dal kullanıyorsa, orada kalacaktır.
sleske

1

Bir sürüm kontrol sistemi kullanıyorsanız, gelecekteki referanslar için endişelenmeyin, bu kodun geçmişini görebilirsiniz ve silinen kısmı bulabilirsiniz. Bunu yapmazsanız ve bunu birgün kullanılacak olacağını düşünüyorsanız, o zaman sadece orada kalmasına izin, ancak bunu açıklama bu yorumladı neden açıklayan bir bilgi ile.

Ancak, gelecekte kullanmayacağınızdan eminseniz, basitçe kaldırın . Bahsettiğiniz nedenlerin kodun kaldırılması için oldukça kolay olduğunu düşünüyorum.

Ancak lütfen çıkarmadan önce, hiçbir yerde kullanılmadığından emin olun. Visual Studio, tüm çözümü arayan ve geçerli değişken, yöntem, özellik, sınıf, arabirim, vb. İçin herhangi bir referans bulan Tüm Referansları Bul adlı bir özelliğe sahiptir .


1

Göreceli olarak sık sık ihtiyacım olanı yapacak gibi görünecek bir işlev bulma ve uzun zamandır üretimde olduğundan, yalnızca gerçekten kullanılmadığını anlamak için çalışacağına güvenme deneyimim oldu. birkaç yıl. Kullanılmayan kod korunmaz ve yıllar önce çalışmış olsa da, etrafındaki API, güvenemeyeceğiniz kadar değişti.

En iyi ihtimalle, gerçekten hala istediğinizi yaptığından emin olmak için çok zaman harcamak zorundasınız. En kötüsü, daha sonra kötü bir böcekle ısırılıncaya kadar işe yarayacak gibi görünüyor ve daha uzun sürdüğünüz için "üretim tarafından test edilmiş" kodun işe yaradığını varsayıyorsunuz, böylece sorunun yeni kodunuzda başka bir yerde olması gerekiyor. Tecrübelerime göre, kendim için yeni bir fonksiyon yazmak neredeyse her zaman daha hızlı.

Eğer onu silerseniz, ancak görece olarak kısa sürede öğrenirseniz, gerçekten ihtiyacınız var demektir. Kaynak kontrolünde olduğunu hatırlamadığınız çok zaman geçinceye kadar ihtiyacınız yoksa, yine de sıfırdan yazmanız daha iyi olur.


1

Hiçbir şey koddan daha az zaman harcıyor.

Bir kod temeli içine dalmak zorunda kalırsanız, bu kodun ne için kullanıldığını ve hiçbir şey için kullanılmıyorsa daha fazla zamana ihtiyacınız olduğunu anlamak için biraz zamana ihtiyacınız vardır.

Tamam - bu bir yorum olabilir, ama sonra tekrar, herkes bu kullanılmamış kodun neden hala kod tabanında yer aldığına, kaldırılıp kaldırılmayacağına dair bir neden belirleyecektir.

Hiçbir şey olmazsa, kimse zaman kaybetmez.

Doğru yapmak zor olsaydı, bu kodun mevcut olduğuna dair iyi bir belgeye ihtiyacınız var, ancak kod temeli bazı yinelemeler üzerinde gelişirse, yeniden etkinleştirilirse belki de artık çalışmayacak.


1

Kullanılmayan kodu kaldırın - daha az karmaşa, daha iyi anlama. Sürüm kontrol sisteminiz dikkatli olacaktır. Ayrıca, not defterinden daha iyi bir şey kullanıyorsanız, ortamınız başvuru için eski kodu kullanmanızı sağlar.

Eski kodun uzun yorumu rahatsız edici ve gezinmeyi zorlaştırıyor.

Saygılarımızla


1

Bu basit algoritmayı takip edin:

  1. Bir SCM'de yedeklenmiş mi? Eğer öyleyse, 3'e atla.
  2. Bir SCM kurun.
  3. Eşyaları at .

Çıkarma lehine olan tüm puanlarınız geçerlidir.

Bakmak veya geri yüklemek için bir SCM'niz olduğunda, karmaşayı korumayı destekleyen tüm puanlarınız geçersizdir. Aslında, SCM'niz doğru kullanıldığı takdirde neden bu kodun burada ve kullanılmamış olduğunu belirlemenize yardımcı olabilir.

Buna bir sebeple "ölü kod" denir. Bırak ölsün ve huzur içinde yatsın.


0

Kaynak kontrolünde kalacak; aktif kod tabanında kalmamalıdır.

Bunun tek istisnası, kodu tasarımı tamamlarsa ve kodu kullanmıyorken, sonunda kodu genel hale getirmeyi planlıyorsunuzdur ve diğerleri bu temel işlevselliği isteyebilir. Ardından, kodun bu kısımlarının, başkalarının kodun bu kısımlarını kullanmasını nasıl önereceğinizi taklit eden şekilde çalıştığından emin olmak için testler tasarlayın. Ancak, kodu silmeyi bile düşünüyorsanız ve saklamak için sağlam bir neden bulamıyorsanız, gitmesi gerekir. Kullanılmayan kod herkes için daha fazla iş yapar (kodu okumak daha zor; kod kırılabilir; daha fazla iş; vb.)


0

Tecrübelerime göre, kullanılmayan kodları kaldırmak da geri tepebilir. Bu kodu aldığınızı unutabilirsiniz ve tarihte aramayacaksınız. Veya birisinin bu kodu uygulayıp daha sonra sildiğini bile bilmiyor olabilirsiniz. Yine, tarihe bakmayacaksın ...

Hiç şüphesiz, kullanılmayan kodlara sahip olmak kötü bir koku.

GÜNCELLEME: Ed Staub'un çok benzer bir cevap verdiğini fark ettim.

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.