Kodu "kopyalayıp yapıştırmak" neden tehlikelidir? [kapalı]


130

Bazen patronum bize şikayette bulunur:

Bir özelliği uygulamak için neden bu kadar uzun zamana ihtiyacımız var?

Aslında, özellik daha önce başka bir uygulamada uygulanmıştır, sadece oradan kodları kopyalayıp yapıştırmanız gerekir. Maliyet düşük olmalıdır.

Bu gerçekten zor bir soru, çünkü kodları kopyalayıp yapıştırmak benim açımdan o kadar basit bir şey değil.

Teknik olmayan patronunuza bunu açıklamak için iyi nedenleriniz var mı?


19
önceki uygulamalarınızdan yeni bir uygulamaya kod kopyalayıp yapıştırmak yerine, aynı işlevi tekrar tekrar yazıyorsunuz. Bence DRY ilkesi, tüm sistemde aynı işlevselliğe sahip olmamaya yöneliktir, ancak diğer uygulamalardan gelen kodu yeniden kullanmak onu yeniden yazmaktan daha iyidir.
Carson Myers

5
Çünkü kodu her kopyalayıp yapıştırdığınızda bir bebek foku öldürülüyor.
DeadlyChambers

@CarsonMyers Yalnızca bileşen yeniden kullanılabilirse. Ve mevcut bağlama uyması amaçlanmıştır.
Sreekanth Karumanaghat

Yanıtlar:


171

Kopyala-yapıştır kodunuzda bir hata bulursanız, yaptığınız her yerde düzeltmeniz gerekir ve hepsini hatırlayabilmenizi umarsınız (bu aynı zamanda değişen gereksinimler için de geçerlidir).

Mantığı tek bir yerde tutarsanız, gerektiğinde değiştirmek daha kolaydır (yani uygulamanın güncellenmesi gerektiğine karar verirseniz, bunu yalnızca tek bir yerde yaparsınız).

Patronunuzun KURU ilkesini okumasını sağlayın (Kendinizi Tekrar Etmeyin).

Açıkladığınız şey, kodu paylaştığınız ve yalnızca tek bir yerde sakladığınız kitaplıklar için mükemmel kullanım gibi görünüyor .

Kodu kopyalayıp yapıştırırdım , kısa süre sonra yeniden düzenlemeyi düşünürsem - daha sonra ortak kodu çıkardığımdan emin olarak mümkün olduğunca fazla mantığı yeniden kullanabilirim. Ve kısa süre sonra, günler ve haftalar değil, dakikalar ve saatler sonra demek istiyorum.


41
+1. Mesele şu ki, kopyalama ve yapıştırma, acil sorunu çözmek için ucuzdur. Asıl sorun, orta / uzun vadede yinelenen kodu korumanın maliyetinin, iyi faktörlü koddan çok daha yüksek olmasıdır
Paolo

7
Bu sadece bir hata sorunu değildir; program gereksinimleri değişebilir. Daha önce bir şeyin değiştirilmesi gereken beş yerden dördünü değiştirdim.
David Thornley

1
İsteğe bağlı olarak kopyalayıp yapıştırabilirseniz ve kopyaların nerede olduklarını daha sonra özetlemek veya güncellemek için kolayca takip ederseniz, kopyalayıp yapıştırmak kötü bir şey değildir. Daha fazla ayrıntı ve bunu yapabilecek araçlar için www.semanticdesigns.com/Products/Clone adresindeki klon algılama tartışmasına bakın.
Ira Baxter

4
Pek çok ifsşey var ve çoğu alet bu noktada klon algılamayı desteklemiyor.
Oded

2
Bir zamanlar ESA için çalışan bir programcı vardı . Ariane-5 roketi için yazılım üzerinde çalışıyordu ve kopyala-yapıştır yöntemini kullanıyordu. Sonra ... olur
Hauleth

25

Kodu kopyalayıp yapıştırarak kopyalamaktansa bir kitaplık oluşturarak kodu paylaşmanız çok daha iyi olur .

Yine de yeniden yazmaya kıyasla hız avantajı elde edeceksiniz (KURU'ya bakın), ancak kodu korumak için yalnızca bir yeriniz olacak.


1
Merak ediyorum, tek yapmanız gereken onu kopyalamaksa neden kodu "kestiniz"?
dpp

İyi nokta dpp. Düzenlenen!
Sonuçlar

12

Bunun bariz nedeni, gelecek için bir 'borç' almanızdır: kodda yapmanız gereken herhangi bir değişiklik (yalnızca hata düzeltmeleri, herhangi bir değişiklik değil) artık iki yeri güncellemeniz gerektiğinden iki kat daha pahalı olacak - ve daha risklidir çünkü eninde sonunda bunlardan birini unutacaksınız. Başka bir deyişle, şimdi daha hızlı çalışmasını sağlamak, gelecekte işinizi daha da yavaşlatacaktır, bu da iyi bir iş anlayışı olabilir , ancak genellikle değildir.

Ancak daha önemli neden, "bu bununla aynıdır" varsayımının, çoğu zaman ince bir şekilde yanlış olmamasıdır. Kodunuz söylenmemiş varsayımların doğru olmasına bağlı olduğunda, onu başka bir yere kopyalamak, bu varsayımlar yeni yerde de geçerli olmadıkça hatalarla sonuçlanır. Bu nedenle, yapıştırılan kod genellikle bir sonraki değişiklikten sonra değil, başlangıçtan itibaren yanlıştır.


11

Tasarım açısından, kopyalanarak yapıştırılan kod kesinlikle bir felakettir ve gelecekte birçok soruna neden olma potansiyeli vardır. Bu size bir sürü iş alır Ama neden soruyorsun şu anda , cevap: asla sadece kopyalayıp yapıştırarak çünkü.

Orijinal kod, esneklik ve istemci kullanımı göz önünde bulundurularak oldukça bağımsız bir kitaplık olarak yeniden kullanılmak üzere yazılmışsa - o zaman harika, ancak bu kopyalayıp yapıştırma değil, bu bir kod kitaplığı kullanmaktır. Gerçek kod kopyalayıp yapıştırma genellikle şu şekildedir:

  • "Elbette, tam olarak bunu yapan bir kodum zaten var!"
  • "Bir dakika, bu beş kod sürümünden hangisini kaynağım olarak kullanmak istediğim?"
  • "Hmmm, tüm bu 'util_func_023' işlevleri ne işe yarıyor? Onları belgelemedim mi? Şimdi hangisine ihtiyacım var?"
  • "Oh, evet, bu kod Y Kodunu kullanıyor. Sanırım [ birini seçmeliyim: Kod Tabanı Y'nin tamamını yeni projeme kopyalamam / Y Kod Tabanından istediğim tek işlevi çıkarmak için bir gün geçirmem / Kod Tabanından istediğim bir işlev Y]. "
  • "Her şeyi kopyaladım, yaşasın!"
  • "Bu neden çalışmıyor?"
  • Bu, gerçekten başlamak istediğiniz kodu yazmak yerine, istediğiniz şeye benzer mevcut kodda hata ayıklamak için saatler / günler / haftalar harcadığınız noktadır.

Özetle, doğrudan kullanılamayan mevcut kod, en iyi durumda, benzer kod yazmak için iyi bir referans görevi görebilir. Kesinlikle bir bütün olarak kaldırılamaz ve tamamen farklı bir sistemde çalışması beklenemez. Genel olarak, yazılmış ve tamamlanmış herhangi bir kodun, orijinalin kendisi değil bir kopya olsa bile, mümkün olduğunca az karıştırılması gerektiği güvenli bir varsayımdır.

Eğer kopyalama yapıştırma üzerinde proje dayandırmak istiyorsanız, koda var başlamak için , kolaylıkla tekrar kullanılmasını sağlayacak bir tarzda olmaksızın bu orijinal kodu kopyalayıp onunla düşünsen. Bunu yapmaya değer ve patronunuzun beklediği şey buysa, o zaman ikinizin de ilk etapta tasarım ve çalışma şeklinizin bu olduğundan emin olmanız gerekir.


9

kopyalama ve yapıştırma, gerçekleşmeyi bekleyen bir felakettir. Patronunuz, çok kısa bir süre içinde son kullanıcıya bozuk kod gönderilmesi fiyatına göre nakliye fiyatını erken değerlendirmelidir.


9

Zaten özellikleri uygulanmış ve varsa ihtiyaç kopyalamak ve onları yeniden yapıştırmak, size bir şey yanlış yapmış gibi geliyor. Kopyala / yapıştır yapmadan yeniden kullanabilmek için bu özellikleri bir kitaplığa koyamaz mısın?


8

KURU ilkesi (Kendinizi Tekrar Etmeyin): Wikipedia'da KURU .

"Her bilgi parçası, bir sistem içinde tek, açık ve yetkili bir temsile sahip olmalıdır."

diğer bağlantı .


Bu, kulağa çok iyi bir kural gibi gelen "bir erkeğin boğazına asla bıçak saplamaz" demek gibidir. Doktorun, bir insanın hayatını kurtarmak için trakiotomi yapmak için bu kuralı çiğnemesi ZORUNLU olduğunu anlayana kadar (belki anafilaksi, aşırı alerjik reaksiyon nedeniyle nefes alamıyorsa). Her kuralın bir istisnası vardır (belki bunun dışında - her kuralın bir istisnası vardır). Bu nedenle, gerçek cevabın bağlı olduğu gerçek "mühendislik" gerçeği için her kuralın bir neden ve bir zaman ve bir istisna listesi olması gerekir ...
MicroservicesOnDDD

Peki ... ne zaman KURU takip etmiyorsunuz? Firmware ile ilgili mevcut işimde sürekli bununla boğuşuyorum ve cevap şu: "döngüleri açıyoruz" ve "performansı artıran" bu yüzden başka şeyler yapıyoruz. Çok sığ bir miras hiyerarşimiz var ve çoğu sınıfı alt sınıflara ayırmak yerine doğrudan kullanıyoruz ve ... ... çok fazla kopyala ve yapıştır kullanıyoruz. Ve bundan nefret ediyorum, çünkü kod tabanımızın anlaşılmasını ve sürdürülmesini zorlaştırıyor. Ama nedenlerimiz var ve bunlar kabul edilebilir nedenler. Tek paydaş biz değiliz. Ve doğru dengeyi bulmak bir sanattır.
MicroservicesOnDDD

7

Bana teknik olmayan patronunuzun sahip olduğu en kötü yanılgı, işinizin ağırlıklı olarak yazı yazmak olduğu gibi geliyor. Yazmayı ortadan kaldırarak çok zaman kazanabileceğinizi düşünüyorlar.

Bence bu kişiye verebileceğiniz en iyi eğitim, yazmadan yaptığınız tüm işleri belirtmektir. Bu işin çoğu yazarken aynı anda kafanızda görünmez bir şekilde gerçekleşse bile.

Elbette, yazmayı ortadan kaldırmak biraz zaman kazandıracaktır. Ama sonra işinizin çok daha büyük, yazı yazmayan kısmı büyür ve zaman tasarrufu ve dahası daha fazlasını yer.


4

Patronunuzun DRY prensibi, hatalar ve diğer teknik konular hakkında bilgi almak istediğinden emin misiniz?

Bu tür yorumlar genellikle patronunuz veya şirketiniz bir projeyi tamamlamak için gereken zamanı hafife aldığında duyarsınız. Ve yanlış tahmine dayalı olarak bir sözleşme imzalandı vb. Çoğu durumda programcılar tahminlere dahil olmadılar.

Bu neden olur? Bazen proje sponsorunun bütçesi çok küçüktür. Belki de yazılımı kullanarak otomatikleştirdiğiniz bir iş süreci ekip çabanıza değmez. Yöneticiler genellikle bu tür durumlarda kötü haberlere çok kapalı olma eğilimindedir. Projenin başında arzulu bir düşünce var. Daha sonra yöneticiler programcıları suçlamaya çalışır. Sizin durumunuzda dolaylı olarak kopyala ve yapıştır yoluyla. Aşırı durumlarda buna ölüm yürüyüşü denir .


3

Kodu kopyalayıp yapıştırmak genellikle Tesadüfen Programlamaya götürür


Bu makaleyi son derece kötü yazılmış buluyorum. Anlatım soyut kalır, bu nedenle Fred'in yinelemeli çalıştığı gerçeğinin ötesinde vakaya ışık tutmaz. Fred'in sahip olduğu bariz bir sorun, genel mimari hakkında iyi bir fikre sahip olmamasıdır. Maalesef, teknik bilginin kaybolduğu, belgelenmemiş eski kodla çalışırken bu çok sık karşılaşılan bir durumdur. Sözleşmeli Tasarım ve İddialı Programlamaya yapılan atıflar oldukça iyidir, ancak maalesef onlardan sonra bile örnekler / alıştırmalar açıklanmadan bırakılmıştır.
2019

3

Bence burada anahtar " başka bir uygulama ", diğer uygulama zaten test edildiyse ve kullanılıyorsa, ortak bir kitaplık kullanmak için değiştirilmemelidir , bu nedenle onunla kod paylaşamazsınız.

Aynı uygulama içinde , "kopyala ve yapıştır" kötüdür, ancak farklı ekipler tarafından veya farklı yayın döngüleriyle geliştirilen kod tabanları arasında "kopyala ve yapıştır" en iyi seçenek olabilir.


Sadece kitaplığı kullanmak için diğer uygulamaya bir güncelleme yayınlamanın çok az anlamı olduğunu görebiliyor olsam da , bir özellik dalındaki gerekli değişikliklerde en azından bir bıçak atmak muhtemelen iyi bir fikir olacaktır. Bu size, kitaplık arayüzünün en azından söz konusu iki uygulama için yeterince genel olduğuna dair biraz güven verir ve değişikliği yayın döngüsünde uygun bir noktada birleştirmenize olanak tanır.
SamB

2

Benzer bir şirkette çalıştım. Stajyer olarak o zamanlar daha iyi bilmiyordum, bu yüzden yeni bir projeye başladığımda patronum da kodu başka bir yerden yapıştırmayı önerdi. Pekala, düşünebileceğiniz gibi, tüm yazılım oldukça karışıktı, o noktaya kadar bir hatayı düzeltmeye çalıştığınızda, iki yeni hata ortaya çıktı.


2

Diğer uygulama ihtiyacınız olan özelliğe zaten sahip olsa bile, bu özelliğin kodu, büyük bir yeniden yazma olmadan mevcut uygulamanıza uymayabilir. Bir Ford'un motorunu alıp bir Toyota'ya yerleştirmeye çalışmak gibi. Genel olarak, kopyaladığınız kodun% 25'inden fazlasını değiştirmeniz gerekiyorsa, onu sıfırdan yeniden yazmanın daha iyi (daha ucuz) olacağı şeklinde bir genel kural vardır.

Söz konusu kodu bir kitaplığa çıkarmak etkileyici bir ses, ancak diğer sistemin nasıl inşa edildiğine bağlı olarak göründüğünden daha zor olabilir. Örneğin, bu özelliğin kodunun çıkarılması zor olabilir, çünkü diğer birçok kodu temiz olmayan yollarla arabirim oluşturur (örneğin, çok sayıda global değişkene erişerek vb.)


1

Patronunuza her değişken adının eski projenin adını içerdiğini ve şimdi hepsini manuel olarak değiştirmeniz gerektiğini söyleyin. Patronunuz kopyala / yapıştır neden kötü olduğunu bilmiyorsa (veya bilmek istiyorsa) buna inanabilir :)


1

Evet, en büyük sorun sadece kopyalayıp yapıştırmak değil - kopyalayıp yapıştırmak, sonra biraz değiştirmek.

Daha sonra, yapıştırılan varyantlardan birinde bir sorun olduğunda, değiştirilir. Daha sonra başka bir varyant değiştirilir.

Ardından, orijinal kopyada hatalar olduğu için tüm varyantların değişmesi gerektiğini anlarsınız. Şimdi iyi ve gerçekten mahvoldunuz çünkü yapıştırılan tüm alanlar artık aynı değil.

Ve bunu bilmiyor musunuz, bu tür saçma kodlama genellikle neredeyse tamamen yorum içermez.

Benim için fark, aynı şeyi yapan birden fazla kod kopyasına sahip olduğunuzda, sahip olduğunuz şeyin bir grup kod olmasıdır. Her belirli şeyi yapan tek bir kod parçanız olduğunda, o zaman bir sisteminiz olur.

Bir sistemin davranışları tek nokta modifikasyonları ile oldukça kolay bir şekilde değiştirilebilir - bir grup kodun davranışını değiştirmek için bir sürü kod gerekir.

Sistemleri severim, bir grup kodu değil.


1

Önünüzdeki anlık işlevselliğin geliştirme hızı (özellikle uygulama küçük olduğunda) ile uygulama büyüdükçe daha uzun vadeli bakım maliyetleri arasında değiş tokuşlar vardır.

Kopyalama ve yapıştırma, anlık işlevsellik için daha hızlıdır, ancak uygulama boyutu büyüdükçe, hataları düzeltme ve sistem genelinde değişiklikler yapma ve uygulamanın farklı bileşenleri arasındaki iş akışlarını sürdürme açısından size pahalıya mal olacaktır.

İşletme sahiplerinin duyması gereken argüman budur. Bir araç filosunu korumanın kabul edilen maliyetlerine benzer, ancak yazılımla, yazılım mimarisinin bozuk yönleri genellikle iş tarafında gizlidir ve yalnızca geliştiriciler tarafından görülebilir.


0

Ekip daha önce benzer bir işlevsellik uyguladıysa , 2. seferde tekrar etmenin çok daha kolay olacağı konusunda haklı .

Ancak, muhtemelen her uygulamanın farklı olduğunu açıklamalısınız. Eğer birinde bir kapı yüklü Sırf evin içinde başka bir evde başka bir kapı yükleyebilir anlamına gelmez hiçbir zaman düz size (# kapılar yüklü) nedeniyle deneyimin hızlı olacaktır, ama yine de size aleti almak için zaman alacak - , kapıyı monte edin, dik olduğundan emin olun ve çerçeveye vidalayın.


0

Şirketimde her zaman sınıflar ve yöntemlerle çalışıyoruz ve onlar için teknik dokümantasyon yapıyoruz. Daha önce kullanılan yöntem sınıfını bulmak için kendi svn arama uygulamalarınızı iyi tuşlarla birlikte kullanabilirseniz, en iyi uygulama olduğunu düşünüyorum :)

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.